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 24981)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditContainer.java	(revision 24982)
@@ -71,5 +71,5 @@
  */
 
-public class AddressEditContainer implements Visitor, DataSetListener, IAddressEditContainerListener, IProblemVisitor {
+public class AddressEditContainer implements Visitor, DataSetListener, IAddressEditContainerListener, IProblemVisitor, IAllKnowingTrashHeap {
 	
 	private Collection<? extends OsmPrimitive> workingSet;
@@ -218,5 +218,5 @@
 		if (aNode != null) {
 			addAndClassifyAddress(aNode);
-			aNode.visit(this);
+			aNode.visit(this, this);
 		} 
 		markNodeAsVisited(n);
@@ -542,4 +542,6 @@
 		synchronized (this) {
 			clearData();
+			clearProblems();
+			
 			for (OsmPrimitive osmPrimitive : osmData) {
 				osmPrimitive.visit(this);
@@ -721,3 +723,101 @@
 		}
 	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.fixAddresses.IAllKnowingTrashHeap#getClosestStreetName(java.lang.String)
+	 */
+	@Override
+	public String getClosestStreetName(String name) {
+		List<String> matches = getClosestStreetNames(name, 1);
+		
+		if (matches != null && matches.size() > 0) {
+			return matches.get(0);
+		}
+		
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.fixAddresses.IAllKnowingTrashHeap#getClosestStreetNames(java.lang.String, int)
+	 */
+	@Override
+	public List<String> getClosestStreetNames(String name, int maxEntries) {
+		CheckParameterUtil.ensureParameterNotNull(name, "name");
+		
+		// ensure right number of entries
+		if (maxEntries < 1) maxEntries = 1;
+		
+		List<StreetScore> scores = new ArrayList<StreetScore>();
+		List<String> matches = new ArrayList<String>();
+		
+		// Find the longest common sub string
+		for (String	streetName : streetDict.keySet()) {
+			int score = StringUtils.lcsLength(name, streetName);
+			
+			if (score > 3) { // reasonable value?
+				StreetScore sc = new StreetScore(streetName, score);
+				scores.add(sc);
+			}
+		}
+		
+		// sort by score
+		Collections.sort(scores);
+		
+		// populate result list
+		int n = Math.min(maxEntries, scores.size());
+		for (int i = 0; i < n; i++) {
+			matches.add(scores.get(i).getName());
+		}
+		
+		return matches;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.fixAddresses.IAllKnowingTrashHeap#isValidStreetName(java.lang.String)
+	 */
+	@Override
+	public boolean isValidStreetName(String name) {
+		if (streetDict == null) return false;
+		
+		return streetDict.containsKey(name);
+	}
+	
+	/**
+	 * Internal class to handle results of {@link AddressEditContainer#getClosestStreetNames(String, int)}.
+	 */
+	private class StreetScore implements Comparable<StreetScore> {
+		private String name;
+		private int score;
+		
+		/**
+		 * @param name Name of the street.
+		 * @param score Score of the street (length of longest common substring)
+		 */
+		public StreetScore(String name, int score) {
+			super();
+			this.name = name;
+			this.score = score;
+		}
+
+		/**
+		 * @return the name of the street.
+		 */
+		protected String getName() {
+			return name;
+		}
+
+		/**
+		 * @return the score of the street.
+		 */
+		protected int getScore() {
+			return score;
+		}
+
+		@Override
+		public int compareTo(StreetScore arg0) {
+			if (arg0 == null) return 1;
+			
+			return new Integer(score).compareTo(new Integer(arg0.score));
+		}
+	}
 }
Index: /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressSolution.java
===================================================================
--- /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressSolution.java	(revision 24982)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressSolution.java	(revision 24982)
@@ -0,0 +1,58 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under 
+ * the terms of the GNU General Public License as published by the 
+ * Free Software Foundation, either version 3 of the License, or 
+ * (at your option) any later version. 
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+ * See the GNU General Public License for more details. 
+ * 
+ * You should have received a copy of the GNU General Public License along with this program. 
+ * If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.openstreetmap.josm.plugins.fixAddresses;
+
+import org.openstreetmap.josm.actions.JosmAction;
+
+/**
+ * The Class AddressSolution provides a basic implementation for a problem solution.
+ */
+public class AddressSolution implements ISolution {
+	private JosmAction action;
+	private String description;
+	private SolutionType type;
+	
+	/**
+	 * @param description The solution description.
+	 * @param action The action to execute to solve the problem.
+	 * @param type The solution type.
+	 */
+	public AddressSolution(String description, JosmAction action,
+			SolutionType type) {
+		super();
+		this.description = description;
+		this.action = action;
+		this.type = type;
+	}
+
+	@Override
+	public JosmAction getAction() {
+		return action;
+	}
+
+	@Override
+	public String getDescription() {
+		return description;
+	}
+
+	@Override
+	public SolutionType getType() {
+		return type;
+	}
+
+	@Override
+	public void solve() {
+		// TODO: Remove??
+	}
+}
Index: /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IAllKnowingTrashHeap.java
===================================================================
--- /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IAllKnowingTrashHeap.java	(revision 24982)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IAllKnowingTrashHeap.java	(revision 24982)
@@ -0,0 +1,44 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under 
+ * the terms of the GNU General Public License as published by the 
+ * Free Software Foundation, either version 3 of the License, or 
+ * (at your option) any later version. 
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+ * See the GNU General Public License for more details. 
+ * 
+ * You should have received a copy of the GNU General Public License along with this program. 
+ * If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.openstreetmap.josm.plugins.fixAddresses;
+
+import java.util.List;
+
+public interface IAllKnowingTrashHeap {
+	
+	/**
+	 * Gets the list containing the best matching (closest) street names.
+	 *
+	 * @param name the name of the street to find the matches for.
+	 * @param maxEntries the maximum number of matches.
+	 * @return the closest street names
+	 */
+	public List<String> getClosestStreetNames(String name, int maxEntries);
+	
+	/**
+	 * Gets the closest street name to the given name.
+	 *
+	 * @param name the name of the street to find a match for.
+	 * @return the closest street name
+	 */
+	public String getClosestStreetName(String name);
+	
+	/**
+	 * Checks if the given street name is valid.
+	 *
+	 * @param name the name of the street to check.
+	 * @return true, if street name is valid; otherwise false.
+	 */
+	public boolean isValidStreetName(String name);
+}
Index: /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IOSMEntity.java
===================================================================
--- /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IOSMEntity.java	(revision 24981)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IOSMEntity.java	(revision 24982)
@@ -74,6 +74,7 @@
 	 * Collects problems and possible solutions.
 	 *
+	 * @param trashHeap the trash heap to ask for possible solutions
 	 * @param visitor the problem visitor
 	 */
-	public void visit(IProblemVisitor visitor);
+	public void visit(IAllKnowingTrashHeap trashHeap, IProblemVisitor visitor);
 }
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 24981)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMAddress.java	(revision 24982)
@@ -14,8 +14,11 @@
 package org.openstreetmap.josm.plugins.fixAddresses;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
 import java.util.Collection;
 import java.util.HashMap;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.plugins.fixAddresses.gui.actions.ApplyAllGuessesAction;
+import org.openstreetmap.josm.plugins.fixAddresses.gui.actions.RemoveAddressTagsAction;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -87,5 +90,5 @@
 	
 	/**
-	 * Gets the tag value with guess. If the object does not have the given tag, this mehtod looks for
+	 * Gets the tag value with guess. If the object does not have the given tag, this method looks for
 	 * an appropriate guess. If both, real value and guess, are missing, a question mark is returned.
 	 *
@@ -214,4 +217,19 @@
 	public void applyAllGuesses() {
 		for (String tag : guessedValues.keySet()) {
+			applyGuessForTag(tag);
+		}
+		
+		// Clear all guesses
+		guessedValues.clear();
+		guessedObjects.clear();
+	}
+	
+	/**
+	 * Apply the guessed value for the given tag.
+	 *
+	 * @param tag the tag to apply the guessed value for.
+	 */
+	public void applyGuessForTag(String tag) {
+		if (guessedValues.containsKey(tag)) {
 			String val = guessedValues.get(tag);
 			if (!StringUtils.isNullOrEmpty(val)) {
@@ -219,8 +237,4 @@
 			}
 		}
-		
-		// Clear all guesses
-		guessedValues.clear();
-		guessedObjects.clear();
 	}
 
@@ -539,5 +553,7 @@
 		if (value != null && osm != null) {
 			guessedValues.put(tag, value);
-			guessedObjects.put(tag, osm);
+			if (osm != null) {
+				guessedObjects.put(tag, osm);
+			}
 			fireEntityChanged(this);
 		}
@@ -631,10 +647,88 @@
 	 * @see org.openstreetmap.josm.plugins.fixAddresses.OSMEntityBase#visit(org.openstreetmap.josm.plugins.fixAddresses.IProblemVisitor)
 	 */
-	public void visit(IProblemVisitor visitor) {
+	@Override
+	public void visit(IAllKnowingTrashHeap trashHeap, IProblemVisitor visitor) {
 		CheckParameterUtil.ensureParameterNotNull(visitor, "visitor");
 		
+		// Check for street
 		if (!hasStreetName()) {
+			AddressProblem p = new AddressProblem(this, tr("Address has no street"));
+			if (hasGuessedStreetName()) { // guess exists -> add solution entry
+				String tag = TagUtils.ADDR_STREET_TAG;
+				addGuessValueSolution(p, tag);
+			}
+			addRemoveAddressTagsSolution(p);
+			visitor.addProblem(p);
+		// Street name exists, but is invalid -> ask the all knowing trash heap
+		} else if (!trashHeap.isValidStreetName(getStreetName())) {
+			AddressProblem p = new AddressProblem(this, tr("Address has no valid street"));
+			String match = trashHeap.getClosestStreetName(getStreetName());
 			
-		}
+			if (!StringUtils.isNullOrEmpty(match)) {
+				setGuessedStreetName(match, null);
+				addGuessValueSolution(p, TagUtils.ADDR_STREET_TAG);
+			}
+			visitor.addProblem(p);
+		}
+		
+		// Check for postal code
+		if (!hasPostalCode()) {
+			AddressProblem p = new AddressProblem(this, tr("Address has no post code"));
+			if (hasGuessedStreetName()) {
+				String tag = TagUtils.ADDR_POSTCODE_TAG;
+				addGuessValueSolution(p, tag);
+			}
+			addRemoveAddressTagsSolution(p);
+			visitor.addProblem(p);
+		}
+		
+		// Check for city
+		if (!hasCity()) {
+			AddressProblem p = new AddressProblem(this, tr("Address has no city"));
+			if (hasGuessedStreetName()) {
+				String tag = TagUtils.ADDR_CITY_TAG;
+				addGuessValueSolution(p, tag);
+			}
+			addRemoveAddressTagsSolution(p);
+			visitor.addProblem(p);
+		}
+		
+		// Check for country
+		if (!hasCountry()) {
+			// TODO: Add guess for country
+			AddressProblem p = new AddressProblem(this, tr("Address has no country"));
+			addRemoveAddressTagsSolution(p);
+			visitor.addProblem(p);
+		}
+	}
+
+	/**
+	 * Adds the guess value solution to a problem.
+	 *
+	 * @param p the problem to add the solution to.
+	 * @param tag the tag to change.
+	 */
+	private void addGuessValueSolution(AddressProblem p, String tag) {
+		AddressSolution s = new AddressSolution(
+				String.format("%s '%s'", tr("Assign to"), getGuessedValue(tag)), 
+				new ApplyAllGuessesAction(tag),
+				SolutionType.Change);
+		
+		p.addSolution(s);
+	}
+	
+	/**
+	 * Adds the remove address tags solution entry to a problem.
+	 *
+	 * @param problem the problem
+	 */
+	private void addRemoveAddressTagsSolution(IProblem problem) {
+		CheckParameterUtil.ensureParameterNotNull(problem, "problem");
+		
+		AddressSolution s = new AddressSolution(
+						tr("Remove all address tags"), 
+						new RemoveAddressTagsAction(),
+						SolutionType.Remove);
+		problem.addSolution(s);
 	}
 	
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 24981)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/OSMEntityBase.java	(revision 24982)
@@ -203,6 +203,9 @@
 	}
 	
