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 33644)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFile.java	(revision 33645)
@@ -11,5 +11,7 @@
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 import java.util.Objects;
+import java.util.function.Consumer;
 
 import org.openstreetmap.josm.tools.Logging;
@@ -27,5 +29,8 @@
     static class Block {
         /** RTY */ final String type;
-        /** RID */ String identifier;
+        /** RID */ String identifier = "";
+
+        // Remembers the last string read, to handle multiline text (more than 80 chars) with "NEXT" keyword
+        Consumer<String> lastReadString;
 
         Block(String type) {
@@ -33,9 +38,9 @@
         }
 
-        public final String getType() {
+        public final String getBlockType() {
             return type;
         }
 
-        public final String getIdentifier() {
+        public final String getBlockIdentifier() {
             return identifier;
         }
@@ -43,8 +48,46 @@
         void processRecord(EdigeoRecord r) {
             if ("RID".equals(r.name)) {
-                identifier = safeGetAndLog(r, tr("Identifier"));
+                safeGetAndLog(r, s -> identifier += s, tr("Identifier"));
+            } else if ("NEX".equals(r.name) && lastReadString != null) {
+                safeGet(r, lastReadString);
             } else {
                 throw new IllegalArgumentException(r.toString());
             }
+        }
+
+        protected void safeGet(EdigeoRecord r, List<String> list) {
+            safeGet(r, s -> {
+                int idx = list.size() - 1;
+                list.set(idx, list.get(idx) + s);
+            });
+        }
+
+        protected void safeGet(EdigeoRecord r, Consumer<String> callback) {
+            (lastReadString = callback).accept(r.length > 0 ? r.values.get(0) : null);
+        }
+
+        protected int safeGetInt(EdigeoRecord r) {
+            return r.length > 0 ? Integer.parseInt(r.values.get(0)) : 0;
+        }
+
+        protected LocalDate safeGetDate(EdigeoRecord r) {
+            return r.length > 0 ? LocalDate.parse(r.values.get(0), dateFormatter) : null;
+        }
+
+        protected void safeGetAndLog(EdigeoRecord r, Consumer<String> callback, String msg) {
+            if (r.length > 0) {
+                String v = r.values.get(0);
+                Logging.info(msg + ": " + v);
+                (lastReadString = callback).accept(v);
+            }
+        }
+
+        protected LocalDate safeGetDateAndLog(EdigeoRecord r, String msg) {
+            if (r.length > 0) {
+                LocalDate v = LocalDate.parse(r.values.get(0), dateFormatter);
+                Logging.info(msg + ": " + v);
+                return v;
+            }
+            return null;
         }
     }
@@ -116,33 +159,3 @@
         currentBlock.processRecord(r);
     }
-
-    protected static String safeGet(EdigeoRecord r) {
-        return r.length > 0 ? r.values.get(0) : null;
-    }
-
-    protected static int safeGetInt(EdigeoRecord r) {
-        return r.length > 0 ? Integer.parseInt(r.values.get(0)) : 0;
-    }
-
-    protected static LocalDate safeGetDate(EdigeoRecord r) {
-        return r.length > 0 ? LocalDate.parse(r.values.get(0), dateFormatter) : null;
-    }
-
-    protected static String safeGetAndLog(EdigeoRecord r, String msg) {
-        if (r.length > 0) {
-            String v = r.values.get(0);
-            Logging.info(msg + ": " + v);
-            return v;
-        }
-        return null;
-    }
-
-    protected static LocalDate safeGetDateAndLog(EdigeoRecord r, String msg) {
-        if (r.length > 0) {
-            LocalDate v = LocalDate.parse(r.values.get(0), dateFormatter);
-            Logging.info(msg + ": " + v);
-            return v;
-        }
-        return null;
-    }
 }
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 33644)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileDIC.java	(revision 33645)
@@ -4,4 +4,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 /**
@@ -11,4 +14,156 @@
 
     /**
+     * Abstract definition.
+     */
+    abstract static class Def extends Block {
+
+        /** LAB */ String code = "";
+        /** TEX */ EdigeoCharset charset;
+        /** DEF */ String definition = "";
+        /** ORI */ String origin = "";
+        /** CAT */ String category = "";
+
+        Def(String type) {
+            super(type);
+        }
+
+        @Override
+        void processRecord(EdigeoRecord r) {
+            switch (r.name) {
+            case "LAB": safeGet(r, s -> code += s); break;
+            case "TEX": safeGet(r, s -> charset = EdigeoCharset.of(s)); break;
+            case "DEF": safeGet(r, s -> definition += s); break;
+            case "ORI": safeGet(r, s -> origin += s); break;
+            case "CAT": safeGet(r, s -> category += s); break;
+            default:
+                super.processRecord(r);
+            }
+        }
+
+        /**
+         * Returns code.
+         * @return code
+         */
+        public final String getCode() {
+            return code;
+        }
+
+        /**
+         * Returns definition.
+         * @return definition
+         */
+        public final String getDefinition() {
+            return definition;
+        }
+
+        /**
+         * Returns definition source.
+         * @return definition source
+         */
+        public final String getOrigin() {
+            return origin;
+        }
+
+        /**
+         * Returns category.
+         * @return category
+         */
+        public final String getCategory() {
+            return category;
+        }
+    }
+
+    /**
+     * Object definition.
+     */
+    public static class ObjectDef extends Def {
+        ObjectDef(String type) {
+            super(type);
+        }
+    }
+
+    /**
+     * Attribute definition.
+     */
+    public static class AttributeDef extends Def {
+
+        /** TYP */ String type = "";
+        /** UNI */ String unit = "";
+        /** AVC */ int nValues;
+        /** AVL */ final List<String> values = new ArrayList<>();
+        /** AVD */ final List<String> descrs = new ArrayList<>();
+
+        AttributeDef(String type) {
+            super(type);
+        }
+
+        @Override
+        void processRecord(EdigeoRecord r) {
+            switch (r.name) {
+            case "TYP": safeGet(r, s -> type += s); break;
+            case "UNI": safeGet(r, s -> unit += s); break;
+            case "AVC": nValues = safeGetInt(r); break;
+            case "AVL": values.add(""); safeGet(r, values); break;
+            case "AVD": descrs.add(""); safeGet(r, descrs); break;
+            default:
+                super.processRecord(r);
+            }
+        }
+
+        /**
+         * Returns attribute type.
+         * @return attribute type
+         */
+        public final String getType() {
+            return type;
+        }
+
+        /**
+         * Returns default unit.
+         * @return default unit
+         */
+        public final String getUnit() {
+            return unit;
+        }
+
+        /**
+         * Returns number of values.
+         * @return number of values
+         */
+        public final int getNumberOfValues() {
+            return nValues;
+        }
+
+        /**
+         * Returns pre-coded values.
+         * @return pre-coded values
+         */
+        public final List<String> getValues() {
+            return Collections.unmodifiableList(values);
+        }
+
+        /**
+         * Returns descriptions of pre-coded values.
+         * @return descriptions of pre-coded values
+         */
+        public final List<String> getDescriptions() {
+            return Collections.unmodifiableList(descrs);
+        }
+    }
+
+    /**
+     * Relation definition.
+     */
+    public static class RelationDef extends Def {
+        RelationDef(String type) {
+            super(type);
+        }
+    }
+
+    /** DID */ List<ObjectDef> objects;
+    /** DIA */ List<AttributeDef> attributes;
+    /** DIR */ List<RelationDef> relations;
+
+    /**
      * Constructs a new {@code EdigeoFileDIC}.
      * @param path path to DIC file
@@ -20,8 +175,52 @@
 
     @Override
+    protected void init() {
+        objects = new ArrayList<>();
+        attributes = new ArrayList<>();
+        relations = new ArrayList<>();
+    }
+
+    @Override
     protected Block createBlock(String type) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
+        switch (type) {
+        case "DID":
+            ObjectDef objDef = new ObjectDef(type);
+            objects.add(objDef);
+            return objDef;
+        case "DIA":
+            AttributeDef attDef = new AttributeDef(type);
+            attributes.add(attDef);
+            return attDef;
+        case "DIR":
+            RelationDef relDef = new RelationDef(type);
+            relations.add(relDef);
+            return relDef;
+        default:
+            throw new IllegalArgumentException(type);
+        }
+    }
+
+    /**
+     * Returns list of object definitions.
+     * @return list of object definitions
+     */
+    public final List<ObjectDef> getObjects() {
+        return Collections.unmodifiableList(objects);
+    }
+
+    /**
+     * Returns list of attribute definitions.
+     * @return list of attribute definitions
+     */
+    public final List<AttributeDef> getAttributes() {
+        return Collections.unmodifiableList(attributes);
+    }
+
+    /**
+     * Returns list of relation definitions.
+     * @return list of relation definitions
+     */
+    public final List<RelationDef> getRelations() {
+        return Collections.unmodifiableList(relations);
+    }
 }
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 33644)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEN.java	(revision 33645)
@@ -16,6 +16,6 @@
      */
     public static class GeoBounds extends Block {
-        String cm1;
-        String cm2;
+        /** CM1 */ String min = "";
+        /** CM2 */ String max = "";
 
         GeoBounds(String type) {
@@ -26,6 +26,6 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "CM1": cm1 = safeGet(r); break;
-            case "CM2": cm2 = safeGet(r); break;
+            case "CM1": safeGet(r, s -> min += s); break;
+            case "CM2": safeGet(r, s -> max += s); break;
             default:
                 super.processRecord(r);
@@ -37,6 +37,6 @@
          * @return the minimal coordinates
          */
-        public final String getCm1() {
-            return cm1;
+        public final String getMinCm1() {
+            return min;
         }
 
@@ -45,6 +45,6 @@
          * @return the maximal coordinates
          */
-        public final String getCm2() {
-            return cm2;
+        public final String getMaxCm2() {
+            return max;
         }
     }
@@ -80,7 +80,7 @@
         }
 
-        String information;
-        Structure structure;
-        String offsetId;
+        /** INF */ String information = "";
+        /** STR */ Structure structure;
+        /** REG */ String offsetId = "";
 
         GeoData(String type) {
@@ -91,7 +91,7 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "INF": information = safeGetAndLog(r, tr("Information")); break;
+            case "INF": safeGetAndLog(r, s -> information += s, tr("Information")); break;
             case "STR": structure = Structure.of(safeGetInt(r)); break;
-            case "REG": offsetId = safeGet(r); break;
+            case "REG": safeGet(r, s -> offsetId += s); break;
             default:
                 super.processRecord(r);
@@ -124,6 +124,6 @@
     }
 
-    GeoBounds bounds;
-    GeoData geodata;
+    /** DEG */ GeoBounds bounds;
+    /** GSE */ GeoData geodata;
 
     /**
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 33644)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileGEO.java	(revision 33645)
@@ -56,10 +56,10 @@
         }
 
-        ReferenceType type;
-        String name;
-        String code;
-        int nDim;
-        AltitudeSystem altitudeSystem;
-        String unit;
+        /** RET */ ReferenceType type;
+        /** REN */ String name = "";
+        /** REL */ String code = "";
+        /** DIM */ int nDim;
+        /** ALS */ AltitudeSystem altitudeSystem;
+        /** UNH */ String unit = "";
 
         CoorReference(String type) {
@@ -70,10 +70,10 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "RET": type = ReferenceType.of(safeGet(r)); break;
-            case "REN": name = safeGetAndLog(r, tr("Projection")); break;
-            case "REL": code = safeGetAndLog(r, tr("Projection")); break;
+            case "RET": safeGet(r, s -> type = ReferenceType.of(s)); break;
+            case "REN": safeGetAndLog(r, s -> name += s, tr("Projection")); break;
+            case "REL": safeGetAndLog(r, s -> code += s, tr("Projection")); break;
             case "DIM": nDim = safeGetInt(r); break;
             case "ALS": altitudeSystem = AltitudeSystem.of(safeGetInt(r)); break;
-            case "UNH": unit = safeGet(r); break;
+            case "UNH": safeGet(r, s -> unit += s); break;
             default:
                 super.processRecord(r);
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 33644)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileTHF.java	(revision 33645)
@@ -45,16 +45,16 @@
         }
 
-        /** AUT */ String author;
-        /** ADR */ String recipient;
+        /** AUT */ String author = "";
+        /** ADR */ String recipient = "";
         /** LOC */ int nLots;
         /** VOC */ int nVolumes;
         /** SEC */ SecurityClassification security;
-        /** RDI */ String diffusionRestriction;
-        /** VER */ String edigeoVersion;
+        /** RDI */ String diffusionRestriction = "";
+        /** VER */ String edigeoVersion = "";
         /** VDA */ LocalDate edigeoDate;
-        /** TRL */ String transmissionName;
+        /** TRL */ String transmissionName = "";
         /** EDN */ int transmissionEdition;
         /** TDA */ LocalDate transmissionDate;
-        /** INF */ String transmissionInformation;
+        /** INF */ String transmissionInformation = "";
 
         Support(String type) {
@@ -65,16 +65,16 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "AUT": author = safeGetAndLog(r, tr("Author")); break;
-            case "ADR": recipient = safeGetAndLog(r, tr("Recipient")); break;
+            case "AUT": safeGetAndLog(r, s -> author += s, tr("Author")); break;
+            case "ADR": safeGetAndLog(r, s -> recipient += s, tr("Recipient")); break;
             case "LOC": nLots = safeGetInt(r); break;
             case "VOC": nVolumes = safeGetInt(r); break;
             case "SEC": security = SecurityClassification.of(safeGetInt(r)); break;
-            case "RDI": diffusionRestriction = safeGetAndLog(r, tr("Diffusion restriction")); break;
-            case "VER": edigeoVersion = safeGet(r); break;
+            case "RDI": safeGetAndLog(r, s -> diffusionRestriction += s, tr("Diffusion restriction")); break;
+            case "VER": safeGet(r, s -> edigeoVersion += s); break;
             case "VDA": edigeoDate = safeGetDate(r); break;
-            case "TRL": transmissionName = safeGet(r); break;
+            case "TRL": safeGet(r, s -> transmissionName += s); break;
             case "EDN": transmissionEdition = safeGetInt(r); break;
             case "TDA": transmissionDate = safeGetDateAndLog(r, tr("Date")); break;
-            case "INF": transmissionInformation = safeGetAndLog(r, tr("Information")); break;
+            case "INF": safeGetAndLog(r, s -> transmissionInformation += s, tr("Information")); break;
             default:
                 super.processRecord(r);
@@ -184,16 +184,16 @@
     public static class Lot extends Block {
 
-        /** LON */ String name;
-        /** INF */ String information;
-        /** GNN */ String genDataName;
-        /** GNI */ String genDataId;
-        /** GON */ String coorRefName;
-        /** GOI */ String coorRefId;
-        /** QAN */ String qualityName;
-        /** QAI */ String qualityId;
-        /** DIN */ String dictName;
-        /** DII */ String dictId;
-        /** SCN */ String scdName;
-        /** SCI */ String scdId;
+        /** LON */ String name = "";
+        /** INF */ String information = "";
+        /** GNN */ String genDataName = "";
+        /** GNI */ String genDataId = "";
+        /** GON */ String coorRefName = "";
+        /** GOI */ String coorRefId = "";
+        /** QAN */ String qualityName = "";
+        /** QAI */ String qualityId = "";
+        /** DIN */ String dictName = "";
+        /** DII */ String dictId = "";
+        /** SCN */ String scdName = "";
+        /** SCI */ String scdId = "";
         /** GDC */ int nGeoData;
         /** GDN */ final List<String> geoDataName = new ArrayList<>();
@@ -207,19 +207,19 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "LON": name = safeGetAndLog(r, tr("Name")); break;
-            case "INF": information = safeGetAndLog(r, tr("Information")); break;
-            case "GNN": genDataName = safeGet(r); break;
-            case "GNI": genDataId = safeGet(r); break;
-            case "GON": coorRefName = safeGet(r); break;
-            case "GOI": coorRefId = safeGet(r); break;
-            case "QAN": qualityName = safeGet(r); break;
-            case "QAI": qualityId = safeGet(r); break;
-            case "DIN": dictName = safeGet(r); break;
-            case "DII": dictId = safeGet(r); break;
-            case "SCN": scdName = safeGet(r); break;
-            case "SCI": scdId = safeGet(r); break;
+            case "LON": safeGetAndLog(r, s -> name += s, tr("Name")); break;
+            case "INF": safeGetAndLog(r, s -> information += s, tr("Information")); break;
+            case "GNN": safeGet(r, s -> genDataName += s); break;
+            case "GNI": safeGet(r, s -> genDataId += s); break;
+            case "GON": safeGet(r, s -> coorRefName += s); break;
+            case "GOI": safeGet(r, s -> coorRefId += s); break;
+            case "QAN": safeGet(r, s -> qualityName += s); break;
+            case "QAI": safeGet(r, s -> qualityId += s); break;
+            case "DIN": safeGet(r, s -> dictName += s); break;
+            case "DII": safeGet(r, s -> dictId += s); break;
+            case "SCN": safeGet(r, s -> scdName += s); break;
+            case "SCI": safeGet(r, s -> scdId += s); break;
             case "GDC": nGeoData = safeGetInt(r); break;
-            case "GDN": geoDataName.add(safeGet(r)); break;
-            case "GDI": geoDataId.add(safeGet(r)); break;
+            case "GDN": geoDataName.add(""); safeGet(r, geoDataName); break;
+            case "GDI": geoDataId.add(""); safeGet(r, geoDataId); break;
             default:
                 super.processRecord(r);
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoRecord.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoRecord.java	(revision 33644)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoRecord.java	(revision 33645)
@@ -76,5 +76,7 @@
             assert line.length() <= 80;
             values = Arrays.asList(line.substring(8).split(";"));
-            assert (nature == Nature.SIMPLE && values.size() == 1) || (nature == Nature.COMPOSED && values.size() > 1) : line;
+            assert nature == Nature.RESERVED
+                    || (nature == Nature.SIMPLE && values.size() == 1)
+                    || (nature == Nature.COMPOSED && values.size() > 1) : line;
         } else {
             values = Collections.emptyList();
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 33644)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java	(revision 33645)
@@ -59,5 +59,5 @@
         }
         DataSet ds = new DataSet();
-        ds.setName(thf.getSupport().getIdentifier());
+        ds.setName(thf.getSupport().getBlockIdentifier());
         ds.setUploadPolicy(UploadPolicy.DISCOURAGED);
         return ds;
