Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditContainer.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditContainer.java	(revision 24026)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditContainer.java	(revision 24028)
@@ -89,10 +89,12 @@
 	private List<AddressNode> shadowIncompleteAddresses = new ArrayList<AddressNode>(100);
 	
-	/** The visited nodes cache to increase iteration spped. */
+	/** The visited nodes cache to increase iteration speed. */
 	private HashSet<Node> visitedNodes = new HashSet<Node>();
-	/** The visited ways cache to increase iteration spped. */
+	/** The visited ways cache to increase iteration speed. */
 	private HashSet<Way> visitedWays = new HashSet<Way>();	
 	/** The tag list used within the data area. */
 	private HashSet<String> tags = new HashSet<String>();
+	/** The tag list used within the data area. */
+	private HashMap<String, String> values = new HashMap<String, String>();
 	
 	/** The change listeners. */
@@ -241,18 +243,8 @@
 			// Assignment failed: Street is not known (yet) -> add to 'unresolved' list 
 			shadowUnresolvedAddresses.add(aNode);
-			
-			if ("BaDaubringen".equals(aNode.getCity())) {
-				@SuppressWarnings("unused")
-				int x = 0;
-			}
 		}
 
 		if (!aNode.isComplete()) {
 			shadowIncompleteAddresses.add(aNode);
-			
-			if ("BaDaubringen".equals(aNode.getCity())) {
-				@SuppressWarnings("unused")
-				int x = 0;
-			}
 		}
 	}
@@ -276,4 +268,9 @@
 				if (!tags.contains(key)) {
 					tags.add(key);
+				}
+				
+				String v = w.get(key);
+				if (!values.containsKey(v)) {
+					values.put(v, key);
 				}
 			}
@@ -395,5 +392,12 @@
 		return tags;
 	}
-	
+		
+	/**
+	 * @return the values
+	 */
+	protected HashMap<String, String> getValues() {
+		return values;
+	}
+
 	/**
 	 * Gets the number of streets in the container.
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressFinderThread.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressFinderThread.java	(revision 24026)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressFinderThread.java	(revision 24028)
@@ -211,5 +211,11 @@
 					// guess values 
 					for (int i = 0; i < guessers.length; i++) {
+						if (!guessers[i].needsGuess()) continue;
+						
 						osmPrimitive.visit(guessers[i]);
+						
+						if (guessers[i].currentValue == null && i == 0) {
+							System.err.println("Guess #" + i + " failed for " + aNode);
+						}
 					}
 				}
@@ -243,5 +249,5 @@
 		@Override
 		public void visit(Way w) {			
-			if (TagUtils.hasHighwayTag(w)) {
+			if (TagUtils.isStreetSupportingHousenumbers(w)) {
 				AddressNode aNode = getAddressNode();
 				double dist = OsmUtils.getMinimumDistanceToWay(aNode.getCoor(), w);
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressNode.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressNode.java	(revision 24026)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressNode.java	(revision 24028)
@@ -342,8 +342,18 @@
 	 * has either no street name, post code or city.
 	 *
+	 * @return true, if this instance needs at least one guessed value.
+	 */
+	public boolean needsGuess() {
+		return 	needsGuessedValue(TagUtils.ADDR_CITY_TAG) ||
+				needsGuessedValue(TagUtils.ADDR_POSTCODE_TAG) ||
+				needsGuessedValue(TagUtils.ADDR_STREET_TAG);
+	}
+	
+	/**
+	 * Check if this instance needs guessed value for a given tag.
 	 * @return true, if successful
 	 */
-	public boolean needsGuess() {
-		return !hasStreetName() || !hasCity() || !hasPostCode();
+	public boolean needsGuessedValue(String tag) {
+		return MISSING_TAG.equals(getTagValueWithGuess(tag));
 	}
 	
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/FixUnresolvedStreetsAction.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/FixUnresolvedStreetsAction.java	(revision 24026)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/FixUnresolvedStreetsAction.java	(revision 24028)
@@ -40,4 +40,5 @@
 		
 		addressEditContainer = new AddressEditContainer();
+				
 		DataSet.addSelectionListener(this);		
 	}