-	@Override
-	public void visit(IProblemVisitor visitor) {
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity#visit(org.openstreetmap.josm.plugins.fixAddresses.IAllKnowingTrashHeap, org.openstreetmap.josm.plugins.fixAddresses.IProblemVisitor)
+	 */
+	@Override
+	public void visit(IAllKnowingTrashHeap trashHeap, IProblemVisitor visitor) {
 		// do nothing
 	}
Index: /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/actions/AbstractAddressEditAction.java
===================================================================
--- /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/actions/AbstractAddressEditAction.java	(revision 24981)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/actions/AbstractAddressEditAction.java	(revision 24982)
@@ -176,5 +176,5 @@
 	public void entityChanged(IOSMEntity node) {
 		container.removeProblemsOfSource(node); // clear problems of changed node...
-		node.visit(container);					// .. and revisit it.
+		node.visit(container, container);					// .. and revisit it.
 		updateEnabledState();		
 	}
Index: /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/actions/ApplyAllGuessesAction.java
===================================================================
--- /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/actions/ApplyAllGuessesAction.java	(revision 24981)
+++ /applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/actions/ApplyAllGuessesAction.java	(revision 24982)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.plugins.fixAddresses.OSMAddress;
 import org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.StringUtils;
 import org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditSelectionEvent;
 import org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel;
@@ -38,10 +39,18 @@
 @SuppressWarnings("serial")
 public class ApplyAllGuessesAction extends AbstractAddressEditAction implements MouseListener{
-
+	private String tag;
+	/**
+	 * Instantiates a new "apply all guesses" action.
+	 */
+	public ApplyAllGuessesAction(String tag) {	
+		super(tr("Apply"), "applyguesses_24", tr("Turns all guesses into the corresponding tag values."));
+		this.tag = tag;
+	}
+	
 	/**
 	 * Instantiates a new "apply all guesses" action.
 	 */
 	public ApplyAllGuessesAction() {	
-		super(tr("Apply"), "applyguesses_24", tr("Turns all guesses into the corresponding tag values."));
+		this(null);
 	}
 
@@ -54,5 +63,4 @@
 		
 		if (ev.getSelectedUnresolvedAddresses() != null) {
-			// fix SELECTED items only
 			List<OSMAddress> addrToFix = ev.getSelectedUnresolvedAddresses();
 			applyGuesses(addrToFix);
@@ -60,5 +68,4 @@
 		
 		if (ev.getSelectedIncompleteAddresses() != null) {
-			// fix SELECTED items only
 			List<OSMAddress> addrToFix = ev.getSelectedIncompleteAddresses();
 			applyGuesses(addrToFix);
@@ -84,5 +91,10 @@
 		for (OSMAddress aNode : addrToFixShadow) {
 			beginObjectTransaction(aNode);
-			aNode.applyAllGuesses();
+			
+			if (StringUtils.isNullOrEmpty(tag)) { // tag given?
+				aNode.applyAllGuesses(); // no -> apply all guesses
+			} else { // apply guessed values for single tag only
+				aNode.applyGuessForTag(tag);
+			}
 			finishObjectTransaction(aNode);
 		}
