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 33656)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileSCD.java	(revision 33657)
@@ -8,4 +8,7 @@
 
 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;
+import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileDIC.RelationDef;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileSCD.ScdBlock;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF.ChildBlock;
@@ -27,23 +30,19 @@
 
     /**
-     * MCD Object definition.
-     */
-    public static class McdObjectDef extends ScdBlock {
-
-        /** DIP */ String dictRef = "";
-        /** KND */ String kind = "";
+     * MCD definition with attributes.
+     */
+    abstract static class ScdTaggedDef extends ScdBlock {
         /** AAC */ int nAttributes;
         /** AAP */ final List<String> attributes = new ArrayList<>();
         /** QAC */ int nQualities;
-
-        McdObjectDef(Lot lot, String type) {
-            super(lot, type);
-        }
-
-        @Override
-        void processRecord(EdigeoRecord r) {
-            switch (r.name) {
-            case "DIP": safeGet(r, s -> dictRef += s); break;
-            case "KND": safeGet(r, s -> kind += s); break;
+        // TODO: qualities ?
+
+        ScdTaggedDef(Lot lot, String type) {
+            super(lot, type);
+        }
+
+        @Override
+        void processRecord(EdigeoRecord r) {
+            switch (r.name) {
             case "AAC": nAttributes = safeGetInt(r); break;
             case "AAP": safeGet(r, attributes); break;
@@ -53,4 +52,58 @@
             }
         }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areSameSize(nAttributes, attributes);
+        }
+    }
+
+    /**
+     * MCD Object definition.
+     */
+    public static class McdObjectDef extends ScdTaggedDef {
+
+        enum ObjectKind {
+            COMPLEX("CPX"),
+            POINT("PCT"),
+            LINE("LIN"),
+            AREA("ARE");
+
+            final String code;
+            ObjectKind(String code) {
+                this.code = code;
+            }
+
+            public static ObjectKind of(String code) {
+                for (ObjectKind s : values()) {
+                    if (s.code.equals(code)) {
+                        return s;
+                    }
+                }
+                throw new IllegalArgumentException(code);
+            }
+        }
+
+        /** DIP */ ObjectDef dictRef;
+        /** KND */ ObjectKind kind;
+
+        McdObjectDef(Lot lot, String type) {
+            super(lot, type);
+        }
+
+        @Override
+        void processRecord(EdigeoRecord r) {
+            switch (r.name) {
+            case "DIP": dictRef = lot.dic.find(r.values, ObjectDef.class); break;
+            case "KND": safeGet(r, s -> kind = ObjectKind.of(s)); break;
+            default:
+                super.processRecord(r);
+            }
+        }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(dictRef, kind);
+        }
     }
 
@@ -60,5 +113,5 @@
     public static class McdAttributeDef extends ScdBlock {
 
-        /** DIP */ String dictRef = "";
+        /** DIP */ AttributeDef dictRef;
         /** CAN */ int nMaxChars;
         /** CAD */ int nMaxDigits;
@@ -75,5 +128,5 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "DIP": safeGet(r, s -> dictRef += s); break;
+            case "DIP": dictRef = lot.dic.find(r.values, AttributeDef.class); break;
             case "CAN": nMaxChars = safeGetInt(r); break;
             case "CAD": nMaxDigits = safeGetInt(r); break;
@@ -86,4 +139,9 @@
             }
         }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(dictRef);
+        }
     }
 
@@ -91,5 +149,5 @@
      * MCD Primitive definition.
      */
-    public static class McdPrimitiveDef extends ScdBlock {
+    public static class McdPrimitiveDef extends ScdTaggedDef {
 
         enum PrimitiveKind {
@@ -114,6 +172,4 @@
 
         /** KND */ PrimitiveKind kind;
-        /** AAC */ int nAttributes;
-        /** QAC */ int nQualities;
 
         McdPrimitiveDef(Lot lot, String type) {
@@ -125,9 +181,12 @@
             switch (r.name) {
             case "KND": safeGet(r, s -> kind = PrimitiveKind.of(s)); break;
-            case "AAC": nAttributes = safeGetInt(r); break;
-            case "QAC": nQualities = safeGetInt(r); break;
-            default:
-                super.processRecord(r);
-            }
+            default:
+                super.processRecord(r);
+            }
+        }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(kind);
         }
     }
@@ -136,5 +195,5 @@
      * MCD Relation definition.
      */
-    abstract static class McdRelationDef extends ScdBlock {
+    abstract static class McdRelationDef extends ScdTaggedDef {
 
         /** CA1 */ int minCardinal;
@@ -143,6 +202,4 @@
         /** SCP */ final List<ScdBlock> scdRef = new ArrayList<>();
         /** OCC */ final List<Integer> nOccurences = new ArrayList<>();
-        /** AAC */ int nAttributes;
-        /** QAC */ int nQualities;
 
         McdRelationDef(Lot lot, String type) {
@@ -158,9 +215,12 @@
             case "SCP": scdRef.add(lot.scd.find(r.values)); break;
             case "OCC": nOccurences.add(safeGetInt(r)); break;
-            case "AAC": nAttributes = safeGetInt(r); break;
-            case "QAC": nQualities = safeGetInt(r); break;
-            default:
-                super.processRecord(r);
-            }
+            default:
+                super.processRecord(r);
+            }
+        }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(minCardinal, maxCardinal) && areSameSize(nTypes, scdRef, nOccurences);
         }
     }
@@ -171,5 +231,5 @@
     public static class McdSemanticRelationDef extends McdRelationDef {
 
-        /** DIP */ String dictRef = "";
+        /** DIP */ RelationDef dictRef;
 
         McdSemanticRelationDef(Lot lot, String type) {
@@ -180,8 +240,13 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "DIP": safeGet(r, s -> dictRef += s); break;
-            default:
-                super.processRecord(r);
-            }
+            case "DIP": dictRef = lot.dic.find(r.values, RelationDef.class); break;
+            default:
+                super.processRecord(r);
+            }
+        }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(dictRef);
         }
     }
@@ -232,4 +297,9 @@
             }
         }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(kind);
+        }
     }
 
