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 33655)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFile.java	(revision 33656)
@@ -72,4 +72,8 @@
         boolean isValid() {
             return type.length() == 3 && areNotEmpty(identifier);
+        }
+
+        void resolve() {
+            // To be overriden if relevant
         }
 
@@ -199,3 +203,7 @@
 
     abstract boolean isValid();
+
+    void resolve() {
+        // To be overriden if relevant
+    }
 }
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 33655)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileTHF.java	(revision 33656)
@@ -265,4 +265,5 @@
                 allFiles.add(new EdigeoFileVEC(this, vecId.get(i), dir.resolve(name + vecName.get(i) + ".VEC")).read(ds));
             }
+            allFiles.forEach(EdigeoFile::resolve);
             for (EdigeoFile f : allFiles) {
                 boolean valid = f.isValid();
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 33655)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java	(revision 33656)
@@ -60,4 +60,11 @@
             }
         }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && areNotNull(scdRef)
+                    && areSameSize(nAttributes, attributeDefs, attributeValues)
+                    && areSameSize(nQualities, qualityIndics);
+        }
     }
 
@@ -227,8 +234,8 @@
 
     /**
-     * Object descriptor block.
+     * Object descriptor block. 7.5.1.4
      */
     public static class ObjectBlock extends BoundedBlock<McdObjectDef> {
-        /** REF */ String pointRef = "";
+        /** REF */ EastNorth refPoint;
 
         ObjectBlock(Lot lot, String type) {
@@ -239,13 +246,13 @@
         void processRecord(EdigeoRecord r) {
             switch (r.name) {
-            case "REF": safeGet(r, s -> pointRef += s); break;
-            default:
-                super.processRecord(r);
-            }
-        }
-    }
-
-    /**
-     * Relation descriptor block.
+            case "REF": refPoint = safeGetEastNorth(r); break;
+            default:
+                super.processRecord(r);
+            }
+        }
+    }
+
+    /**
+     * Relation descriptor block. 7.5.1.5
      */
     public static class RelationBlock extends VecBlock<McdRelationDef> {
@@ -271,6 +278,10 @@
 
         /** FTC */ int nElements;
-        /** FTP */ final List<String> elements = new ArrayList<>();
-        /** SNS */ final Map<String, Composition> compositions = new HashMap<>();
+        /** FTP */ final List<List<String>> lElements = new ArrayList<>();
+        /** SNS */ final Map<List<String>, Composition> mCompositions = new HashMap<>();
+
+        // Resolution of elements must be done when all VEC files are read
+        final List<VecBlock<?>> elements = new ArrayList<>();
+        final Map<VecBlock<?>, Composition> compositions = new HashMap<>();
 
         RelationBlock(Lot lot, String type) {
@@ -282,9 +293,27 @@
             switch (r.name) {
             case "FTC": nElements = safeGetInt(r); break;
-            case "FTP": safeGet(r, elements); break;
-            case "SNS": compositions.put(elements.get(elements.size()-1), Composition.of(safeGetChar(r))); break;
-            default:
-                super.processRecord(r);
-            }
+            case "FTP": lElements.add(r.values); break;
+            case "SNS": mCompositions.put(lElements.get(lElements.size()-1), Composition.of(safeGetChar(r))); break;
+            default:
+                super.processRecord(r);
+            }
+        }
+
+        @Override
+        boolean isValid() {
+            return super.isValid() && nElements >= 2 && areSameSize(nElements, elements) && compositions.size() <= nElements;
+        }
+
+        @Override
+        final void 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);
+                elements.add(b);
+                compositions.put(b, mCompositions.get(values));
+            }
+            lElements.clear();
+            mCompositions.clear();
         }
     }
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 33655)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoLotFile.java	(revision 33656)
@@ -23,5 +23,5 @@
 
     protected final Lot lot;
-    private final String subsetId;
+    protected final String subsetId;
 
     private final Map<String, Class<? extends B>> classes = new HashMap<>();
@@ -52,6 +52,11 @@
 
     @Override
-    boolean isValid() {
+    final boolean isValid() {
         return blocks.values().stream().allMatch(l -> l.stream().allMatch(Block::isValid));
+    }
+
+    @Override
+    final void resolve() {
+        blocks.forEach((k, v) -> v.forEach(Block::resolve));
     }
 
@@ -84,6 +89,6 @@
     public final <T extends B> T find(List<String> values, Class<T> klass) {
         assert values.size() == 4 : values;
-        assert values.get(0).equals(lot.identifier) : values;
-        assert values.get(1).equals(subsetId) : values;
+        assert values.get(0).equals(lot.identifier) : values + " / " + lot.identifier;
+        assert values.get(1).equals(subsetId) : values + " / " + subsetId;
         assert klass.isAssignableFrom(classes.get(values.get(2))) : values;
         List<T> list = blocks.getInstances(klass);
