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 24114)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMAddress.java	(revision 24115)
@@ -41,4 +41,6 @@
 		super.setOsmObject(osmObject);
 		
+		OsmUtils.getValuesFromAddressInterpolation(this);
+		
 		String streetNameViaRel = OsmUtils.getAssociatedStreet(this.osmObject);
 		if (!StringUtils.isNullOrEmpty(streetNameViaRel)) {
@@ -99,5 +101,5 @@
 	 */
 	public boolean hasStreetName() {
-		return TagUtils.hasAddrStreetTag(osmObject);
+		return TagUtils.hasAddrStreetTag(osmObject) || hasDerivedValue(TagUtils.ADDR_STREET_TAG);
 	}
 	
@@ -187,7 +189,8 @@
 			String val = guessedValues.get(tag);
 			if (!StringUtils.isNullOrEmpty(val)) {
-				setOSMTag(tag, val);
+				setOSMTag(tag, val);				
 			}
 		}
+		guessedValues.clear();
 	}
 
@@ -206,5 +209,5 @@
 	 */
 	public boolean hasPostCode() {
-		return TagUtils.hasAddrPostcodeTag(osmObject);
+		return hasTag(TagUtils.ADDR_POSTCODE_TAG);
 	}
 	
@@ -231,8 +234,8 @@
 	 * Checks for city tag.
 	 *
-	 * @return true, if successful
+	 * @return true, if a city tag is present or available via referrer.
 	 */
 	public boolean hasCity() {
-		return TagUtils.hasAddrCityTag(osmObject);
+		return hasTag(TagUtils.ADDR_CITY_TAG);
 	}
 	
@@ -242,23 +245,35 @@
 	 */
 	public String getState() {
-		if (!TagUtils.hasAddrStateTag(osmObject)) {
-			return MISSING_TAG;
-		}
-		return TagUtils.getAddrStateValue(osmObject);
-	}
-
-	/**
-	 * Gets the name of the state associated with this address.
+		return getTagValueWithGuess(TagUtils.ADDR_STATE_TAG);
+	}
+	
+	/**
+	 * Checks for state tag.
+	 *
+	 * @return true, if a state tag is present or available via referrer.
+	 */
+	public boolean hasState() {
+		return hasTag(TagUtils.ADDR_STATE_TAG);
+	}
+
+	/**
+	 * Gets the name of the country associated with this address.
 	 * @return
 	 */
 	public String getCountry() {
-		if (!TagUtils.hasAddrCountryTag(osmObject)) {
-			return MISSING_TAG;
-		}
-		return TagUtils.getAddrCountryValue(osmObject);
-	}
-	
-	/**
-	 * Removes all addresss related tags from the node or way.
+		return getTagValueWithGuess(TagUtils.ADDR_COUNTRY_TAG);
+	}
+	
+	/**
+	 * Checks for country tag.
+	 *
+	 * @return true, if a country tag is present or available via referrer.
+	 */
+	public boolean hasCountry() {
+		return hasTag(TagUtils.ADDR_COUNTRY_TAG);
+	}
+	
+	/**
+	 * Removes all address-related tags from the node or way.
 	 */
 	public void removeAllAddressTags() {
@@ -269,4 +284,16 @@
 		removeOSMTag(TagUtils.ADDR_STATE_TAG);
 		removeOSMTag(TagUtils.ADDR_STREET_TAG);
+	}
+	
+	/**
+	 * Checks if the associated OSM object has the given tag or if the tag is available via a referrer.
+	 *
+	 * @param tag the tag to look for.
+	 * @return true, if there is a value for the given tag.
+	 */
+	public boolean hasTag(String tag) {
+		if (StringUtils.isNullOrEmpty(tag)) return false;
+		
+		return TagUtils.hasTag(osmObject, tag) || hasDerivedValue(tag);
 	}
 	
@@ -403,4 +430,12 @@
 	
 	/**
+	 * Returns true, if this instance has derived values from any referrer.
+	 * @return
+	 */
+	public boolean hasDerivedValues() {
+		return derivedValues.size() > 0; 
+	}
+	
+	/**
 	 * Gets the derived value for the given tag.
 	 * @param tag The tag to get the derived value for.
Index: /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMEntityBase.java
===================================================================
--- /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMEntityBase.java	(revision 24114)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMEntityBase.java	(revision 24115)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
@@ -56,4 +57,5 @@
 	 */
 	protected void setOsmObject(OsmPrimitive osmObject) {
+		CheckParameterUtil.ensureParameterNotNull(osmObject, "osmObject");
 		this.osmObject = osmObject;
 	}
