Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFile.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFile.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFile.java	(revision 33659)
@@ -34,5 +34,5 @@
 
         // Remembers the last string read, to handle multiline text (more than 80 chars) with "NEXT" keyword
-        Consumer<String> lastReadString;
+        private Consumer<String> lastReadString;
 
         Block(String type) {
@@ -139,5 +139,5 @@
     }
 
-    public EdigeoFile read(DataSet ds) throws IOException, ReflectiveOperationException {
+    public EdigeoFile read() throws IOException, ReflectiveOperationException {
         try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.ISO_8859_1)) {
             String line;
@@ -207,3 +207,8 @@
         // To be overriden if relevant
     }
+
+    EdigeoFile fill(DataSet ds) {
+        // To be overriden if relevant
+        return this;
+    }
 }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileDIC.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileDIC.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileDIC.java	(revision 33659)
@@ -8,5 +8,4 @@
 import java.util.List;
 
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileDIC.DicBlock;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF.ChildBlock;
@@ -134,4 +133,10 @@
         ObjectDef(Lot lot, String type) {
             super(lot, type);
+        }
+
+        @Override
+        public String toString() {
+            return "ObjectDef [code=" + code + ", charset=" + charset + ", definition=" + definition + ", origin="
+                    + origin + ", type=" + type + ", identifier=" + identifier + ']';
         }
     }
@@ -204,4 +209,11 @@
             return Collections.unmodifiableList(descrs);
         }
+
+        @Override
+        public String toString() {
+            return "AttributeDef [type=" + type + ", unit=" + unit + ", values=" + values + ", descrs=" + descrs
+                    + ", category=" + category + ", code=" + code + ", definition=" + definition + ", origin=" + origin
+                    + ", identifier=" + identifier + ']';
+        }
     }
 
@@ -212,4 +224,10 @@
         RelationDef(Lot lot, String type) {
             super(lot, type);
+        }
+
+        @Override
+        public String toString() {
+            return "RelationDef [category=" + category + ", code=" + code + ", charset=" + charset + ", definition="
+                    + definition + ", origin=" + origin + ", type=" + type + ", identifier=" + identifier + "]";
         }
     }
@@ -230,10 +248,4 @@
     }
 
-    @Override
-    public EdigeoFileDIC read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
-        return this;
-    }
-
     /**
      * Returns list of object definitions.
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEN.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEN.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEN.java	(revision 33659)
@@ -9,5 +9,4 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileGEN.GenBlock;
@@ -182,10 +181,4 @@
     }
 
-    @Override
-    public EdigeoFileGEN read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
-        return this;
-    }
-
     /**
      * Returns the geographic bounds.
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEO.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEO.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEO.java	(revision 33659)
@@ -10,5 +10,4 @@
 
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.Projections;
@@ -349,10 +348,4 @@
     }
 
-    @Override
-    public EdigeoFileGEO read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
-        return this;
-    }
-
     /**
      * Returns the coordinate reference system.
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileQAL.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileQAL.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileQAL.java	(revision 33659)
@@ -8,5 +8,4 @@
 import java.util.List;
 
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileQAL.QalBlock;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF.ChildBlock;
@@ -183,9 +182,3 @@
         lot.qal = this;
     }
-
-    @Override
-    public EdigeoFileQAL read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
-        return this;
-    }
 }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileSCD.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileSCD.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileSCD.java	(revision 33659)
@@ -7,5 +7,4 @@
 import java.util.List;
 
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileDIC.AttributeDef;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileDIC.ObjectDef;
@@ -34,8 +33,10 @@
     abstract static class ScdTaggedDef extends ScdBlock {
         /** AAC */ int nAttributes;
-        /** AAP */ final List<String> attributes = new ArrayList<>();
+        /** AAP */ final List<List<String>> lAttributes = new ArrayList<>();
         /** QAC */ int nQualities;
         // TODO: qualities ?
 
+        final List<McdAttributeDef> attributes = new ArrayList<>();
+
         ScdTaggedDef(Lot lot, String type) {
             super(lot, type);
@@ -46,9 +47,18 @@
             switch (r.name) {
             case "AAC": nAttributes = safeGetInt(r); break;
-            case "AAP": safeGet(r, attributes); break;
+            case "AAP": lAttributes.add(r.values); break;
             case "QAC": nQualities = safeGetInt(r); break;
             default:
                 super.processRecord(r);
             }
+        }
+
+        @Override
+        void resolve() {
+            super.resolve();
+            for (List<String> values : lAttributes) {
+                attributes.add(lot.scd.find(values, McdAttributeDef.class));
+            }
+            lAttributes.clear();
         }
 
