Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/GuessAddressRunnable.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/GuessAddressRunnable.java	(revision 24208)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/GuessAddressRunnable.java	(revision 24209)
@@ -48,12 +48,21 @@
 	private boolean cancelled;
 	
-	/**
-	 * @param nodes
-	 */
-	public GuessAddressRunnable(List<OSMAddress> nodes, String title) {
+	
+	/**
+	 * Instantiates a new guess address runnable.
+	 *
+	 * @param addresses the addresses to guess the values for
+	 * @param title the title of progress monitor
+	 */
+	public GuessAddressRunnable(List<OSMAddress> addresses, String title) {
 		super(title != null ? title : tr("Searching"));
-		setAddressEditContainer(nodes);		
-	}
-
+		setAddressEditContainer(addresses);		
+	}
+
+	/**
+	 * Sets the address edit container.
+	 *
+	 * @param nodes the new address edit container
+	 */
 	public void setAddressEditContainer(List<OSMAddress> nodes) {
 		if (isRunning) {
@@ -63,4 +72,9 @@
 	}
 
+	/**
+	 * Gets the addresses to guess.
+	 *
+	 * @return the addresses to guess
+	 */
 	public List<OSMAddress> getAddressesToGuess() {
 		return addressesToGuess;
@@ -91,4 +105,7 @@
 	}
 
+	/**
+	 * Fires the 'finished' event after the thread has done his work.
+	 */
 	protected void fireFinished() {
 		for (IProgressMonitorFinishedListener l : finishListeners) {
@@ -262,5 +279,5 @@
 					minDist = dist;
 					currentValue = TagUtils.getNameValue(w);				
-					aNode.setGuessedValue(getTag(), currentValue);
+					aNode.setGuessedValue(getTag(), currentValue, w);
 				} else {
 					//System.out.println(String.format("Skipped %s: %4.2f m", TagUtils.getNameValue(w), dist));
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 24208)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/GuessedValueHandler.java	(revision 24209)
@@ -143,5 +143,5 @@
 				minDist = dist;
 				currentValue = n.get(tag);			
-				aNode.setGuessedValue(tag, currentValue);
+				aNode.setGuessedValue(tag, currentValue, n);
 			}
 		}
@@ -158,5 +158,5 @@
 				minDist = dist;
 				currentValue = w.get(tag);				
-				aNode.setGuessedValue(tag, currentValue);
+				aNode.setGuessedValue(tag, currentValue, w);
 			}
 		}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMAddress.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMAddress.java	(revision 24208)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMAddress.java	(revision 24209)
@@ -17,4 +17,5 @@
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
@@ -30,4 +31,6 @@
 	/** The dictionary containing guessed values. */
 	private HashMap<String, String> guessedValues = new HashMap<String, String>();
+	/** The dictionary containing guessed objects. */
+	private HashMap<String, OsmPrimitive> guessedObjects = new HashMap<String, OsmPrimitive>();
 	/** The dictionary containing indirect values. */
 	private HashMap<String, String> derivedValues = new HashMap<String, String>();
@@ -116,5 +119,5 @@
 	
 	/**
-	 * Returns the street name guessed by the nearest-neighbour search.
+	 * Returns the street name guessed by the nearest-neighbor search.
 	 * @return the guessedStreetName
 	 */
@@ -124,8 +127,11 @@
 
 	/**
+	 * Sets the guessed street name.
+	 *
 	 * @param guessedStreetName the guessedStreetName to set
-	 */
-	public void setGuessedStreetName(String guessedStreetName) {
-		setGuessedValue(TagUtils.ADDR_STREET_TAG, guessedStreetName);
+	 * @param srcObj the source object of the guess.
+	 */
+	public void setGuessedStreetName(String guessedStreetName, OsmPrimitive srcObj) {
+		setGuessedValue(TagUtils.ADDR_STREET_TAG, guessedStreetName, srcObj);
 	}
 	
@@ -147,8 +153,11 @@
 
 	/**
+	 * Sets the guessed post code.
+	 *
 	 * @param guessedPostCode the guessedPostCode to set
-	 */
-	public void setGuessedPostCode(String guessedPostCode) {
-		setGuessedValue(TagUtils.ADDR_POSTCODE_TAG, guessedPostCode);
+	 * @param srcObj srcObj the source object of the guess
+	 */
+	public void setGuessedPostCode(String guessedPostCode, OsmPrimitive srcObj) {
+		setGuessedValue(TagUtils.ADDR_POSTCODE_TAG, guessedPostCode, srcObj);
 	}
 	
@@ -170,8 +179,11 @@
 
 	/**
+	 * Sets the guessed city.
+	 *
 	 * @param guessedCity the guessedCity to set
-	 */
-	public void setGuessedCity(String guessedCity) {
-		setGuessedValue(TagUtils.ADDR_CITY_TAG, guessedCity);
+	 * @param srcObj the source object of the guess
+	 */
+	public void setGuessedCity(String guessedCity, OsmPrimitive srcObj) {
+		setGuessedValue(TagUtils.ADDR_CITY_TAG, guessedCity, srcObj);
 	}
 
@@ -203,5 +215,8 @@
 			}
 		}
+		
+		// Clear all guesses
 		guessedValues.clear();
+		guessedObjects.clear();
 	}
 
@@ -404,12 +419,30 @@
 	/**
 	 * Gets the guessed value for the given tag.
+	 *
 	 * @param tag The tag to get the guessed value for.
-	 * @return
+	 * @return the guessed value
 	 */
 	public String getGuessedValue(String tag) {
+		CheckParameterUtil.ensureParameterNotNull(tag, "tag");
+		
 		if (!hasGuessedValue(tag)) {
 			return null;			
 		}
 		return guessedValues.get(tag);
+	}
+	
+	/**
+	 * Gets the guessed object.
+	 *
+	 * @param tag the guessed tag
+	 * @return the object which has been selected for the guess
+	 */
+	public OsmPrimitive getGuessedObject(String tag) {
+		CheckParameterUtil.ensureParameterNotNull(tag, "tag");
+		
+		if (guessedObjects.containsKey(tag)) {
+			return guessedObjects.get(tag);
+		}
+		return null;
 	}
 	
@@ -450,4 +483,6 @@
 	 */
 	private boolean hasGuessedValue(String tag) {
+		CheckParameterUtil.ensureParameterNotNull(tag, "tag");
+		
 		return guessedValues.containsKey(tag) && 
 			!StringUtils.isNullOrEmpty(guessedValues.get(tag));
@@ -460,6 +495,11 @@
 	 * @param value the value of the guessed tag.
 	 */
-	public void setGuessedValue(String tag, String value) {
+	public void setGuessedValue(String tag, String value, OsmPrimitive osm) {
+		CheckParameterUtil.ensureParameterNotNull(tag, "tag");
+		CheckParameterUtil.ensureParameterNotNull(value, "value");
+		CheckParameterUtil.ensureParameterNotNull(osm, "osm");
+		
 		guessedValues.put(tag, value);
+		guessedObjects.put(tag, osm);
 		fireEntityChanged(this);
 	}
@@ -472,4 +512,6 @@
 	 */
 	private boolean hasDerivedValue(String tag) {
+		CheckParameterUtil.ensureParameterNotNull(tag, "tag");
+		
 		return derivedValues.containsKey(tag) && 
 			!StringUtils.isNullOrEmpty(derivedValues.get(tag));