@@ -64,4 +66,5 @@
 	 */
 	public static void addChangedListener(IAddressEditContainerListener listener) {
+		CheckParameterUtil.ensureParameterNotNull(listener, "listener");
 		containerListeners.add(listener);
 	}
@@ -72,4 +75,5 @@
 	 */
 	public static void removeChangedListener(IAddressEditContainerListener listener) {
+		CheckParameterUtil.ensureParameterNotNull(listener, "listener");
 		containerListeners.remove(listener);
 	}
@@ -79,4 +83,5 @@
 	 */
 	protected static void fireEntityChanged(IOSMEntity entity) {
+		CheckParameterUtil.ensureParameterNotNull(entity, "entity");
 		for (IAddressEditContainerListener listener : containerListeners) {
 			listener.entityChanged(entity);
@@ -89,4 +94,5 @@
 	 */
 	public void addCommandListener(ICommandListener listener) {
+		CheckParameterUtil.ensureParameterNotNull(listener, "listener");
 		cmdListeners.add(listener);
 	}
@@ -97,4 +103,5 @@
 	 */
 	public void removeCommandListener(ICommandListener listener) {
+		CheckParameterUtil.ensureParameterNotNull(listener, "listener");
 		cmdListeners.remove(listener);
 	}
@@ -104,7 +111,8 @@
 	 *
 	 * @param source the entity that issued the command.
-	 * @param cmd the command to execute.
-	 */
-	protected void fireCommandIssued(Command cmd) {
+	 * @param command the command to execute.
+	 */
+	protected void fireCommandIssued(Command command) {
+		CheckParameterUtil.ensureParameterNotNull(command, "command");
 		if (cmdListeners.size() == 0) {
 			throw new RuntimeException("Object has no TX context: " + this);
@@ -112,5 +120,5 @@
 		
 		for (ICommandListener l : cmdListeners) {
-			l.commandIssued(this, cmd);
+			l.commandIssued(this, command);
 		}
 	}	
@@ -154,4 +162,5 @@
 	 */
 	protected void setOSMTag(String tag, String newValue) {
+		CheckParameterUtil.ensureParameterNotNull(tag, "tag");		
 		if (StringUtils.isNullOrEmpty(tag)) return;
 		
@@ -170,4 +179,5 @@
 	 */
 	protected void removeOSMTag(String tag) {
+		CheckParameterUtil.ensureParameterNotNull(tag, "tag");
 		setOSMTag(tag, null); // a value of null removes the tag
 	}
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 24114)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OsmUtils.java	(revision 24115)
@@ -118,3 +118,36 @@
 		return null;
 	}
+	
+	/**
+	 * Gets the tag values from an address interpolation ref, if present.
+	 *
+	 * @param address the address
+	 * @return the values from address interpolation
+	 */
+	public static boolean getValuesFromAddressInterpolation(OSMAddress address) {
+		if (address == null) return false;
+		
+		OsmPrimitive osmAddr = address.getOsmObject();
+		
+		for (OsmPrimitive osm : osmAddr.getReferrers()) {
+			if (osm instanceof Way) {
+				Way w = (Way) osm;
+				if (TagUtils.hasAddrInterpolationTag(w)) {					
+					applyDerivedValue(address, w, TagUtils.ADDR_POSTCODE_TAG);
+					applyDerivedValue(address, w, TagUtils.ADDR_CITY_TAG);
+					applyDerivedValue(address, w, TagUtils.ADDR_COUNTRY_TAG);
+					applyDerivedValue(address, w, TagUtils.ADDR_STREET_TAG);
+					return true;
+				}
+			}
+		}
+		
+		return false;
+	}
+
+	private static void applyDerivedValue(OSMAddress address, Way w, String tag) {
+		if (!address.hasTag(tag) && TagUtils.hasTag(w, tag)) {						
+			address.setDerivedValue(tag, w.get(tag));
+		}
+	}
 }
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 24114)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/TagUtils.java	(revision 24115)
@@ -27,4 +27,15 @@
  */
 public final class TagUtils {
+	
+	/**
+	 * Checks if the given OSM object has a (non-empty) value for the given tag.
+	 *
+	 * @param osm the osm object to inspect.
+	 * @param tag the tag to look for.
+	 * @return true, if osm object has a non-empty value for this tag 
+	 */
+	public static boolean hasTag(OsmPrimitive osm, String tag) {
+		return osm != null && !StringUtils.isNullOrEmpty(osm.get(tag));
+	}
 	
 	/**