@@ -106,4 +116,11 @@
             return super.isValid() && areNotNull(dictRef, kind);
         }
+
+        @Override
+        public String toString() {
+            return "McdObjectDef [dictRef=" + dictRef + ", kind=" + kind + ", nAttributes=" + nAttributes
+                    + ", attributes=" + attributes + ", nQualities=" + nQualities + ", type=" + type + ", identifier="
+                    + identifier + ']';
+        }
     }
 
@@ -144,4 +161,11 @@
             return super.isValid() && areNotNull(dictRef);
         }
+
+        @Override
+        public String toString() {
+            return "McdAttributeDef [dictRef=" + dictRef + ", nMaxChars=" + nMaxChars + ", nMaxDigits=" + nMaxDigits
+                    + ", nMaxExponent=" + nMaxExponent + ", unit=" + unit + ", min=" + min + ", max=" + max + ", type="
+                    + type + ", identifier=" + identifier + ']';
+        }
     }
 
@@ -190,4 +214,10 @@
             return super.isValid() && areNotNull(kind);
         }
+
+        @Override
+        public String toString() {
+            return "McdPrimitiveDef [kind=" + kind + ", nAttributes=" + nAttributes + ", attributes=" + attributes
+                    + ", nQualities=" + nQualities + ", type=" + type + ", identifier=" + identifier + ']';
+        }
     }
 
@@ -250,4 +280,11 @@
             return super.isValid() && areNotNull(dictRef);
         }
+
+        @Override
+        public String toString() {
+            return "McdSemanticRelationDef [dictRef=" + dictRef + ", minCardinal=" + minCardinal + ", maxCardinal="
+                    + maxCardinal + ", scdRef=" + scdRef + ", nOccurences=" + nOccurences + ", attributes=" + attributes
+                    + ", type=" + type + ", identifier=" + identifier + ']';
+        }
     }
 
@@ -259,6 +296,6 @@
         enum RelationKind {
             IS_COMPOSED_OF("ICO"),
-            IS_DISPLAYED_BY("IDB"),
-            IS_DISPLAYED_BY_ARC("IDR"),
+            IS_MADE_OF("IDB"),
+            IS_MADE_OF_ARC("IDR"),
             HAS_FOR_INITIAL_NODE("IND"),
             HAS_FOR_FINAL_NODE("FND"),
@@ -301,4 +338,11 @@
         boolean isValid() {
             return super.isValid() && areNotNull(kind);
+        }
+
+        @Override
+        public String toString() {
+            return "McdConstructionRelationDef [kind=" + kind + ", minCardinal=" + minCardinal + ", maxCardinal="
+                    + maxCardinal + ", scdRef=" + scdRef + ", nOccurences=" + nOccurences + ", attributes=" + attributes
+                    + ", type=" + type + ", identifier=" + identifier + ']';
         }
     }
@@ -320,9 +364,3 @@
         lot.scd = this;
     }
-
-    @Override
-    public EdigeoFileSCD read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
-        return this;
-    }
 }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileTHF.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileTHF.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileTHF.java	(revision 33659)
@@ -226,4 +226,5 @@
         EdigeoFileQAL qal;
         final List<EdigeoFileVEC> vec = new ArrayList<>();
+        final List<EdigeoLotFile<?>> allFiles = new ArrayList<>();
 
         Lot(String type) {
@@ -254,14 +255,13 @@
         }
 
