Index: /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseConstants.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseConstants.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseConstants.java	(revision 28022)
@@ -21,7 +21,8 @@
 	
 	/**
-	 * Source
+	 * Sources
 	 */
-	public static final String SOURCE = "GrandToulouse";
+	public static final String SOURCE_GRAND_TOULOUSE = "GrandToulouse";
+	public static final String SOURCE_TISSEO = "Tisséo SMTC";
 	
 	/**
Index: /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java	(revision 28022)
@@ -47,5 +47,4 @@
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.PistesCyclablesHandler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.ReseauTisseoHandler;
-import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.TisseoHandler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.TramwayStationHandler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.VeloToulouseHandler;
@@ -96,5 +95,4 @@
         handlers.add(new EquipementCulturelBalmaHandler());
         handlers.add(new InstallationSportiveBalmaHandler());
-        handlers.add(new TisseoHandler());
     }
 }
Index: /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/ToulouseDataSetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/ToulouseDataSetHandler.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/ToulouseDataSetHandler.java	(revision 28022)
@@ -54,5 +54,5 @@
 	@Override
 	public String getSource() {
-		return SOURCE;
+		return SOURCE_GRAND_TOULOUSE;
 	}
 
@@ -85,4 +85,17 @@
 	
 	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler#getLicenseURL()
+	 */
+	@Override
+	public URL getLicenseURL() {
+		try {
+			return new URL(getLocalPortalURL().toString()+"/license");
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
 	 * @see org.openstreetmap.josm.plugins.fr.opendata.datasets.AbstractDataSetHandler#getWikiURL()
 	 */
Index: /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/transport/ReseauTisseoHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/transport/ReseauTisseoHandler.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/transport/ReseauTisseoHandler.java	(revision 28022)
@@ -16,5 +16,9 @@
 package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport;
 
+import java.io.File;
+import java.net.URL;
+
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.ToulouseDataSetHandler;
 
@@ -27,11 +31,37 @@
 	@Override
 	public boolean acceptsFilename(String filename) {
-		return acceptsZipFilename(filename, "14022-reseau-tisseo-metro-bus-tram-");
+		return acceptsZipFilename(filename, "14022-reseau-tisseo-metro-bus-tram-") || filename.toLowerCase().endsWith(XML_EXT);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler#acceptsFile(java.io.File)
+	 */
+	@Override
+	public boolean acceptsFile(File file) {
+		return acceptsFilename(file.getName()) && (file.getName().toLowerCase().endsWith(ZIP_EXT) || acceptsXmlNeptuneFile(file));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchDataSetHandler#getNeptuneSchema()
+	 */
+	@Override
+	protected URL getNeptuneSchema() {
+		return ReseauTisseoHandler.class.getResource(TOULOUSE_NEPTUNE_XSD);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.ToulouseDataSetHandler#getSource()
+	 */
+	@Override
+	public String getSource() {
+		return SOURCE_TISSEO;
 	}
 
 	@Override
 	public void updateDataSet(DataSet ds) {
-		// TODO Auto-generated method stub
-		
+		for (OsmPrimitive p : ds.allPrimitives()) {
+			p.put("operator", "Tisséo");
+			p.put("network", "fr_tisseo");
+		}
 	}
 }
Index: plications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/transport/TisseoHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/transport/TisseoHandler.java	(revision 28021)
+++ 	(revision )
@@ -1,41 +1,0 @@
-package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport;
-
-import java.io.File;
-import java.net.URL;
-
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.ToulouseDataSetHandler;
-
-public class TisseoHandler extends ToulouseDataSetHandler {
-
-	public TisseoHandler() {
-		super(14022);
-	}
-
-	@Override
-	public boolean acceptsFilename(String filename) {
-		return filename.toLowerCase().endsWith(XML_EXT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler#acceptsFile(java.io.File)
-	 */
-	@Override
-	public boolean acceptsFile(File file) {
-		return acceptsFilename(file.getName()) && acceptsXmlNeptuneFile(file);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchDataSetHandler#getNeptuneSchema()
-	 */
-	@Override
-	protected URL getNeptuneSchema() {
-		return TisseoHandler.class.getResource(TOULOUSE_NEPTUNE_XSD);
-	}
-
-	@Override
-	public void updateDataSet(DataSet ds) {
-		// TODO Auto-generated method stub
-		
-	}
-}
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 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 28022)
@@ -84,4 +84,6 @@
 	public static final String ICON_OSM_24 = "osm24.png";
 
+	public static final String ICON_AGREEMENT_24 = "agreement24.png";
+
     /**
      * File extensions.
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java	(revision 28022)
@@ -22,6 +22,9 @@
 import java.net.URLEncoder;
 
+import javax.swing.Action;
+
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
+import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
 import org.openstreetmap.josm.tools.OpenBrowser;
 
@@ -32,5 +35,6 @@
     
     public OpenLinkAction(URL url, String icon24Name, String title, String description) {
-        super(title, icon24Name, description, null, false);
+        super(title, null, description, null, false);
+        putValue(Action.SMALL_ICON, OdUtils.getImageIcon(icon24Name));
         this.url = url;
     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 28022)
@@ -172,4 +172,6 @@
 	public abstract URL getLocalPortalURL();
 	public abstract URL getNationalPortalURL();
+
+	public URL getLicenseURL() {return null;}
 
 	public final Collection<String> getOsmXapiRequests(Bounds bounds) {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java	(revision 28022)
@@ -288,5 +288,5 @@
 	}
 
-	protected final boolean acceptsXmlNeptuneFile(File file) {
+	public final boolean acceptsXmlNeptuneFile(File file) {
 		
 		Source xmlFile = new StreamSource(file);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NeptuneReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NeptuneReader.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NeptuneReader.java	(revision 28022)
@@ -17,4 +17,7 @@
 
 import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import javax.xml.bind.JAXBContext;
@@ -23,16 +26,60 @@
 import javax.xml.bind.Unmarshaller;
 
+import neptune.ChouetteAreaType;
 import neptune.ChouettePTNetworkType;
-
+import neptune.ChouettePTNetworkType.ChouetteArea.AreaCentroid;
+import neptune.ChouettePTNetworkType.ChouetteArea.StopArea;
+import neptune.ChouettePTNetworkType.ChouetteLineDescription.ChouetteRoute;
+import neptune.ChouettePTNetworkType.ChouetteLineDescription.StopPoint;
+import neptune.LineType;
+import neptune.LongLatTypeType;
+import neptune.PTLinkType;
+import neptune.PTNetworkType;
+import neptune.PointType;
+import neptune.StopAreaType;
+import neptune.StopPointType;
+import neptune.TridentObjectType;
+
+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.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.AbstractReader;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 
+/**
+ * NEPTUNE -> OSM converter
+ * See http://www.chouette.mobi/IMG/pdf/NF__F_-Neptune-maj.pdf 
+ */
 public class NeptuneReader extends AbstractReader {
 
+	public static final String OSM_PUBLIC_TRANSPORT = "public_transport";
+	public static final String OSM_STOP = "stop";
+	public static final String OSM_STOP_AREA = "stop_area";
+	public static final String OSM_STOP_POSITION = "stop_position";
+	public static final String OSM_PLATFORM = "platform";
+	public static final String OSM_STATION = "station";
+	public static final String OSM_NETWORK = "network";
+	public static final String OSM_ROUTE = "route";
+	public static final String OSM_ROUTE_MASTER = "route_master";
+
+	public static final String OSM_TRAIN = "train";
+	public static final String OSM_SUBWAY = "subway";
+	public static final String OSM_MONORAIL = "monorail";
+	public static final String OSM_TRAM = "tram";
+	public static final String OSM_BUS = "bus";
+	public static final String OSM_TROLLEYBUS = "trolleybus";
+	public static final String OSM_AERIALWAY = "aerialway";
+	public static final String OSM_FERRY = "ferry";
+
+	private ChouettePTNetworkType root;
+	
+	private final Map<String, OsmPrimitive> tridentObjects = new HashMap<String, OsmPrimitive>();
+	
 	public static DataSet parseDataSet(InputStream in, AbstractDataSetHandler handler, ProgressMonitor instance) throws JAXBException {
 		return new NeptuneReader().parse(in, instance);
-		
 	}
 
@@ -44,13 +91,231 @@
 		return doc.getValue();
 	}
+	
+	private final void linkTridentObjectToOsmPrimitive(TridentObjectType object, OsmPrimitive p) {
+		p.put("ref:neptune", object.getObjectId());
+		if (tridentObjects.put(object.getObjectId(), p) != null) {
+			System.err.println("Trident object duplicated !!! : "+object.getObjectId());
+		}
+	}
+
+	protected Node createNode(LatLon latlon){
+		Node n = new Node(latlon);
+		ds.addPrimitive(n);
+		return n;
+	}
+	
+	private Node createStopPosition(StopPointType stop) {
+		Node n = createNode(createLatLon(stop));
+		n.put(OSM_PUBLIC_TRANSPORT, OSM_STOP_POSITION);
+		linkTridentObjectToOsmPrimitive(stop, n);
+		n.put("name", stop.getName());
+		return n;
+	}
+
+	protected Relation createRelation(String type){
+		Relation r = new Relation();
+		r.put("type", type);
+		ds.addPrimitive(r);
+		return r;
+	}
+
+	protected Relation createPtRelation(String pt, TridentObjectType object){
+		Relation r = createRelation(OSM_PUBLIC_TRANSPORT);
+		r.put(OSM_PUBLIC_TRANSPORT, pt);
+		linkTridentObjectToOsmPrimitive(object, r);
+		return r;
+	}
+	
+	protected Relation createNetwork(PTNetworkType network) {
+		Relation r = createRelation(OSM_NETWORK);
+		linkTridentObjectToOsmPrimitive(network, r);
+		r.put("name", network.getName());
+		return r;
+	}
+	
+	protected Relation createRouteMaster(LineType line) {
+		Relation r = createPtRelation(OSM_ROUTE_MASTER, line);
+		switch (line.getTransportModeName()) {
+		case BUS:
+			r.put(OSM_ROUTE_MASTER, OSM_BUS); break;
+		case AIR:
+			r.put(OSM_ROUTE_MASTER, OSM_AERIALWAY); break;
+		case FERRY:
+			r.put(OSM_ROUTE_MASTER, OSM_FERRY); break;
+		case METRO:
+			r.put(OSM_ROUTE_MASTER, OSM_SUBWAY); break;
+		case TRAIN:
+			r.put(OSM_ROUTE_MASTER, OSM_TRAIN); break;
+		case TRAMWAY:
+			r.put(OSM_ROUTE_MASTER, OSM_TRAM); break;
+		case TROLLEYBUS:
+			r.put(OSM_ROUTE_MASTER, OSM_TROLLEYBUS); break;
+		default:
+			System.err.println("Unsupported transport mode: "+line.getTransportModeName());
+		}
+		r.put("ref", line.getNumber());
+		r.put("name", line.getTransportModeName().value()+" "+line.getNumber()+": "+line.getName());
+		return r;
+	}
+
+	private Relation createRoute(ChouetteRoute route) {
+		Relation r = createPtRelation(OSM_ROUTE, route);
+		r.put("name", route.getName());
+		return r;
+	}
+	
+	protected Relation createStopArea(StopAreaType sa) {
+		Relation r = createPtRelation(OSM_STOP_AREA, sa);
+		r.put("name", sa.getName());
+		return r;
+	}
+	
+	protected LatLon createLatLon(PointType point) {
+		return new LatLon(point.getLatitude().doubleValue(), point.getLongitude().doubleValue());
+	}
+	
+	protected final <T extends TridentObjectType> T findTridentObject(List<T> list, String id) {
+		for (T object : list) {
+			if (object.getObjectId().equals(id)) {
+				return object;
+			}
+		}
+		return null;
+	}
+	
+	protected StopPoint findStopPoint(String id) {
+		return findTridentObject(root.getChouetteLineDescription().getStopPoint(), id);
+	}
+
+	protected StopArea findStopArea(String id) {
+		return findTridentObject(root.getChouetteArea().getStopArea(), id);
+	}
+
+	protected AreaCentroid findAreaCentroid(String id) {
+		return findTridentObject(root.getChouetteArea().getAreaCentroid(), id);
+	}
+
+	protected PTLinkType findPtLink(String id) {
+		return findTridentObject(root.getChouetteLineDescription().getPtLink(), id);
+	}
+
+	protected static final boolean isNullLatLon(LatLon ll) {
+		return ll.lat() == 0.0 && ll.lon() == 0.0;
+	}
 
 	private DataSet parse(InputStream in, ProgressMonitor instance) throws JAXBException {
-		ChouettePTNetworkType root = unmarshal(ChouettePTNetworkType.class, in);
-
-		System.out.println(root);
-		
-		// TODO
+		root = unmarshal(ChouettePTNetworkType.class, in);
+
+		Relation network = createNetwork(root.getPTNetwork());
+
+		// Parsing Stop areas
+		for (StopArea sa : root.getChouetteArea().getStopArea()) {
+			if (sa.getStopAreaExtension().getAreaType().equals(ChouetteAreaType.COMMERCIAL_STOP_POINT)) {
+				Relation stopArea = createStopArea(sa);
+				stopArea.put("name", sa.getName());
+				for (String childId : sa.getContains()) {
+					if (childId.contains("StopArea")) {
+						StopArea child = findStopArea(childId);
+						if (child == null) {
+							System.err.println("Cannot find StopArea: "+childId);
+						} else {
+							if (child.getStopAreaExtension().getAreaType().equals(ChouetteAreaType.BOARDING_POSITION)) {
+								for (String grandchildId : child.getContains()) {
+									if (grandchildId.contains("StopPoint")) {
+										// TODO
+										StopPoint grandchild = findStopPoint(grandchildId);
+										if (grandchild == null) {
+											System.err.println("Cannot find StopPoint: "+grandchildId);
+										} else {
+											if (grandchild.getLongLatType().equals(LongLatTypeType.WGS_84)) {
+												Node stop = createStopPosition(grandchild);
+												stopArea.addMember(new RelationMember(OSM_STOP, stop));
+											} else {
+												System.err.println("Unsupported long/lat type: "+grandchild.getLongLatType());
+											}
+										}
+									} else {
+										System.err.println("Unsupported grandchild: "+grandchildId);
+									}
+								}
+								String centroidId = child.getCentroidOfArea();
+								AreaCentroid areaCentroid = findAreaCentroid(centroidId);
+								if (areaCentroid == null) {
+									System.err.println("Cannot find AreaCentroid: "+centroidId);
+								} else if (!areaCentroid.getLongLatType().equals(LongLatTypeType.WGS_84)) {
+									System.err.println("Unsupported long/lat type: "+areaCentroid.getLongLatType());
+								} else {
+									for (RelationMember member : stopArea.getMembers()) {
+										// Fix stop coordinates if needed
+										if (member.getRole().equals(OSM_STOP) && isNullLatLon(member.getNode().getCoor())) {
+											member.getNode().setCoor(createLatLon(areaCentroid));
+										}
+									}
+								}
+							} else {
+								System.err.println("Unsupported child type: "+child.getStopAreaExtension().getAreaType());
+							}
+						}
+						
+					} else if (childId.contains("StopPoint")) {
+						StopPoint child = findStopPoint(childId);
+						if (child == null) {
+							System.err.println("Cannot find StopPoint: "+childId);
+						} else {
+							// TODO
+							System.out.println("TODO: handle StopPoint "+childId);
+						}
+
+					} else {
+						System.err.println("Unsupported child: "+childId);
+					}
+				}
+			} else if (sa.getStopAreaExtension().getAreaType().equals(ChouetteAreaType.BOARDING_POSITION)) {
+				//System.out.println("skipping StopArea with type "+sa.getStopAreaExtension().getAreaType()+": "+sa.getObjectId());
+			} else {
+				System.err.println("Unsupported StopArea type: "+sa.getStopAreaExtension().getAreaType());
+			}
+		}
+
+		Relation routeMaster = createRouteMaster(root.getChouetteLineDescription().getLine());
+		network.addMember(new RelationMember(null, routeMaster));
+
+		for (ChouetteRoute cr : root.getChouetteLineDescription().getChouetteRoute()) {
+			Relation route = createRoute(cr);
+			routeMaster.addMember(new RelationMember(null, route));
+			for (String id : cr.getPtLinkId()) {
+				PTLinkType ptlink = findPtLink(id);
+				if (ptlink == null) {
+					System.err.println("Cannot find PTLinkType: "+id);
+				} else {
+					/*StopPoint start = findStopPoint(ptlink.getStartOfLink());
+					StopPoint end = findStopPoint(ptlink.getEndOfLink());*/
+					OsmPrimitive start = tridentObjects.get(ptlink.getStartOfLink());
+					OsmPrimitive end = tridentObjects.get(ptlink.getEndOfLink());
+					if (start == null) {
+						System.err.println("Cannot find start StopPoint: "+ptlink.getStartOfLink());
+					} else {
+						addStopToRoute(route, start);
+					}
+					
+					if (end == null) {
+						System.err.println("Cannot find end StopPoint: "+ptlink.getEndOfLink());
+					} else {
+						addStopToRoute(route, end);
+					}
+				}
+			}
+		}
 		
 		return ds;
 	}
+	
+	private static final boolean addStopToRoute(Relation route, OsmPrimitive stop) {
+		if (route.getMembersCount() == 0 || !route.getMember(route.getMembersCount()-1).getMember().equals(stop) ) {
+			route.addMember(new RelationMember(OSM_STOP, stop));
+			return true;
+		} else {
+			return false;
+		}
+	}
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java	(revision 28022)
@@ -26,4 +26,5 @@
 import java.util.zip.ZipInputStream;
 
+import javax.xml.bind.JAXBException;
 import javax.xml.stream.FactoryConfigurationError;
 import javax.xml.stream.XMLStreamException;
@@ -34,4 +35,6 @@
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
+import org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchDataSetHandler;
+import org.openstreetmap.josm.plugins.opendata.core.io.NeptuneReader;
 import org.openstreetmap.josm.plugins.opendata.core.io.geographic.KmlReader;
 import org.openstreetmap.josm.plugins.opendata.core.io.geographic.KmzReader;
@@ -53,5 +56,5 @@
     }
 
-	public static DataSet parseDataSet(InputStream in, AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException, XMLStreamException, FactoryConfigurationError {
+	public static DataSet parseDataSet(InputStream in, AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException, XMLStreamException, FactoryConfigurationError, JAXBException {
 		return new ZipReader(new ZipInputStream(in), handler).parseDoc(instance);
 	}
@@ -60,5 +63,5 @@
 	    final File temp = File.createTempFile("josm_opendata_temp_", Long.toString(System.nanoTime()));
 
-	    if(!temp.delete()) {
+	    if (!temp.delete()) {
 	        throw new IOException("Could not delete temp file: " + temp.getAbsolutePath());
 	    }
@@ -78,5 +81,5 @@
 	}
 
-	private DataSet parseDoc(ProgressMonitor instance) throws IOException, XMLStreamException, FactoryConfigurationError  {
+	private DataSet parseDoc(ProgressMonitor instance) throws IOException, XMLStreamException, FactoryConfigurationError, JAXBException  {
 		
 	    final File temp = createTempDir();
@@ -87,4 +90,7 @@
 			while ((entry = zis.getNextEntry()) != null) {
 				File file = new File(temp + File.separator + entry.getName());
+			    if (file.exists() && !file.delete()) {
+			        throw new IOException("Could not delete temp file: " + file.getAbsolutePath());
+			    }
 				if (!file.createNewFile()) {
 					throw new IOException("Could not create temp file: " + file.getAbsolutePath());
@@ -98,5 +104,5 @@
 				fos.close();
 				for (String ext : new String[] {
-						CSV_EXT, KML_EXT, KMZ_EXT, XLS_EXT, ODS_EXT, SHP_EXT, MIF_EXT, TAB_EXT
+						CSV_EXT, KML_EXT, KMZ_EXT, XLS_EXT, ODS_EXT, SHP_EXT, MIF_EXT, TAB_EXT, XML_EXT
 				}) {
 					if (entry.getName().toLowerCase().endsWith("."+ext)) {
@@ -139,4 +145,13 @@
 				} else if (file.getName().toLowerCase().endsWith(TAB_EXT)) {
 					from = TabReader.parseDataSet(in, file, handler, instance);
+				} else if (file.getName().toLowerCase().endsWith(XML_EXT)) {
+					if (handler instanceof FrenchDataSetHandler && ((FrenchDataSetHandler)handler).acceptsXmlNeptuneFile(file)) {
+						from = NeptuneReader.parseDataSet(in, handler, instance);
+					} else {
+						System.err.println("Unsupported XML file: "+file.getName());
+					}
+					
+				} else {
+					System.err.println("Unsupported file extension: "+file.getName());
 				}
 				if (from != null) {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java	(revision 28022)
@@ -38,6 +38,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.OsmDownloader;
-import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler;
-import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
 
 public class OdDataLayer extends OsmDataLayer implements OdConstants, OdLayer, LayerChangeListener {
@@ -65,5 +64,5 @@
 	
     @Override public Icon getBaseIcon() {
-    	return new ImageProvider(handler != null ? handler.getDataLayerIconName() : ICON_CORE_16).setAdditionalClassLoaders(ModuleHandler.getResourceClassLoaders()).get();
+    	return OdUtils.getImageIcon(handler != null ? handler.getDataLayerIconName() : ICON_CORE_16);
     }
 
@@ -156,4 +155,12 @@
 					tr("View National Portal page"), tr("Launch browser to the national portal page of the selected data set")));
 		}
+		if (this.handler.getLicenseURL() != null) {
+			if (this.handler.getLicenseURL().getProtocol().startsWith("http")) {
+				result.add(new OpenLinkAction(this.handler.getLicenseURL(), ICON_AGREEMENT_24, 
+						tr("View License"), tr("Launch browser to the license page of the selected data set")));
+			} else {
+				// TODO: view embedded licenses
+			}
+		}
 		return result.toArray(new Action[0]);
 	}
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/OdUtils.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/OdUtils.java	(revision 28021)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/OdUtils.java	(revision 28022)
@@ -19,7 +19,11 @@
 import java.util.List;
 
+import javax.swing.ImageIcon;
+
 import org.apache.commons.lang3.StringUtils;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 public abstract class OdUtils {
@@ -50,3 +54,7 @@
 		return result.toArray(new String[0]);
 	}
+	
+	public static final ImageIcon getImageIcon(String iconName) {
+		return new ImageProvider(iconName).setAdditionalClassLoaders(ModuleHandler.getResourceClassLoaders()).get();
+	}
 }
