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 33646)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFile.java	(revision 33647)
@@ -56,5 +56,5 @@
         }
 
-        protected void safeGet(EdigeoRecord r, List<String> list) {
+        protected final void safeGet(EdigeoRecord r, List<String> list) {
             list.add("");
             safeGet(r, s -> {
@@ -64,17 +64,21 @@
         }
 
-        protected void safeGet(EdigeoRecord r, Consumer<String> callback) {
+        protected final void safeGet(EdigeoRecord r, Consumer<String> callback) {
             (lastReadString = callback).accept(r.length > 0 ? r.values.get(0) : null);
         }
 
-        protected int safeGetInt(EdigeoRecord r) {
+        protected final int safeGetInt(EdigeoRecord r) {
             return r.length > 0 ? Integer.parseInt(r.values.get(0)) : 0;
         }
 
-        protected LocalDate safeGetDate(EdigeoRecord r) {
+        protected final 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) {
+        protected final double safeGetDouble(EdigeoRecord r) {
+            return r.length > 0 ? Double.parseDouble(r.values.get(0)) : 0;
+        }
+
+        protected final void safeGetAndLog(EdigeoRecord r, Consumer<String> callback, String msg) {
             if (r.length > 0) {
                 String v = r.values.get(0);
@@ -84,5 +88,5 @@
         }
 
-        protected LocalDate safeGetDateAndLog(EdigeoRecord r, String msg) {
+        protected final LocalDate safeGetDateAndLog(EdigeoRecord r, String msg) {
             if (r.length > 0) {
                 LocalDate v = LocalDate.parse(r.values.get(0), dateFormatter);
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 33646)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileQAL.java	(revision 33647)
@@ -4,4 +4,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
@@ -9,4 +12,79 @@
  */
 public class EdigeoFileQAL extends EdigeoFile {
+
+    /**
+     * Update descriptor.
+     */
+    public static class Update extends Block {
+
+        enum UpdateType {
+            NO_MODIFICATION(0),
+            CREATION(1),
+            REPLACEMENT(2),
+            DELETION(3);
+
+            final int code;
+            UpdateType(int code) {
+                this.code = code;
+            }
+
+            public static UpdateType of(int code) {
+                for (UpdateType s : values()) {
+                    if (s.code == code) {
+                        return s;
+                    }
+                }
+                throw new IllegalArgumentException(Integer.toString(code));
+            }
+        }
+
+        enum Perennity {
+            TEMPORARY(1),
+            DEFINITIVE(2);
+
+            final int code;
+            Perennity(int code) {
+                this.code = code;
+            }
+
+            public static Perennity of(int code) {
+                for (Perennity s : values()) {
+                    if (s.code == code) {
+                        return s;
+                    }
+                }
+                throw new IllegalArgumentException(Integer.toString(code));
+            }
+        }
+
+        /** ODA */ LocalDate observationDate;
+        /** UTY */ UpdateType updateType;
+        /** ULO */ Perennity perennity;
+        /** UDA */ LocalDate updateDate;
+        /** RAT */ double annualRatio;
+        /** EDA */ LocalDate endOfValidity;
+        /** COC */ int nElements;
+        /** COP */ final List<String> mcdRef = new ArrayList<>();
+
+        Update(String type) {
+            super(type);
+        }
+
+        @Override
+        void processRecord(EdigeoRecord r) {
+            switch (r.name) {
+            case "ODA": observationDate = safeGetDate(r); break;
+            case "UTY": updateType = UpdateType.of(safeGetInt(r)); break;
+            case "ULO": perennity = Perennity.of(safeGetInt(r)); break;
+            case "UDA": updateDate = safeGetDate(r); break;
+            case "RAT": annualRatio = safeGetDouble(r); break;
+            case "EDA": endOfValidity = safeGetDate(r); break;
+            case "COC": nElements = safeGetInt(r); break;
+            case "COP": safeGet(r, mcdRef); break;
+            default:
+                super.processRecord(r);
+            }
+        }
+    }
 
     /**
@@ -21,7 +99,8 @@
     @Override
     protected Block createBlock(String type) {
-        // TODO Auto-generated method stub
-        return null;
+        if ("QUP".equals(type)) {
+            return new Update(type);
+        }
+        throw new IllegalArgumentException(type);
     }
-
 }
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 33646)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileSCD.java	(revision 33647)
@@ -84,5 +84,5 @@
             FACE("FAC");
 
-            String code;
+            final String code;
             PrimitiveKind(String code) {
                 this.code = code;
@@ -189,5 +189,5 @@
             BELONG_TO("BET");
 
-            String code;
+            final String code;
             RelationKind(String code) {
                 this.code = code;
