Index: /applications/editors/josm/plugins/routes/.settings/org.eclipse.jdt.ui.prefs
===================================================================
--- /applications/editors/josm/plugins/routes/.settings/org.eclipse.jdt.ui.prefs	(revision 19532)
+++ /applications/editors/josm/plugins/routes/.settings/org.eclipse.jdt.ui.prefs	(revision 19532)
@@ -0,0 +1,54 @@
+#Fri Jan 15 16:11:57 CET 2010
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
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 19531)
+++ /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 19531)
+++ /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;
+	}
+
 }
