Index: src/uk/me/parabola/mkgmap/reader/osm/LinkDestinationHook.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/LinkDestinationHook.java	(revision 3660)
+++ src/uk/me/parabola/mkgmap/reader/osm/LinkDestinationHook.java	(working copy)
@@ -53,9 +53,10 @@
 	private Map<Long, Way> destinationLinkWays = new HashMap<Long, Way>();
 	
 	private final static Set<String> highwayTypes = new LinkedHashSet<String>(Arrays.asList(
-			"motorway", "trunk", "primary", "motorway_link", "trunk_link", "primary_link"));
+			"motorway", "trunk", "primary", "secondary", "tertiary", 
+			"motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link"));
 	private HashSet<String> linkTypes = new HashSet<String>(Arrays.asList(
-			"motorway_link", "trunk_link", "primary_link"));
+			"motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link"));
 	
 
 	/** Map way ids to its restriction relations so that the relations can easily be updated when the way is split. */
@@ -92,17 +93,24 @@
 				// the points of the way are kept so that it is easy to get
 				// the adjacent ways for a given _link way
 				String directedDestination = null;
+				String directedDestinationLanes = null;
+				String directionSuffix = null;
 				List<Coord> points;
+				
 				if (isOnewayInDirection(w)) {
 					// oneway => don't need the last point because the
 					// way cannot be driven standing at the last point
 					points = w.getPoints().subList(0, w.getPoints().size() - 1);
 					directedDestination = w.getTag("destination:forward");
+					directedDestinationLanes = w.getTag("destination:lanes:forward");
+					directionSuffix = "forward";
 				} else if (isOnewayOppositeDirection(w)) {
 					// reverse oneway => don't need the first point because the
 					// way cannot be driven standing at the first point
 					points = w.getPoints().subList(1, w.getPoints().size());
 					directedDestination = w.getTag("destination:backward");
+					directedDestinationLanes = w.getTag("destination:lanes:backward");
+					directionSuffix = "backward";
 				} else {
 					points = w.getPoints();
 				}
@@ -119,30 +127,46 @@
 				// if the way is a link way and has a destination tag
 				// put it the list of ways that have to be processed
 				if (linkTypes.contains(highwayTag)) {
+					String destSourceTagKey = "destination"; 
 					String destinationTag = w.getTag("destination");
-					
 					if (destinationTag == null) {
 						// destination is not set 
-						// => check if destination:lanes is without any lane specific information (no |) 
-						String destLanesTag = w.getTag("destination:lanes");
+						// => check if destination:lanes is without any lane specific information (no |)
+						destSourceTagKey = "destination:lanes";
+						String destLanesTag = w.getTag(destSourceTagKey);
+						if (destLanesTag == null && directedDestinationLanes != null){
+							destLanesTag = directedDestinationLanes;
+							destSourceTagKey += ":" + directionSuffix;
+						}
 						if (destLanesTag != null && destLanesTag.contains("|") == false) {
 							// the destination:lanes tag contains no | => no lane specific information
 							// use this tag as destination tag 
-							w.addTag("destination", destLanesTag);
 							destinationTag = destLanesTag;
-							if (log.isDebugEnabled())
-								log.debug("Use destination:lanes tag as destination tag because there is one lane information only. Way ",w.getId(),w.toTagString());
 						}
+						if (destinationTag == null){
+							// try to use the destination:street value
+							destSourceTagKey = "destination:street";
+							destinationTag = w.getTag(destSourceTagKey);
+						}
+						if (destinationTag == null && directedDestination != null) {
+							// use the destination:forward or :backward value
+							destinationTag = directedDestination;
+							destSourceTagKey = "destination:" + directionSuffix; 
+						}
+						if (destinationTag != null && "destination".equals(destSourceTagKey) == false){
+							w.addTag("destination", destinationTag);
+							if (log.isDebugEnabled()){
+								if (destSourceTagKey.startsWith("destination:lanes"))
+									log.debug("Use",destSourceTagKey,"as destination tag because there is one lane information only. Way ",w.getId(),w.toTagString());
+								else 
+									log.debug("Use",destSourceTagKey,"as destination tag. Way ",w.getId(),w.toTagString());
+							}
+						}
+						
 					}
-					
-					if (destinationTag == null && directedDestination != null) {
-						// use the destination:forward or :backward value
-						destinationTag = directedDestination;
-						w.addTag("destination", destinationTag);
+					if (destinationTag != null){
+						destinationLinkWays.put(w.getId(), w);
 					}
-					
-					if (destinationTag != null)
-						destinationLinkWays.put(w.getId(), w);
 				}
 			}
 		}
@@ -735,8 +759,11 @@
 		Set<String> tags = new HashSet<String>();
 		tags.add("highway");
 		tags.add("destination:lanes");
+		tags.add("destination:lanes:forward");
+		tags.add("destination:lanes:backward");
 		tags.add("destination:forward");
 		tags.add("destination:backward");
