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 33659)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileSCD.java	(revision 33660)
@@ -164,7 +164,5 @@
         @Override
         public String toString() {
-            return "McdAttributeDef [dictRef=" + dictRef + ", nMaxChars=" + nMaxChars + ", nMaxDigits=" + nMaxDigits
-                    + ", nMaxExponent=" + nMaxExponent + ", unit=" + unit + ", min=" + min + ", max=" + max + ", type="
-                    + type + ", identifier=" + identifier + ']';
+            return "McdAttributeDef [identifier=" + identifier + ']';
         }
     }
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 33659)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java	(revision 33660)
@@ -10,5 +10,7 @@
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -33,4 +35,5 @@
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileVEC.VecBlock;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoRecord.Nature;
+import org.openstreetmap.josm.tools.Logging;
 
 /**
@@ -105,4 +108,24 @@
             return parentRelations.stream().filter(r -> r.scdRef instanceof McdSemanticRelationDef).collect(Collectors.toList());
         }
+
+        /**
+         * Returns the number of attributes.
+         * @return the number of attributes
+         */
+        public final int getNumberOfAttributes() {
+            return nAttributes;
+        }
+
+        public final List<McdAttributeDef> getAttributeDefinitions() {
+            return Collections.unmodifiableList(attributeDefs);
+        }
+
+        public final McdAttributeDef getAttributeDefinition(int i) {
+            return attributeDefs.get(i);
+        }
+
+        public final String getAttributeValue(int i) {
+            return attributeValues.get(i);
+        }
     }
 
@@ -197,12 +220,4 @@
 
         /**
-         * Returns the number of attributes.
-         * @return the number of attributes
-         */
-        public final int getNumberOfAttributes() {
-            return nAttributes;
-        }
-
-        /**
          * Returns the number of quality indicators.
          * @return the number of quality indicators
@@ -312,5 +327,5 @@
         @Override
         public String toString() {
-            return "ObjectBlock [identifier=" + identifier + ']';
+            return "ObjectBlock [identifier=" + identifier + ", attributeDefs=" + attributeDefs +", attributeValues=" + attributeValues + ']';
         }
     }
@@ -389,4 +404,33 @@
     }
 
+    private static final List<Predicate<ObjectBlock>> ignoredObjects = new ArrayList<>();
+
+    /**
+     * Adds a predicate to ignore a special type of object.
+     * @param predicate defines how to identify the object to ignore
+     * @return {@code true}
+     */
+    public static boolean addIgnoredObject(Predicate<ObjectBlock> predicate) {
+        return ignoredObjects.add(Objects.requireNonNull(predicate, "predicate"));
+    }
+
+    /**
+     * Adds a predicate to ignore a special type of object based on a key/value attribute.
+     * @param key attribute key
+     * @param value attribute value
+     * @return {@code true}
+     */
+    public static boolean addIgnoredObject(String key, String value) {
+        return addIgnoredObject(o -> {
+            for (int i = 0; i < o.nAttributes; i++) {
+                if (key.equals(o.attributeDefs.get(i).identifier)
+                        && value.equals(o.attributeValues.get(i))) {
+                    return true;
+                }
+            }
+            return false;
+        });
+    }
+
     /**
      * Constructs a new {@code EdigeoFileVEC}.
@@ -427,11 +471,13 @@
         Projection proj = lot.geo.getCoorReference().getProjection();
         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());
+            if (!ignoredObjects.stream().anyMatch(p -> p.test(obj))) {
+                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 AREA: fillArea(ds, proj, obj, constructionRelations); break;
+                    case COMPLEX: break; // TODO (not used in PCI)
+                    default: throw new IllegalArgumentException(obj.toString());
+                }
             }
         }
@@ -470,6 +516,6 @@
     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();
+        // Retrieve all arcs for the linear object
+        final List<ArcBlock> arcs = new ArrayList<>();
         for (RelationBlock rel : constructionRelations) {
             assert rel.scdRef instanceof McdConstructionRelationDef : rel;
@@ -481,11 +527,40 @@
             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));
-                    }
+                    arcs.add((ArcBlock) e);
                 }
+            }
+        }
+        final double EPSILON = 1e-2;
+        assert arcs.size() >= 1;
+        Way w = new Way();
+        // Some lines are made of several arcs, but they need to be sorted
+        if (arcs.size() > 1) {
+            List<ArcBlock> newArcs = arcs.stream().filter(
+                    a -> arcs.stream().noneMatch(
+                            b -> b.points.get(0).equalsEpsilon(a.points.get(a.nPoints - 1), EPSILON))).collect(Collectors.toList());
+            if (newArcs.size() != 1) {
+                Logging.warn("Unable to process geometry of: " + obj);
+                return;
+            }
+            while (newArcs.size() < arcs.size()) {
+                ArcBlock ab = newArcs.get(newArcs.size() - 1);
+                EastNorth en = ab.points.get(ab.nPoints - 1);
+                Stream<ArcBlock> stream = arcs.stream().filter(a -> a.points.get(0).equalsEpsilon(en, EPSILON));
+                assert stream.count() == 1;
+                newArcs.add(stream.findAny().get());
+            }
+            assert newArcs.size() == arcs.size();
+            arcs.clear();
+            arcs.addAll(newArcs);
+            w.put(new Tag("fixme", "several_arcs")); // FIXME
+        }
+        // Add first node of first arc
+        w.addNode(getNodeAt(ds, proj, arcs.get(0).points.get(0)));
+        // For each arc, add all nodes except first one
+        for (ArcBlock ab : arcs) {
+            assert ab.nAttributes == 0 : ab;
+            assert ab.nQualities == 0 : ab;
+            for (int i = 1; i < ab.nPoints; i++) {
+                w.addNode(getNodeAt(ds, proj, ab.points.get(i)));
             }
         }
@@ -494,4 +569,8 @@
     }
 
+    private static void fillArea(DataSet ds, Projection proj, ObjectBlock obj, List<RelationBlock> constructionRelations) {
+        assert constructionRelations.size() >= 1 : constructionRelations;
+    }
+
     /**
      * Returns the list of node descriptors.
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 33659)
+++ applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java	(revision 33660)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileTHF;
+import org.openstreetmap.josm.plugins.fr.cadastre.edigeo.EdigeoFileVEC;
 
 /**
@@ -18,4 +19,8 @@
  */
 public class EdigeoPciReader extends AbstractReader {
+
+    static {
+        EdigeoFileVEC.addIgnoredObject("SYM_id", "31");
+    }
 
     /**