-        void readFiles(Path path, DataSet ds) throws IOException, ReflectiveOperationException {
+        void readFiles(Path path) throws IOException, ReflectiveOperationException {
             Path dir = path.getParent();
-            List<EdigeoFile> allFiles = new ArrayList<>();
-            allFiles.add(new EdigeoFileGEN(this, genId, dir.resolve(name + genName + ".GEN")).read(ds));
-            allFiles.add(new EdigeoFileGEO(this, geoId, dir.resolve(name + geoName + ".GEO")).read(ds));
-            allFiles.add(new EdigeoFileDIC(this, dicId, dir.resolve(name + dicName + ".DIC")).read(ds));
-            allFiles.add(new EdigeoFileSCD(this, scdId, dir.resolve(name + scdName + ".SCD")).read(ds));
-            allFiles.add(new EdigeoFileQAL(this, qalId, dir.resolve(name + qalName + ".QAL")).read(ds));
+            allFiles.add(new EdigeoFileGEN(this, genId, dir.resolve(name + genName + ".GEN")).read());
+            allFiles.add(new EdigeoFileGEO(this, geoId, dir.resolve(name + geoName + ".GEO")).read());
+            allFiles.add(new EdigeoFileDIC(this, dicId, dir.resolve(name + dicName + ".DIC")).read());
+            allFiles.add(new EdigeoFileSCD(this, scdId, dir.resolve(name + scdName + ".SCD")).read());
+            allFiles.add(new EdigeoFileQAL(this, qalId, dir.resolve(name + qalName + ".QAL")).read());
             for (int i = 0; i < getNumberOfGeoData(); i++) {
-                allFiles.add(new EdigeoFileVEC(this, vecId.get(i), dir.resolve(name + vecName.get(i) + ".VEC")).read(ds));
+                allFiles.add(new EdigeoFileVEC(this, vecId.get(i), dir.resolve(name + vecName.get(i) + ".VEC")).read());
             }
             allFiles.forEach(EdigeoFile::resolve);
@@ -276,4 +276,8 @@
         }
 
+        void fill(DataSet ds) {
+            allFiles.forEach(f -> f.fill(ds));
+        }
+
         @Override
         boolean isValid() {
@@ -472,9 +476,18 @@
 
     @Override
-    public EdigeoFileTHF read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
+    public EdigeoFileTHF read() throws IOException, ReflectiveOperationException {
+        super.read();
         for (Lot lot : getLots()) {
-            lot.readFiles(path, ds);
+            lot.readFiles(path);
+        }
+        return this;
+    }
+
+    @Override
+    public EdigeoFileTHF fill(DataSet ds) {
+        super.fill(ds);
+        for (Lot lot : getLots()) {
             //ds.addDataSource(new DataSource(lot.gen.getGeoBounds().getBounds(), support.author));
+            lot.fill(ds);
         }
         return this;
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 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java	(revision 33659)
@@ -9,4 +9,6 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -15,13 +17,20 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.McdAttributeDef;
+import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.McdConstructionRelationDef;
+import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.McdConstructionRelationDef.RelationKind;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.McdObjectDef;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.McdPrimitiveDef;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.McdRelationDef;
+import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.McdSemanticRelationDef;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.ScdBlock;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF.ChildBlock;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF.Lot;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileVEC.VecBlock;
+import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoRecord.Nature;
 
 /**
@@ -31,17 +40,20 @@
 
     abstract static class VecBlock<T extends ScdBlock> extends ChildBlock {
-        final Class<T> klass;
+        private final Class<T> klass;
+        private final List<RelationBlock> parentRelations = new ArrayList<>();
 
         /** SCP */ T scdRef;
         /** ATC */ int nAttributes;
-        /** ATP */ final List<String> attributeDefs = new ArrayList<>();
+        /** ATP */ final List<McdAttributeDef> attributeDefs = new ArrayList<>();
         /** TEX */ EdigeoCharset charset;
-        /** ATV */ final List<String> attributeValues = new ArrayList<>();
+        /** ATV */ final List<EdigeoRecord> lAttributeValues = new ArrayList<>();
         /** QAC */ int nQualities;
         /** QAP */ final List<String> qualityIndics = new ArrayList<>();
 
+        final List<String> attributeValues = new ArrayList<>();
+
         VecBlock(Lot lot, String type, Class<T> klass) {
             super(lot, type);
-            this.klass = klass;
+            this.klass = Objects.requireNonNull(klass, "klass");
         }
 
@@ -51,7 +63,7 @@
             case "SCP": scdRef = lot.scd.find(r.values, klass); break;
             case "ATC": nAttributes = safeGetInt(r); break;
-            case "ATP": safeGet(r, attributeDefs); break;
+            case "ATP": attributeDefs.add(lot.scd.find(r.values, McdAttributeDef.class)); break;
             case "TEX": safeGet(r, s -> charset = EdigeoCharset.of(s)); break;
-            case "ATV": safeGet(r, attributeValues); break;
+            case "ATV": lAttributeValues.add(r); break;
             case "QAC": nQualities = safeGetInt(r); break;
             case "QAP": safeGet(r, qualityIndics); break;
@@ -62,8 +74,34 @@
 
         @Override
+        void resolve() {
+            super.resolve();
+            for (EdigeoRecord r : lAttributeValues) {
+                if (r.nature == Nature.COMPOSED) {
+                    //attributeValues.add(lot.scd.find(r.values, McdAttributeDef.class).dictRef);
+                    attributeValues.add(r.values.toString()); // FIXME
+                } else {
+                    attributeValues.add(r.values.get(0));
+                }
+            }
+            lAttributeValues.clear();
+        }
+
+        @Override
         boolean isValid() {
             return super.isValid() && areNotNull(scdRef)
                     && areSameSize(nAttributes, attributeDefs, attributeValues)
                     && areSameSize(nQualities, qualityIndics);
+        }
+
+        final boolean addRelation(RelationBlock relationBlock) {
+            return parentRelations.add(Objects.requireNonNull(relationBlock, "relationBlock"));
+        }
+
+        public final List<RelationBlock> getConstructionRelations() {
+            return parentRelations.stream().filter(r -> r.scdRef instanceof McdConstructionRelationDef).collect(Collectors.toList());
+        }
+
+        public final List<RelationBlock> getSemanticRelations() {
+            return parentRelations.stream().filter(r -> r.scdRef instanceof McdSemanticRelationDef).collect(Collectors.toList());
         }
     }
@@ -129,4 +167,9 @@
         }
 
+        @Override
+        public String toString() {
+            return "NodeBlock [identifier=" + identifier + ']';
+        }
+
         /**
          * Returns the reference to SCD.
@@ -206,9 +249,19 @@
             switch (r.name) {
             case "TYP": arcType = ArcType.of(safeGetInt(r)); break;
-            case "PTC": nPoints = safeGetInt(r); assert checkNumberOfPoints(); break;
+            case "PTC": nPoints = safeGetInt(r); break;
             case "COR": points.add(safeGetEastNorth(r)); break;
             default:
                 super.processRecord(r);
             }
+        }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(arcType) && checkNumberOfPoints() && areSameSize(nPoints, points);
+        }
+
+        @Override
+        public String toString() {
+            return "ArcBlock [identifier=" + identifier + ']';
         }
 
@@ -231,4 +284,9 @@
             super(lot, type, McdPrimitiveDef.class);
         }
+
+        @Override
+        public String toString() {
+            return "FaceBlock [identifier=" + identifier + ']';
+        }
     }
 
@@ -250,4 +308,9 @@
                 super.processRecord(r);
             }
+        }
+
+        @Override
+        public String toString() {
+            return "ObjectBlock [identifier=" + identifier + ']';
         }
     }
@@ -307,8 +370,10 @@
         @Override
         final void resolve() {
+            super.resolve();
             for (List<String> values : lElements) {
                 VecBlock<?> b = lot.vec.stream().filter(v -> v.subsetId.equals(values.get(1))).findAny()
                         .orElseThrow(() -> new IllegalArgumentException(values.toString()))
                         .find(values, VecBlock.class);
+                b.addRelation(this);
                 elements.add(b);
                 compositions.put(b, mCompositions.get(values));
@@ -316,4 +381,9 @@
             lElements.clear();
             mCompositions.clear();
+        }
+
+        @Override
+        public String toString() {
+            return "RelationBlock [identifier=" + identifier + ']';
         }
     }
@@ -353,28 +423,73 @@
 
     @Override
-    public EdigeoFileVEC read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
+    EdigeoFileVEC fill(DataSet ds) {
+        super.fill(ds);
         Projection proj = lot.geo.getCoorReference().getProjection();
-        // Nodes
-        for (NodeBlock nb : getNodes()) {
-            assert nb.nAttributes == 0 : nb;
-            assert nb.nQualities == 0 : nb;
-            LatLon ll = proj.eastNorth2latlon(nb.getCoordinate());
-            if (ds.searchNodes(around(ll)).isEmpty()) {
-                ds.addPrimitive(new Node(ll));
-            }
-        }
-        // Arcs
-        for (ArcBlock ab : getArcs()) {
-            assert ab.nAttributes == 0 : ab;
-            assert ab.nQualities == 0 : ab;
-            assert ab.nPoints >= 2 : ab;
-            Way w = new Way();
-            for (EastNorth en : ab.points) {
-                w.addNode(getNodeAt(ds, proj, en));
-            }
-            ds.addPrimitive(w);
+        for (ObjectBlock obj : getObjects()) {
+            List<RelationBlock> constructionRelations = obj.getConstructionRelations();
+            switch (obj.scdRef.kind) {
+            case POINT: fillPoint(ds, proj, obj, constructionRelations); break;
+            case LINE: fillLine(ds, proj, obj, constructionRelations); break;
+            case COMPLEX: break; // TODO
+            case AREA: break; // TODO
+            default: throw new IllegalArgumentException(obj.toString());
+            }
         }
         return this;
+    }
+
+    private static void addPrimitiveAndTags(DataSet ds, ObjectBlock obj, OsmPrimitive osm) {
+        for (int i = 0; i < obj.nAttributes; i++) {
+            osm.put(new Tag(obj.attributeDefs.get(i).identifier, obj.attributeValues.get(i)));
+        }
+        ds.addPrimitive(osm);
+    }
+
+    private static void fillPoint(DataSet ds, Projection proj, ObjectBlock obj, List<RelationBlock> constructionRelations) {
+        assert constructionRelations.size() == 1 : constructionRelations;
+        RelationBlock rel = constructionRelations.get(0);
+        assert rel.scdRef instanceof McdConstructionRelationDef : rel;
+        if (rel.scdRef instanceof McdConstructionRelationDef) {
+            McdConstructionRelationDef crd = (McdConstructionRelationDef) rel.scdRef;
+            assert crd.kind == RelationKind.IS_MADE_OF;
+            assert crd.nAttributes == 0;
+        }
+        for (VecBlock<?> e : rel.elements) {
+            if (e instanceof NodeBlock) {
+                NodeBlock nb = (NodeBlock) e;
+                assert nb.nAttributes == 0;
+                LatLon ll = proj.eastNorth2latlon(nb.getCoordinate());
+                //if (ds.searchNodes(around(ll)).isEmpty()) {
+                addPrimitiveAndTags(ds, obj, new Node(ll));
+                //}
+                break;
+            }
+        }
+    }
+
+    private static void fillLine(DataSet ds, Projection proj, ObjectBlock obj, List<RelationBlock> constructionRelations) {
+        assert constructionRelations.size() >= 1 : constructionRelations;
+        // TODO sort relations
+        Way w = new Way();
+        for (RelationBlock rel : constructionRelations) {
+            assert rel.scdRef instanceof McdConstructionRelationDef : rel;
+            if (rel.scdRef instanceof McdConstructionRelationDef) {
+                McdConstructionRelationDef crd = (McdConstructionRelationDef) rel.scdRef;
+                assert crd.kind == RelationKind.IS_MADE_OF_ARC;
+                assert crd.nAttributes == 0;
+            }
+            for (VecBlock<?> e : rel.elements) {
+                if (e instanceof ArcBlock) {
+                    ArcBlock ab = (ArcBlock) e;
+                    assert ab.nAttributes == 0 : ab;
+                    assert ab.nQualities == 0 : ab;
+                    for (EastNorth en : ab.points) {
+                        w.addNode(getNodeAt(ds, proj, en));
+                    }
+                }
+            }
+        }
+        assert w.getNodesCount() >= 2;
+        addPrimitiveAndTags(ds, obj, w);
     }
 
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoLotFile.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoLotFile.java	(revision 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoLotFile.java	(revision 33659)
@@ -10,5 +10,4 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF.ChildBlock;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF.Lot;
@@ -46,6 +45,6 @@
 
     @Override
-    public EdigeoLotFile<B> read(DataSet ds) throws IOException, ReflectiveOperationException {
-        super.read(ds);
+    public EdigeoLotFile<B> read() throws IOException, ReflectiveOperationException {
+        super.read();
         return this;
     }
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 33658)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java	(revision 33659)
@@ -41,5 +41,5 @@
         DataSet data = new DataSet();
         data.setUploadPolicy(UploadPolicy.DISCOURAGED);
-        EdigeoFileTHF thf = new EdigeoFileTHF(path).read(data);
+        EdigeoFileTHF thf = new EdigeoFileTHF(path).read().fill(data);
         data.setName(thf.getSupport().getBlockIdentifier());
         return data;