@@ -60,4 +61,5 @@
 			addressEditContainer.attachToDataSet(newSelection);
 			try {
+				//generateTagCode(addressEditContainer);
 				AddressEditDialog dlg = new AddressEditDialog(addressEditContainer);
 				dlg.setVisible(true);
@@ -111,4 +113,14 @@
 					.toUpperCase().replaceAll(":", "_"), tag));
 		}
+				
+		for (String value : addrVisitor.getValues().keySet()) {
+			String tag = addrVisitor.getValues().get(value);
+			
+			String tags = tag.toUpperCase().replaceAll(":", "_"); 
+			String values = value.toUpperCase().replaceAll(":", "_");
+			System.out.println(String.format(
+					"public static final String %s_%s_VALUE = \"%s\";", tags, values
+					, value));
+		}
 	}
 
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/GuessedValueHandler.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/GuessedValueHandler.java	(revision 24026)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/GuessedValueHandler.java	(revision 24028)
@@ -123,4 +123,13 @@
 	}
 	
+	/**
+	 * Check if we need to visit the OSM data
+	 *
+	 * @return true, if successful
+	 */
+	public boolean needsGuess() {
+		return aNode.needsGuessedValue(tag);
+	}
+	
 	/* (non-Javadoc)
 	 * @see org.openstreetmap.josm.data.osm.visitor.Visitor#visit(org.openstreetmap.josm.data.osm.Node)
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OsmUtils.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OsmUtils.java	(revision 24026)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OsmUtils.java	(revision 24028)
@@ -72,4 +72,5 @@
 		double min = Math.min(Math.min(ac, mc), bc);
 		
+				
 		if (min < 5.0) { // close enough?
 			return min;
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/TagUtils.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/TagUtils.java	(revision 24026)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/TagUtils.java	(revision 24028)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Way;
 
 /**
@@ -1877,4 +1878,27 @@
 	public static String getEmbankmentValue(OsmPrimitive osmPrimitive) {
 		return osmPrimitive != null ? osmPrimitive.get(EMBANKMENT_TAG) : null;
+	}
+	
+	/**
+	 * Checks if the given street supporting housenumbers. Usually motor ways and primary roads have 
+	 * no addresses, also no paths or tracks.
+	 *
+	 * @param w the w
+	 * @return true, if is street supporting housenumbers
+	 */
+	public static boolean isStreetSupportingHousenumbers(Way w) {
+		if (w == null) return false;
+		if (!hasHighwayTag(w)) {
+			return false;
+		}
+		
+		// TODO: Should be configurable
+		String hwType = getHighwayValue(w);
+				
+		return 	HIGHWAY_RESIDENTIAL_VALUE.equals(hwType) ||
+				HIGHWAY_SECONDARY_VALUE.equals(hwType) ||
+				HIGHWAY_TERTIARY_VALUE.equals(hwType) ||
+				HIGHWAY_LIVING_STREET_VALUE.equals(hwType) ||
+				HIGHWAY_UNCLASSIFIED_VALUE.equals(hwType);
 	}
 	
@@ -2005,4 +2029,22 @@
 	public static final String ADDR_HOUSENAME_TAG = "addr:housename";
 	
+	/* Highway types */
+	public static final String HIGHWAY_CYCLEWAY_VALUE = "cycleway";
+	public static final String HIGHWAY_FOOTWAY_VALUE = "footway";
+	public static final String HIGHWAY_MOTORWAY_LINK_VALUE = "motorway_link";
+	public static final String HIGHWAY_MOTORWAY_VALUE = "motorway";
+	public static final String HIGHWAY_PATH_VALUE = "path";
+	public static final String HIGHWAY_RESIDENTIAL_VALUE = "residential";
+	public static final String HIGHWAY_LIVING_STREET_VALUE = "living_street";
+	public static final String HIGHWAY_ROAD_VALUE = "road";
+	public static final String HIGHWAY_SECONDARY_VALUE = "secondary";
+	public static final String HIGHWAY_SERVICE_VALUE = "service";
+	public static final String HIGHWAY_STEPS_VALUE = "steps";
+	public static final String HIGHWAY_TERTIARY_VALUE = "tertiary";
+	public static final String HIGHWAY_TRACK_VALUE = "track";
+	public static final String HIGHWAY_TRUNK_LINK_VALUE = "trunk_link";
+	public static final String HIGHWAY_TRUNK_VALUE = "trunk";
+	public static final String HIGHWAY_UNCLASSIFIED_VALUE = "unclassified";
+
 	/* Relation keys */
 	
