Index: applications/editors/josm/plugins/routes/src/org/openstreetmap/josm/plugins/routes/PathBuilder.java
===================================================================
--- applications/editors/josm/plugins/routes/src/org/openstreetmap/josm/plugins/routes/PathBuilder.java	(revision 19473)
+++ applications/editors/josm/plugins/routes/src/org/openstreetmap/josm/plugins/routes/PathBuilder.java	(revision 19532)
@@ -14,5 +14,6 @@
 public class PathBuilder {
 
-	private Map<Way, BitSet> wayRoutes = new HashMap<Way, BitSet>(); 
+	private Map<Way, BitSet> wayRoutes = new HashMap<Way, BitSet>();
+	private Collection<ConvertedWay> convertedWays;
 
 	public void addWay(Way way, RouteDefinition route) {
@@ -30,29 +31,32 @@
 
 	public Collection<ConvertedWay> getConvertedWays() {
-		Map<WayEnd, ConvertedWay> ways = new HashMap<WayEnd, ConvertedWay>();
+		if (convertedWays == null) {
+			Map<WayEnd, ConvertedWay> ways = new HashMap<WayEnd, ConvertedWay>();
 
-		for (Entry<Way, BitSet> wayEntry:wayRoutes.entrySet()) {
-			ConvertedWay way = new ConvertedWay(wayEntry.getValue(), wayEntry.getKey());
+			for (Entry<Way, BitSet> wayEntry:wayRoutes.entrySet()) {
+				ConvertedWay way = new ConvertedWay(wayEntry.getValue(), wayEntry.getKey());
 
-			ConvertedWay wayBefore = ways.get(way.getStart());
-			ConvertedWay wayAfter = ways.get(way.getStop());
+				ConvertedWay wayBefore = ways.get(way.getStart());
+				ConvertedWay wayAfter = ways.get(way.getStop());
 
-			if (wayBefore != null) {
-				removeWay(ways, wayBefore);
-				way.connect(wayBefore);
-			} 
+				if (wayBefore != null) {
+					removeWay(ways, wayBefore);
+					way.connect(wayBefore);
+				}
 
-			if (wayAfter != null) {
-				removeWay(ways, wayAfter);
-				way.connect(wayAfter);
+				if (wayAfter != null) {
+					removeWay(ways, wayAfter);
+					way.connect(wayAfter);
+				}
+
+				ways.put(way.getStart(), way);
+				ways.put(way.getStop(), way);
 			}
 
-			ways.put(way.getStart(), way);
-			ways.put(way.getStop(), way);
+			Set<ConvertedWay> uniqueWays = new HashSet<ConvertedWay>();
+			uniqueWays.addAll(ways.values());
+			convertedWays = uniqueWays;
 		}
-
-		Set<ConvertedWay> uniqueWays = new HashSet<ConvertedWay>();
-		uniqueWays.addAll(ways.values());
-		return uniqueWays;
+		return convertedWays;
 	}
 
@@ -63,4 +67,5 @@
 
 	public void clear() {
+		convertedWays = null;
 		wayRoutes.clear();
 	}
Index: applications/editors/josm/plugins/routes/src/org/openstreetmap/josm/plugins/routes/RouteLayer.java
===================================================================
--- applications/editors/josm/plugins/routes/src/org/openstreetmap/josm/plugins/routes/RouteLayer.java	(revision 19473)
+++ applications/editors/josm/plugins/routes/src/org/openstreetmap/josm/plugins/routes/RouteLayer.java	(revision 19532)
@@ -16,4 +16,8 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
+import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
+import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
@@ -27,9 +31,10 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 
-public class RouteLayer extends Layer {
+public class RouteLayer extends Layer implements DataSetListenerAdapter.Listener {
 
 	private final PathPainter pathPainter;
 	private final PathBuilder pathBuilder = new PathBuilder();
 	private final List<RouteDefinition> routes = new ArrayList<RouteDefinition>();
+	private volatile boolean datasetChanged = true;
 
 	public RouteLayer(RoutesXMLLayer xmlLayer) {
@@ -53,4 +58,6 @@
 			pathPainter = new NarrowLinePainter(this);
 		}
+
+		DatasetEventManager.getInstance().addDatasetListener(new DataSetListenerAdapter(this), FireMode.IMMEDIATELY);
 	}
 
@@ -103,18 +110,21 @@
 		}
 
-		pathBuilder.clear();
+		if (datasetChanged) {
+			datasetChanged = false;
+			pathBuilder.clear();
 
-		for (Relation relation:dataset.getRelations()) {
-			for (RouteDefinition route:routes) {
-				if (route.matches(relation)) {
-					addRelation(relation, route);
+			for (Relation relation:dataset.getRelations()) {
+				for (RouteDefinition route:routes) {
+					if (route.matches(relation)) {
+						addRelation(relation, route);
+					}
 				}
 			}
-		}
 
-		for (Way way:dataset.getWays()) {
-			for (RouteDefinition route:routes) {
-				if (route.matches(way)) {
-					pathBuilder.addWay(way, route);
+			for (Way way:dataset.getWays()) {
+				for (RouteDefinition route:routes) {
+					if (route.matches(way)) {
+						pathBuilder.addWay(way, route);
+					}
 				}
 			}
@@ -128,4 +138,5 @@
 		g.setStroke(stroke);
 		g.setColor(color);
+
 	}
 
@@ -139,3 +150,7 @@
 	}
 
+	public void processDatasetEvent(AbstractDatasetChangedEvent event) {
+		datasetChanged = true;
+	}
+
 }
