Index: /applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/ecologie/AssainissementHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/ecologie/AssainissementHandler.java	(revision 29298)
+++ /applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/ecologie/AssainissementHandler.java	(revision 29299)
@@ -19,7 +19,14 @@
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.plugins.opendata.core.io.tabular.DefaultSpreadSheetHandler;
+import org.openstreetmap.josm.plugins.opendata.core.io.tabular.SpreadSheetReader.CoordinateColumns;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.DataGouvDataSetHandler;
 import org.openstreetmap.josm.tools.Pair;
@@ -30,5 +37,5 @@
 		super("assainissement-collectif-30381843");
 		setName("Assainissement collectif");
-		getSpreadSheetHandler().setSheetNumber(1);
+		setSpreadSheetHandler(new InternalOdsHandler());
 	}
 
@@ -40,5 +47,5 @@
 	@Override
 	public void updateDataSet(DataSet ds) {
-		// TODO Auto-generated method stub
+		// Implemented in InternalOdsHandler.nodesAdded()
 	}
 
@@ -51,6 +58,6 @@
 		try {
 			result.add(new Pair<String, URL>("Données 2009", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2.php")));
-			// FIXME problem with 2010 file (blank cells ?)
-			//result.add(new Pair<String, URL>("Données 2010", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2010.php")));
+			result.add(new Pair<String, URL>("Données 2010", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2010.php")));
+			result.add(new Pair<String, URL>("Données 2011", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2011.php")));
 		} catch (MalformedURLException e) {
 			e.printStackTrace();
@@ -58,3 +65,79 @@
 		return result;
 	}
+	
+	private final class InternalOdsHandler extends DefaultSpreadSheetHandler {
+
+	    private Node nodeWithKeys;
+	    
+	    private final Set<String> interestingKeys = new HashSet<String>();
+	    
+        public InternalOdsHandler() {
+            setSheetNumber(1);
+        }
+        
+        private void updateTag(Node node, String odsKey, String osmKey) {
+            String value = nodeWithKeys.get(odsKey);
+            removeTag(odsKey);
+            if (value != null && !value.isEmpty()) {
+                addTag(node, osmKey, value);
+            }
+        }
+        
+        private void addTag(Node node, String osmKey, String value) {
+            node.put(osmKey, value);
+            interestingKeys.add(osmKey);
+        }
+        
+        private void removeTag(String odsKey) {
+            nodeWithKeys.remove(odsKey);
+        }
+        
+        private void removeUninterestingTags() {
+            for (String key : nodeWithKeys.getKeys().keySet()) {
+                if (!interestingKeys.contains(key)) {
+                    nodeWithKeys.remove(key);
+                }
+            }
+        }
+
+        @Override
+        public void nodesAdded(DataSet ds, Map<CoordinateColumns, Node> nodes, String[] header, int lineNumber) {
+            Node steuNode = null;
+            Node rejetNode = null;
+            for (CoordinateColumns c : nodes.keySet()) {
+                if (header[c.xCol].contains("STEU") && header[c.yCol].contains("STEU")) {
+                    steuNode = nodes.get(c);
+                } else if (header[c.xCol].contains("rejet") && header[c.yCol].contains("rejet")) {
+                    rejetNode = nodes.get(c);
+                } else {
+                    System.err.println("Line "+lineNumber+": Unexpected coordinate columns: "+c);
+                }
+            }
+            if (steuNode == null || rejetNode == null) {
+                System.err.println("Line "+lineNumber+": 'STEU' or 'rejet' information not found");
+                return;
+            }
+            nodeWithKeys = steuNode.hasKeys() ? steuNode : rejetNode;
+            
+            addTag(steuNode, "man_made", "wastewater_plant");
+            updateTag(steuNode, "Code du STEU", "ref");
+            updateTag(steuNode, "Nom du STEU", "name");
+            updateTag(steuNode, "Date de mise en service du STEU", "start_date");
+            updateTag(steuNode, "Date de mise hors service du STEU", "end_date");
+            updateTag(steuNode, "Exploitant", "operator");
+            updateTag(steuNode, "Capacité nominale en EH", "capacity");
+            updateTag(rejetNode, "Nom du milieu de rejet", "name");
+            
+            Way pipeline = new Way();
+            pipeline.addNode(steuNode);
+            pipeline.addNode(rejetNode);
+            if (pipeline.getLength() > 1) {
+                //pipeline.put("man_made", "pipeline");
+                //pipeline.put("type", "water");
+                ds.addPrimitive(pipeline);
+            }
+            
+            removeUninterestingTags();
+        }
+	}
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 29298)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 29299)
@@ -132,5 +132,4 @@
     public static final Collection<ProjectionPatterns> PROJECTIONS = new ArrayList<ProjectionPatterns>();
     
-    public static final ProjectionPatterns PRJ_UNKNOWN = new ProjectionPatterns("");
     public static final ProjectionPatterns PRJ_WGS84 = new ProjectionPatterns("GPS|WGS84|°décimaux", Projections.getProjectionByCode("EPSG:4326"));
     public static final ProjectionPatterns PRJ_LAMBERT_93 = new ProjectionPatterns("LAMB93|L93", Projections.getProjectionByCode("EPSG:2154"));
@@ -140,4 +139,7 @@
     public static final ProjectionPatterns PRJ_LAMBERT_2008 = new ProjectionPatterns("LAMB08|LAMB2008", Projections.getProjectionByCode("EPSG:3812"));
 
+    // Must always be declared last
+    public static final ProjectionPatterns PRJ_UNKNOWN = new ProjectionPatterns("");
+
     /**
      * Resources
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java	(revision 29298)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java	(revision 29299)
@@ -69,3 +69,8 @@
 		}
     }
+
+    @Override
+    public String toString() {
+        return "[xPattern=" + xPattern + ", yPattern=" + yPattern + ", projection=" + projection + "]";
+    }
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultSpreadSheetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultSpreadSheetHandler.java	(revision 29298)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultSpreadSheetHandler.java	(revision 29299)
@@ -16,6 +16,11 @@
 package org.openstreetmap.josm.plugins.opendata.core.io.tabular;
 
+import java.util.Map;
+
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.plugins.opendata.core.io.tabular.SpreadSheetReader.CoordinateColumns;
 
 public class DefaultSpreadSheetHandler implements SpreadSheetHandler {
@@ -82,3 +87,8 @@
 		return yCol;
 	}
+
+    @Override
+    public void nodesAdded(DataSet ds, Map<CoordinateColumns, Node> nodes, String[] header, int lineNumber) {
+        // To be overriden if needed
+    }
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetHandler.java	(revision 29298)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetHandler.java	(revision 29299)
@@ -16,6 +16,11 @@
 package org.openstreetmap.josm.plugins.opendata.core.io.tabular;
 
+import java.util.Map;
+
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.plugins.opendata.core.io.tabular.SpreadSheetReader.CoordinateColumns;
 
 public interface SpreadSheetHandler {
@@ -42,3 +47,5 @@
 
 	public int getYCol();
+
+    public void nodesAdded(DataSet ds, Map<CoordinateColumns, Node> nodes, String[] fields, int lineNumber);
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 29298)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 29299)
@@ -24,9 +24,10 @@
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -70,5 +71,5 @@
 	}
 	
-	private class CoordinateColumns {
+	public static class CoordinateColumns {
 		public int xCol = -1;
 		public int yCol = -1;
@@ -76,4 +77,15 @@
 			return xCol > -1 && yCol > -1;
 		}
+        @Override
+        public String toString() {
+            return "[xCol=" + xCol + ", yCol=" + yCol + "]";
+        }
+	}
+	
+	private final CoordinateColumns addCoorColIfNeeded(List<CoordinateColumns> columns, CoordinateColumns col) {
+        if (col == null || col.isOk()) {
+            columns.add(col = new CoordinateColumns());
+        }
+        return col;
 	}
 	
@@ -81,20 +93,19 @@
 		System.out.println("Header: "+Arrays.toString(header));
 		
-		Map<ProjectionPatterns, CoordinateColumns> projColumns = new HashMap<ProjectionPatterns, CoordinateColumns>();
-		
-		// TODO: faire une liste de coordonnees pour les cas ou plusieurs coordonnées dans la meme projection sont présentes (ex assainissement) 
+		Map<ProjectionPatterns, List<CoordinateColumns>> projColumns = new HashMap<ProjectionPatterns, List<CoordinateColumns>>();
+		
 		for (int i = 0; i<header.length; i++) {
 			for (ProjectionPatterns pp : PROJECTIONS) {
-				CoordinateColumns col = projColumns.get(pp);
+			    List<CoordinateColumns> columns = projColumns.get(pp);
+			    if (columns == null) {
+			        projColumns.put(pp, columns = new ArrayList<CoordinateColumns>());
+			    }
+				CoordinateColumns col = columns.isEmpty() ? null : columns.get(columns.size()-1);
 				if (pp.getXPattern().matcher(header[i]).matches()) {
-					if (col == null) {
-						projColumns.put(pp, col = new CoordinateColumns());
-					}
-					col.xCol = i;
+				    addCoorColIfNeeded(columns, col).xCol = i;
+					break;
 				} else if (pp.getYPattern().matcher(header[i]).matches()) {
-					if (col == null) {
-						projColumns.put(pp, col = new CoordinateColumns());
-					}
-					col.yCol = i;
+				    addCoorColIfNeeded(columns, col).yCol = i;
+					break;
 				}
 			}
@@ -102,17 +113,15 @@
 
 		Projection proj = null;
-		CoordinateColumns columns = null;
-		Collection<Integer> allProjIndexes = new ArrayList<Integer>();
+		final List<CoordinateColumns> columns = new ArrayList<CoordinateColumns>();
 		
 		for (ProjectionPatterns pp : projColumns.keySet()) {
-			CoordinateColumns col = projColumns.get(pp);
-			if (col.isOk()) {
-				if (proj == null) {
-					proj = pp.getProjection(header[col.xCol], header[col.yCol]);
-					columns = col;
-				}
-				allProjIndexes.add(col.xCol);
-				allProjIndexes.add(col.yCol);
-			}
+		    for (CoordinateColumns col : projColumns.get(pp)) {
+	            if (col.isOk()) {
+                    columns.add(col);
+	                if (proj == null) {
+	                    proj = pp.getProjection(header[col.xCol], header[col.yCol]);
+	                }
+	            }
+		    }
 		}
 
@@ -121,5 +130,5 @@
 		if (proj != null) {
 			// projection identified, do nothing
-		} else if (columns != null) {
+		} else if (!columns.isEmpty()) {
 			if (!handlerOK) {
 				// TODO: filter proposed projections with min/max values ?
@@ -135,6 +144,14 @@
 		}
 
-		System.out.println("Loading data using projection "+proj+" ("+header[columns.xCol]+", "+header[columns.yCol]+")");
-				
+		String message = "";
+		for (CoordinateColumns c : columns) {
+		    if (!message.isEmpty()) {
+		        message += "; ";
+		    }
+		    message += header[c.xCol]+", "+header[c.yCol];
+		}
+		
+		System.out.println("Loading data using projection "+proj+" ("+message+")");
+		
 		final DataSet ds = new DataSet();
 		int lineNumber = 1;
@@ -143,28 +160,43 @@
 		while ((fields = readLine(progressMonitor)) != null) {
 			lineNumber++;
-			EastNorth en = new EastNorth(Double.NaN, Double.NaN);
 			if (handler != null) {
 				handler.setXCol(-1);
 				handler.setYCol(-1);
 			}
-			Node n = new Node();
+			
+            final Map<CoordinateColumns, EastNorth> ens = new HashMap<CoordinateColumns, EastNorth>();
+			final Map<CoordinateColumns, Node> nodes = new HashMap<CoordinateColumns, Node>();
+			for (CoordinateColumns c : columns) {
+			    nodes.put(c, new Node());
+			    ens.put(c, new EastNorth(Double.NaN, Double.NaN));
+			}
+			
 			for (int i = 0; i<fields.length; i++) {
 				try {
 					if (i >= header.length) {
 						throw new IllegalArgumentException(tr("Invalid file. Bad length on line {0}. Expected {1} columns, got {2}.", lineNumber, header.length, i+1));
-					} else if (i == columns.xCol) {
-						en.setLocation(parseDouble(fields[i]), en.north());
-						if (handler != null) {
-							handler.setXCol(i);
-						}
-					} else if (i == columns.yCol) {
-						en.setLocation(en.east(), parseDouble(fields[i]));
-						if (handler != null) {
-							handler.setYCol(i);
-						}
-					} else if (!allProjIndexes.contains(i)) {
-						if (!fields[i].isEmpty()) {
-							n.put(header[i], fields[i]);
-						}
+					} else {
+					    boolean coordinate = false;
+					    for (CoordinateColumns c : columns) {
+					        EastNorth en = ens.get(c);
+	                        if (i == c.xCol) {
+	                            coordinate = true;
+	                            en.setLocation(parseDouble(fields[i]), en.north());
+	                            if (handler != null) {
+	                                handler.setXCol(i);
+	                            }
+	                        } else if (i == c.yCol) {
+                                coordinate = true;
+	                            en.setLocation(en.east(), parseDouble(fields[i]));
+	                            if (handler != null) {
+	                                handler.setYCol(i);
+	                            }
+	                        }					        
+					    }
+	                    if (!coordinate) {
+	                        if (!fields[i].isEmpty()) {
+	                            nodes.values().iterator().next().put(header[i], fields[i]);
+	                        }
+	                    }
 					}
 				} catch (ParseException e) {
@@ -172,11 +204,18 @@
 				}
 			}
-			if (en.isValid()) {
-				n.setCoor(proj != null && !handlerOK ? proj.eastNorth2latlon(en) : handler.getCoor(en, fields));
-			} else {
-				System.err.println("Warning: Skipping line "+lineNumber+" because no valid coordinates have been found.");
-			}
-			if (n.getCoor() != null) {
-				ds.addPrimitive(n);
+			for (CoordinateColumns c : columns) {
+			    Node n = nodes.get(c);
+			    EastNorth en = ens.get(c);
+    			if (en.isValid()) {
+    				n.setCoor(proj != null && !handlerOK ? proj.eastNorth2latlon(en) : handler.getCoor(en, fields));
+    			} else {
+    				System.err.println("Warning: Skipping line "+lineNumber+" because no valid coordinates have been found at columns "+c);
+    			}
+    			if (n.getCoor() != null) {
+    				ds.addPrimitive(n);
+    			}
+			}
+			if (handler != null && !Main.pref.getBoolean(PREF_RAWDATA)) {
+			    handler.nodesAdded(ds, nodes, header, lineNumber);
 			}
 		}