+		tags.add("destination:street");
 		if (processExits){
 			tags.add("exit_to");
 			tags.add("ref");
Index: resources/help/en/options
===================================================================
--- resources/help/en/options	(revision 3660)
+++ resources/help/en/options	(working copy)
@@ -628,20 +628,26 @@
     are ignored for pedestrian-only ways.      
 
 --process-destination
-	Splits all motorway_link, trunk_link, and primary_link 
-	ways tagged with destination into two or three parts where 
-	the second part is additionally tagged with mkgmap:dest_hint=true. 
+	Splits all motorway_link, trunk_link, primary_link, secondary_link,
+	and tertiary_link ways tagged with destination into two or three parts where 
+	the second part is additionally tagged with mkgmap:dest_hint=true.
+	The code checks for the tags destination, destination:lanes, 
+	destination:street and some variants with :forward/:backward like
+	destination:forward or destination:lanes:backward. If a value for
+	destination is found, the tag destination is set to it and the way is split.
+	This happens before the style rules are processed.
 	This allows to use any routable Garmin type (except 0x08 and 0x09)
 	for that part so that the Garmin device tells the name of
-	this part as hint which destination to follow.
+	this part as hint which destination to follow.     
 	See also --process-exits.
 	
 --process-exits
     Usual Garmin devices do not tell the name of the exit on motorways 
     while routing with mkgmap created maps. This option splits each
-    motorway_link, trunk_link and primary_link way into three parts. 
-	All parts are tagged with the original tags of the link. 
-	Additionally the middle part is tagged with the following tags:
+    motorway_link, trunk_link, primary_link, secondary_link, and tertiary_link 
+		way into three parts. 
+		All parts are tagged with the original tags of the link. 
+		Additionally the middle part is tagged with the following tags:
       mkgmap:exit_hint=true
       mkgmap:exit_hint_ref=<ref tag value of the exit>
       mkgmap:exit_hint_name=<name tag value of the exit>
@@ -649,7 +655,7 @@
     Adding a rule checking the mkgmap:exit_hint=true makes it possible
     to use any routable Garmin type (except 0x08 and 0x09) for the middle 
     part so that the Garmin device tells the name of this middle part as 
-    hint where to leave the motorway/trunk.
+    hint where to leave the major road.
 	The first part must have type 0x08 or 0x09 so that Garmin uses the hint. 
 	
 --delete-tags-file=FILENAME
Index: resources/styles/default/lines
===================================================================
--- resources/styles/default/lines	(revision 3660)
+++ resources/styles/default/lines	(working copy)
@@ -46,31 +46,31 @@
 # Set highway names to include the reference if there is one
 highway=motorway { name '${ref|highway-symbol:hbox} ${name}' | '${ref|highway-symbol:hbox}' | '${name}' }
 
-(highway=motorway_link | highway=trunk_link | highway=primary_link) & mkgmap:exit_hint=true & mkgmap:dest_hint=true
-  { name '${destination:ref|subst: =>} ${destination|subst:;=> |subst:/=> }' | 
+# start of rules for process-exits and process-destination options
+# which may add info to a part of these highway=*_link roads:
+# motorway_link, trunk_link, primary_link, secondary_link, tertiary_link
+# build destination hint 
+dest_hint=* { delete dest_hint }
+mkgmap:dest_hint=true
+  { set dest_hint = '${destination:ref|subst: =>} ${destination|subst:;=> |subst:/=> }' |
          '${ref|subst: =>} ${destination|subst:;=> |subst:/=> }' | 
-         '${destination|subst:;=> |subst:/=> }' |
-         'Exit ${mkgmap:exit_hint_ref} ${mkgmap:exit_hint_name}' | 
-         'Exit ${mkgmap:exit_hint_ref} ${mkgmap:exit_hint_exit_to}' | 
-         'Exit ${mkgmap:exit_hint_exit_to}' |
-         'Exit ${mkgmap:exit_hint_name}' |
-         'Exit ${mkgmap:exit_hint_ref}'
+         '${destination|subst:;=> |subst:/=> }';
        }
-
-(highway=motorway_link | highway=trunk_link | highway=primary_link) & mkgmap:exit_hint!=* & mkgmap:dest_hint=true
-  { name '${destination:ref|subst: =>} ${destination|subst:;=> |subst:/=> }' |
-         '${ref|subst: =>} ${destination|subst:;=> |subst:/=> }' | 
-         '${destination|subst:;=> |subst:/=> }'
-       }
-
-(highway=motorway_link | highway=trunk_link | highway=primary_link) & mkgmap:exit_hint=true & mkgmap:dest_hint!=*
-  { name 'Exit ${mkgmap:exit_hint_ref} ${mkgmap:exit_hint_name}' | 
+# build exit hint 
+exit_hint=* { delete exit_hint }
+mkgmap:exit_hint=true 
+  { set exit_hint = 'Exit ${mkgmap:exit_hint_ref} ${mkgmap:exit_hint_name}' | 
          'Exit ${mkgmap:exit_hint_ref} ${mkgmap:exit_hint_exit_to}' | 
          'Exit ${mkgmap:exit_hint_exit_to}' |
          'Exit ${mkgmap:exit_hint_name}' |
-         'Exit ${mkgmap:exit_hint_ref}'
+         'Exit ${mkgmap:exit_hint_ref}';
        }
-              
+  
+# use destination hint and/or exit hint to build name              
+(mkgmap:exit_hint=true | mkgmap:dest_hint=true)
+  {	name '${exit_hint} ${dest_hint}' | 	'${dest_hint}' | 		'${exit_hint}' }
+# end of rules for process-exits and process-destination options	
+  
 highway=trunk {name '${ref|highway-symbol:hbox} ${name}' | '${ref|highway-symbol:hbox}' | '${name}'; addlabel '${name} (${ref})' }
 highway=primary {name '${ref|highway-symbol:box} ${name}' | '${ref|highway-symbol:box}' | '${name}'; addlabel '${name} (${ref})' }
 highway=secondary | highway=tertiary {name '${ref|highway-symbol:oval} ${name}' | '${ref|highway-symbol:oval}' | '${name}'; addlabel '${name} (${ref})' }
