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 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditContainer.java	(revision 23933)
@@ -0,0 +1,450 @@
+/*
+ * 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/>.
+ */
+/**
+ * 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/>.
+ */
+
+/* File created on 24.10.2010 */
+package org.openstreetmap.josm.plugins.fixAddresses;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataSetListener;
+import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
+import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
+import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
+import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.data.osm.visitor.Visitor;
+
+/**
+ *
+ * @author Oliver Wieland <oliver.wieland@online.de>
+ * 
+ */
+
+public class AddressEditContainer implements Visitor, DataSetListener, IAddressEditContainerListener {
+	private HashMap<String, StreetNode> streetDict = new HashMap<String, StreetNode>(100); 
+	private List<AddressNode> unresolvedAddresses = new ArrayList<AddressNode>(100);
+	private List<AddressNode> incompleteAddresses = new ArrayList<AddressNode>(100);
+	private HashMap<String, AddressNode> addressCache = new HashMap<String, AddressNode>();
+	private HashSet<Node> visitedNodes = new HashSet<Node>();
+	private HashSet<Way> visitedWays = new HashSet<Way>();
+	private HashSet<String> tags = new HashSet<String>();
+	
+	private List<IAddressEditContainerListener> listeners = new ArrayList<IAddressEditContainerListener>();
+	
+	/**
+	 * 
+	 */
+	public AddressEditContainer() {
+		NodeEntityBase.addChangedListener(this);
+	}
+
+	/**
+	 * Adds a change listener.
+	 * @param listener
+	 */
+	public void addChangedListener(IAddressEditContainerListener listener) {
+		listeners.add(listener);
+	}
+	
+	/**
+	 * Removes a change listener.
+	 * @param listener
+	 */
+	public void removeChangedListener(IAddressEditContainerListener listener) {
+		listeners.remove(listener);
+	}
+	
+	/**
+	 * Notifies clients that the address container changed.
+	 */
+	protected void fireContainerChanged() {
+		for (IAddressEditContainerListener listener : listeners) {
+			listener.containerChanged(this);
+		}
+	}
+	
+	private void markNodeAsVisited(Node n) {
+		visitedNodes.add(n);
+	}
+	
+	private boolean hasBeenVisited(Node n) {
+		return visitedNodes.contains(n);
+	}
+	
+	private void markWayAsVisited(Way w) {
+		visitedWays.add(w);
+	}
+	
+	private boolean hasBeenVisited(Way w) {
+		return visitedWays.contains(w);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.data.osm.visitor.Visitor#visit(org.openstreetmap.josm.data.osm.Node)
+	 */
+	@Override
+	public void visit(Node n) {
+		if (hasBeenVisited(n)) {
+			return;
+		}
+	
+		String aid = "" + n.getId();
+		AddressNode aNode = null;
+		if (!addressCache.containsKey(aid)) {
+			aNode = NodeFactory.createNode(n);
+			if (aNode != null) {
+				addressCache.put(aid, aNode);
+			}
+		} else {
+			aNode = addressCache.get(aid);
+			aNode.setOsmObject(n);
+		}
+		
+		if (aNode != null) {
+			if (!assignAddressToStreet(aNode)) {
+				// Assignment failed: Street is not known (yet) -> add to 'unresolved' list 
+				unresolvedAddresses.add(aNode);
+			}
+
+			if (!aNode.isComplete()) {
+				incompleteAddresses.add(aNode);
+			}
+		} else {
+			// check, if node is referred by a way
+			for (OsmPrimitive osm : n.getReferrers()) {
+				if (osm instanceof Way) {
+					Way w = (Way) osm;
+					if (!hasBeenVisited(w)) {
+						createNodeFromWay(w);
+					}
+				}
+			}
+			
+		}
+		markNodeAsVisited(n);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.data.osm.visitor.Visitor#visit(org.openstreetmap.josm.data.osm.Way)
+	 */
+	@Override
+	public void visit(Way w) {
+		// This doesn't matter, we just need the street name 
+		//if (w.isIncomplete()) return;
+		
+		createNodeFromWay(w);
+		/*
+        for (Node n : w.getNodes()) {
+            
+        }*/
+	}
+
+	private void createNodeFromWay(Way w) {
+		StreetSegmentNode newSegment = NodeFactory.createNodeFromWay(w);
+		
+		if (newSegment != null) {
+			String name = newSegment.getName();
+			if (StringUtils.isNullOrEmpty(name)) return;
+			
+			StreetNode sNode = null;
+			if (streetDict.containsKey(name)) {
+				sNode = streetDict.get(name);
+			} else {
+				sNode = new StreetNode(w);
+				streetDict.put(name, sNode);
+			}
+			
+			if (sNode != null) {
+				// TODO: Check if segment really belongs to the street, even if the
+				// names are the same. Then the streets should be split up...
+				sNode.addStreetSegment(newSegment);
+			} else {
+				throw new RuntimeException("Street node is null!");
+			}
+		}
+		
+		markWayAsVisited(w);
+		
+		// Look also into nodes for addresses (unlikely, but at least they
+		// get marked as visited).
+		for (Node n : w.getNodes()) {
+			visit(n);
+		}
+		
+		for (String key : w.keySet()) {
+			if (!tags.contains(key)) {
+				tags.add(key);
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.data.osm.visitor.Visitor#visit(org.openstreetmap.josm.data.osm.Relation)
+	 */
+	@Override
+	public void visit(Relation e) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.data.osm.visitor.Visitor#visit(org.openstreetmap.josm.data.osm.Changeset)
+	 */
+	@Override
+	public void visit(Changeset cs) {
+	}
+
+	/**
+	 * Gets the dictionary contains the collected streets.
+	 * @return
+	 */
+	public HashMap<String, StreetNode> getStreetDict() {
+		return streetDict;
+	}
+	
+	public List<AddressNode> getUnresolvedAddresses() {
+		return unresolvedAddresses;
+	}
+
+	public List<AddressNode> getIncompleteAddresses() {
+		return incompleteAddresses;
+	}
+
+	public List<StreetNode> getStreetList() {
+		
+		ArrayList<StreetNode> sortedList = new ArrayList<StreetNode>(streetDict.values());
+		Collections.sort(sortedList);
+		return sortedList;
+	}
+
+	public List<AddressNode> getUnresolvedItems() {
+		return unresolvedAddresses;
+	}
+
+	public HashSet<String> getTags() {
+		return tags;
+	}
+	
+	/**
+	 * Gets the number of streets in the container.
+	 * @return
+	 */
+	public int getNumberOfStreets() {
+		return streetDict != null ? streetDict.size() : 0;
+	}
+	
+	/**
+	 * Get the number of incomplete addresses.
+	 * @return
+	 */
+	public int getNumberOfIncompleteAddresses() {
+		return incompleteAddresses != null ? incompleteAddresses.size() : 0;
+	}
+	
+	/**
+	 * Gets the number of unresolved addresses.
+	 * @return
+	 */
+	public int getNumberOfUnresolvedAddresses() {
+		return unresolvedAddresses != null ? unresolvedAddresses.size() : 0;
+	}
+	
+	/**
+	 * Gets the number of guessed tags.
+	 * @return
+	 */
+	public int getNumberOfGuesses() {
+		int sum = 0;
+				
+		for (AddressNode aNode : getAllAddressesToFix()) {
+			if (aNode.hasGuesses()) {
+				sum++;
+			}
+		}
+		return sum;
+	}
+	
+	/**
+	 * Gets all (incomplete and/or unresolved) address nodes to fix.
+	 * @return
+	 */
+	public List<AddressNode> getAllAddressesToFix() {
+		List<AddressNode> all = new ArrayList<AddressNode>(incompleteAddresses);
+
+		for (AddressNode aNode : unresolvedAddresses) {
+			if (!all.contains(aNode)) {
+				all.add(aNode);
+			}
+		}
+		
+		return all; 
+	}
+
+	/**
+	 * Tries to assign an address to a street.
+	 * @param aNode
+	 */
+	private boolean assignAddressToStreet(AddressNode aNode) {
+		String streetName = aNode.getStreet();
+		
+		if (streetName != null && streetDict.containsKey(streetName)) {
+			StreetNode sNode = streetDict.get(streetName);
+			sNode.addAddress(aNode);
+			return true;
+		}
+		
+		return false;
+	}
+	
+	/**
+	 * Walks through the list of unassigned addresses and tries to assign them to streets.
+	 */
+	public void resolveAddresses() {
+		List<AddressNode> resolvedAddresses = new ArrayList<AddressNode>();
+		for (AddressNode node : unresolvedAddresses) {
+			if (assignAddressToStreet(node)) {
+				resolvedAddresses.add(node);
+			}
+		}
+		
+		/* Remove all resolves nodes from unresolved list */
+		for (AddressNode resolved : resolvedAddresses) {
+			unresolvedAddresses.remove(resolved);
+		}
+	}
+	
+	/**
+	 * Rebuilds the street and address lists. 
+	 */
+	public void invalidate() {
+		invalidate(Main.main.getCurrentDataSet().allPrimitives());
+	}
+	
+	public void invalidate(final Collection<? extends OsmPrimitive> osmData) {
+		if (osmData == null || osmData.isEmpty())
+			return;
+		
+		clearData();
+		for (OsmPrimitive osmPrimitive : osmData) {
+			osmPrimitive.visit(this);
+		}
+		
+		resolveAddresses();
+		
+		Collections.sort(incompleteAddresses);
+		Collections.sort(unresolvedAddresses);
+		
+		fireContainerChanged();
+	}
+	
+	public void clearData() {
+		streetDict.clear();
+		unresolvedAddresses.clear();
+		incompleteAddresses.clear();
+		visitedNodes.clear();
+		visitedWays.clear();
+	}
+	
+	/**
+	 * Connects the listener to the data set and revisits the data. This method should
+	 * be called immediately before an edit session starts.
+	 */
+	public void attachToDataSet(Collection<? extends OsmPrimitive> dataToExamine) {		
+		Main.main.getCurrentDataSet().addDataSetListener(this);
+		if (dataToExamine != null && dataToExamine.size() > 0) {
+			invalidate(dataToExamine); // use given data set (usually the current selection)
+		} else {
+			invalidate(); // use current data set
+		}
+	}
+	
+	/**
+	 * Disconnects the listener from the data set. This method should
+	 * be called immediately after an edit session has ended.
+	 */
+	public void detachFromDataSet() {
+		Main.main.getCurrentDataSet().removeDataSetListener(this);
+	}
+
+	@Override
+	public void dataChanged(DataChangedEvent event) {
+	}
+
+	@Override
+	public void nodeMoved(NodeMovedEvent event) {
+				
+	}
+
+	@Override
+	public void otherDatasetChange(AbstractDatasetChangedEvent event) {
+	}
+
+	@Override
+	public void primtivesAdded(PrimitivesAddedEvent event) {
+		invalidate();
+	}
+
+	@Override
+	public void primtivesRemoved(PrimitivesRemovedEvent event) {
+		invalidate();
+	}
+
+	@Override
+	public void relationMembersChanged(RelationMembersChangedEvent event) {
+	}
+
+	@Override
+	public void tagsChanged(TagsChangedEvent event) {
+		invalidate();		
+	}
+
+	@Override
+	public void wayNodesChanged(WayNodesChangedEvent event) {
+	}
+
+	@Override
+	public void containerChanged(AddressEditContainer container) {
+		
+	}
+
+	@Override
+	public void entityChanged(INodeEntity entity) {
+		invalidate();		
+	}
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditPlugin.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditPlugin.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressEditPlugin.java	(revision 23933)
@@ -0,0 +1,35 @@
+/**
+ * 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.Main;
+import org.openstreetmap.josm.plugins.Plugin;
+import org.openstreetmap.josm.plugins.PluginInformation;
+
+public class AddressEditPlugin extends Plugin {
+
+	/**
+	 * Constructor for the AddressEdit plugin.
+	 * @param info Context information of the plugin.
+	 */
+	public AddressEditPlugin(PluginInformation info) {
+		super(info);
+		
+		// Create action for edit...
+		FixUnresolvedStreetsAction action = new FixUnresolvedStreetsAction();
+		// ... and add it to the tools menu in main
+        Main.main.menu.toolsMenu.add(action);
+	}
+
+}
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 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressFinderThread.java	(revision 23933)
@@ -0,0 +1,145 @@
+/*
+ * 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.ConcurrentModificationException;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.visitor.Visitor;
+
+public class AddressFinderThread implements Runnable, Visitor {
+	private AddressNode addressNode;
+	private double minDist;
+	private Node nearestNode;
+	private Node osmAddressNode;
+	private boolean isRunning = false;
+	private String nearestName = null;
+	private String currentName = null;
+	
+	/**
+	 * @param addressNode
+	 */
+	public AddressFinderThread(AddressNode addressNode) {
+		super();
+		setAddressNode(addressNode);		
+	}
+
+	public AddressFinderThread() {
+		this(null);
+	}
+
+	public void setAddressNode(AddressNode addressNode) {
+		if (isRunning) {
+			throw new ConcurrentModificationException();
+		}
+		this.addressNode = addressNode;
+		if (addressNode != null && addressNode.getOsmObject() instanceof Node) {
+			osmAddressNode = (Node) addressNode.getOsmObject();
+		}
+	}
+
+	public AddressNode getAddressNode() {
+		return addressNode;
+	}
+	
+	public double getMinDist() {
+		return minDist;
+	}
+
+	public Node getNearestNode() {
+		return nearestNode;
+	}
+
+	/**
+	 * @return the nearestName
+	 */
+	public String getGuessedName() {
+		return nearestName;
+	}
+
+	/**
+	 * @return the isRunning
+	 */
+	public boolean isRunning() {
+		return isRunning;
+	}
+
+	@Override
+	public void run() {
+		if (Main.main.getCurrentDataSet() == null || osmAddressNode == null) return;
+
+		isRunning = true;
+		synchronized(this) {			
+			try {
+				minDist = Double.MAX_VALUE;
+				for (OsmPrimitive osmPrimitive : Main.main.getCurrentDataSet().getWays()) {
+					osmPrimitive.visit(this);
+				}
+				
+				if (nearestName != null) {
+					System.out.println("Picked " + nearestName + " with distance " + minDist + "m");
+					addressNode.setGuessedStreetName(nearestName);
+				}
+			} finally {
+				isRunning = false;
+			}
+		}
+	}
+
+
+	@Override
+	public void visit(Node n) {
+		double dist = osmAddressNode.getCoor().greatCircleDistance(n.getCoor());
+		
+		if (dist < minDist) {
+			minDist = dist;
+			nearestNode = n;
+			nearestName = currentName;
+		}
+	}
+
+
+	@Override
+	public void visit(Way w) {
+		// skip non-streets and streets without name
+		if (!TagUtils.hasHighwayTag(w)) return;		
+		if (!TagUtils.hasNameTag(w)) return;
+		
+		currentName = TagUtils.getNameValue(w);
+		for (Node node : w.getNodes()) {
+			visit(node);
+		}
+		
+	}
+
+
+	@Override
+	public void visit(Relation e) {
+		// TODO Auto-generated method stub
+		
+	}
+
+
+	@Override
+	public void visit(Changeset cs) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
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 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/AddressNode.java	(revision 23933)
@@ -0,0 +1,268 @@
+/*
+ * 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.data.osm.OsmPrimitive;
+
+public class AddressNode extends NodeEntityBase {
+	public static final String MISSING_TAG = "?";
+	
+	private String guessedStreetName;
+
+	public AddressNode(OsmPrimitive osmObject) {
+		super(osmObject);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.addressEdit.NodeEntityBase#setOsmObject(org.openstreetmap.josm.data.osm.OsmPrimitive)
+	 */
+	@Override
+	public void setOsmObject(OsmPrimitive osmObject) {
+		super.setOsmObject(osmObject);
+	}
+	
+	/**
+	 * Checks if the underlying address node has all tags usually needed to describe an address.
+	 * @return
+	 */
+	public boolean isComplete() {
+		return 	TagUtils.hasAddrCityTag(osmObject) && TagUtils.hasAddrCountryTag(osmObject) &&
+				TagUtils.hasAddrHousenumberTag(osmObject) && TagUtils.hasAddrPostcodeTag(osmObject) &&
+				TagUtils.hasAddrStateTag(osmObject) && TagUtils.hasAddrStreetTag(osmObject);
+	}
+	
+	/**
+	 * Gets the name of the street associated with this address.
+	 * @return
+	 */
+	public String getStreet() {
+		if (!TagUtils.hasAddrStreetTag(osmObject)) {
+			return MISSING_TAG;
+		}
+		return TagUtils.getAddrStreetValue(osmObject);
+	}
+	
+	/**
+	 * Returns <tt>true</tt>, if this address node has a street name.
+	 * @return
+	 */
+	public boolean hasStreetName() {
+		return TagUtils.hasAddrStreetTag(osmObject);
+	}
+	
+	/**
+	 * Returns the street name guessed by the nearest-neighbour search.
+	 * @return the guessedStreetName
+	 */
+	public String getGuessedStreetName() {
+		return guessedStreetName;
+	}
+
+	/**
+	 * @param guessedStreetName the guessedStreetName to set
+	 */
+	public void setGuessedStreetName(String guessedStreetName) {
+		this.guessedStreetName = guessedStreetName;
+		fireEntityChanged(this);
+	}
+	
+	public boolean hasGuessedStreetName() {
+		return !StringUtils.isNullOrEmpty(guessedStreetName);
+	}
+	
+	/**
+	 * Returns true, if this instance has guesses regarding address tags.
+	 * @return
+	 */
+	public boolean hasGuesses() {
+		return hasGuessedStreetName(); // to be extended later
+	}
+	
+	/**
+	 * Applies all guessed tags for this node.
+	 */
+	public void applyAllGuesses() {
+		if (hasGuessedStreetName()) applyGuessedStreet();
+	}
+
+	/**
+	 * Gets the name of the post code associated with this address.
+	 * @return
+	 */
+	public String getPostCode() {
+		if (!TagUtils.hasAddrPostcodeTag(osmObject)) {
+			return MISSING_TAG;
+		}
+		return TagUtils.getAddrPostcodeValue(osmObject);
+	}
+	
+	/**
+	 * Gets the name of the house number associated with this address.
+	 * @return
+	 */
+	public String getHouseNumber() {
+		if (!TagUtils.hasAddrHousenumberTag(osmObject)) {
+			return MISSING_TAG;
+		}
+		return TagUtils.getAddrHousenumberValue(osmObject);
+	}
+	
+	/**
+	 * Gets the name of the city associated with this address.
+	 * @return
+	 */
+	public String getCity() {
+		if (!TagUtils.hasAddrCityTag(osmObject)) {
+			return MISSING_TAG;
+		}
+		return TagUtils.getAddrCityValue(osmObject);
+	}
+	
+	/**
+	 * Gets the name of the state associated with this address.
+	 * @return
+	 */
+	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
+	 */
+	public String getCountry() {
+		if (!TagUtils.hasAddrCountryTag(osmObject)) {
+			return MISSING_TAG;
+		}
+		return TagUtils.getAddrCountryValue(osmObject);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.addressEdit.NodeEntityBase#compareTo(org.openstreetmap.josm.plugins.addressEdit.INodeEntity)
+	 */
+	@Override
+	public int compareTo(INodeEntity o) {
+		if (o == null || !(o instanceof AddressNode)) {
+			return -1;
+		}
+		AddressNode other = (AddressNode) o;
+		
+		int cc = 0;
+		cc = this.getCountry().compareTo(other.getCountry());
+		if ( cc  == 0) {
+			cc = this.getState().compareTo(other.getState());			
+			if (cc  == 0) {
+				cc = this.getCity().compareTo(other.getCity());				
+				if (cc  == 0) {
+					cc = this.getStreet().compareTo(other.getStreet());					
+					if (cc  == 0) {
+						cc = this.getHouseNumber().compareTo(other.getHouseNumber());
+					}
+				}
+			}
+		}
+		
+		return cc;
+	}
+	
+	/**
+	 * Applies the street name from the specified street node.
+	 * @param node
+	 */
+	public void assignStreet(StreetNode node) {
+		if (node == null || !node.hasName()) return;
+		
+		if (!node.getName().equals(getStreet())) {
+			setStreetName(node.getName());			
+			node.addAddress(this);
+			fireEntityChanged(this);
+		}
+	}
+	
+	/**
+	 * Applies the guessed street name to the addr:street tag value.
+	 */
+	public void applyGuessedStreet() {
+		if (hasGuessedStreetName()) {
+			setOSMTag(TagUtils.ADDR_STREET_TAG, guessedStreetName);
+		}
+	}
+	
+	/**
+	 * Sets the street name of the address node.
+	 * @param streetName
+	 */
+	public void setStreetName(String streetName) {
+		if (streetName != null && streetName.length() == 0) return;
+		
+		setOSMTag(TagUtils.ADDR_STREET_TAG, streetName);
+	}
+
+	
+	/**
+	 * Sets the state of the address node.
+	 * @param state
+	 */
+	public void setState(String state) {
+		if (state != null && state.length() == 0) return;
+		
+		setOSMTag(TagUtils.ADDR_STATE_TAG, state);
+	}
+	
+	/**
+	 * Sets the country of the address node.
+	 * @param country
+	 */
+	public void setCountry(String country) {
+		if (country != null && country.length() == 0) return;
+		
+		setOSMTag(TagUtils.ADDR_COUNTRY_TAG, country);
+	}
+	
+	/**
+	 * Sets the post code of the address node.
+	 * @param postCode
+	 */
+	public void setPostCode(String postCode) {
+		if (postCode != null && postCode.length() == 0) return;
+		
+		setOSMTag(TagUtils.ADDR_POSTCODE_TAG, postCode);
+	}
+	
+	@Override
+	public String toString() {
+		return AddressNode.getFormatString(this);
+	}
+
+	public static String getFormatString(AddressNode node) {
+		// TODO: Add further countries here
+		// DE
+		String guessed = node.getGuessedStreetName();
+		String sName = node.getStreet();
+		if (!StringUtils.isNullOrEmpty(guessed) && MISSING_TAG.equals(sName)) {
+			sName = String.format("(%s)", guessed);
+		}	
+		
+		return String.format("%s %s, %s-%s %s (%s) ", 
+				sName,
+				node.getHouseNumber(),
+				node.getCountry(),
+				node.getPostCode(),
+				node.getCity(),
+				node.getState());
+	}
+}
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 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/FixUnresolvedStreetsAction.java	(revision 23933)
@@ -0,0 +1,141 @@
+package org.openstreetmap.josm.plugins.fixAddresses;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditDialog;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * Action to find and fix addresses without (valid) streets.
+ * @author Oliver Wieland <oliver.wieland@online.de>
+ * 
+ */
+
+public class FixUnresolvedStreetsAction extends JosmAction implements SelectionChangedListener {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private AddressEditContainer addressEditContainer;
+	private Collection<? extends OsmPrimitive> newSelection;
+
+	public FixUnresolvedStreetsAction() {
+		super(tr("Fix street addresses"), "fixstreets_24",
+				tr("Find and fix addresses without (valid) streets."), Shortcut
+				.registerShortcut("tools:AddressEdit", tr("Tool: {0}",
+						tr("Address Edit")), KeyEvent.VK_A,
+						Shortcut.GROUP_MENU, InputEvent.ALT_DOWN_MASK
+						| InputEvent.SHIFT_DOWN_MASK), false);
+		setEnabled(false);
+		
+		addressEditContainer = new AddressEditContainer();
+		DataSet.addSelectionListener(this);		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.data.SelectionChangedListener#selectionChanged(java.util.Collection)
+	 */
+	@Override
+	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+		/* this changes the dialog contents, so we do nothing here
+		this.newSelection = newSelection;
+		if (addressEditContainer != null) {
+			addressEditContainer.invalidate(newSelection);
+		}*/
+	}
+
+	/* (non-Javadoc)
+	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+	 */
+	@Override
+	public void actionPerformed(ActionEvent arg0) {		
+		if (addressEditContainer != null) {
+			addressEditContainer.attachToDataSet(newSelection);
+			try {
+				AddressEditDialog dlg = new AddressEditDialog(addressEditContainer);
+				dlg.setVisible(true);
+			} finally {
+				addressEditContainer.detachFromDataSet();
+			}
+		}
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.actions.JosmAction#updateEnabledState()
+	 */
+	@Override
+	protected void updateEnabledState() {
+		setEnabled(getCurrentDataSet() != null);
+	}
+
+	@Override
+	protected void updateEnabledState(
+			Collection<? extends OsmPrimitive> selection) {
+		// Enable button if there is either a selection or at least a data set
+		setEnabled(	selection != null && !selection.isEmpty() || 
+					(getCurrentDataSet() != null));
+	}
+
+	/* This code is abused to generate tag utility code */
+
+	@SuppressWarnings("unused")
+	private void generateTagCode(AddressEditContainer addrVisitor) {
+		
+		for (String tag : addrVisitor.getTags()) {
+			String methodName = createMethodName(tag);
+			System.out
+			.println(String
+					.format(
+							"/** Check if OSM primitive has a tag '%s'.\n * @param osmPrimitive The OSM entity to check.*/\npublic static boolean has%sTag(OsmPrimitive osmPrimitive) {\n return osmPrimitive != null ? osmPrimitive.hasKey(%s_TAG) : false;\n}\n",
+							tag, methodName, tag.toUpperCase()
+							.replaceAll(":", "_")));
+			System.out
+			.println(String
+					.format(
+							"/** Gets the value of tag '%s'.\n * @param osmPrimitive The OSM entity to check.*/\npublic static String get%sValue(OsmPrimitive osmPrimitive) {\n return osmPrimitive != null ? osmPrimitive.get(%s_TAG) : null;\n}\n",
+							tag, methodName, tag.toUpperCase()
+							.replaceAll(":", "_")));
+		}
+
+		for (String tag : addrVisitor.getTags()) {
+			System.out.println(String.format(
+					"public static final String %s_TAG = \"%s\";", tag
+					.toUpperCase().replaceAll(":", "_"), tag));
+		}
+	}
+
+	private String createMethodName(String osmName) {
+		StringBuffer result = new StringBuffer(osmName.length());
+		boolean nextUp = false;
+		for (int i = 0; i < osmName.length(); i++) {
+			char c = osmName.charAt(i);
+			if (i == 0) {
+				result.append(Character.toUpperCase(c));
+				continue;
+			}
+			if (c == '_' || c == ':') {
+				nextUp = true;
+			} else {
+				if (nextUp) {
+					result.append(Character.toUpperCase(c));
+					nextUp = false;
+				} else {
+					result.append(c);
+				}
+			}
+		}
+
+		return result.toString();
+	}
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IAddressEditContainerListener.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IAddressEditContainerListener.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/IAddressEditContainerListener.java	(revision 23933)
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+
+public interface IAddressEditContainerListener {
+	/**
+	 * Notifies clients that the container has been changed.
+	 * @param container
+	 */
+	public void containerChanged(AddressEditContainer container);
+	
+	/**
+	 * Notifies clients that an entity has been changed.
+	 */
+	public void entityChanged(INodeEntity node);
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/INodeEntity.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/INodeEntity.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/INodeEntity.java	(revision 23933)
@@ -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;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+public interface INodeEntity extends Comparable<INodeEntity> {
+	/**
+	 * Gets the underlying OSM object.
+	 * @return
+	 */
+	public OsmPrimitive getOsmObject();
+	
+	/**
+	 * Checks if underlying OSM object has a name.
+	 * @return
+	 */
+	public boolean hasName();
+	
+	/**
+	 * Gets the name of the entity node.
+	 * @return
+	 */
+	public String getName();
+	
+	/**
+	 * Gets the children of the entity node.
+	 * @return
+	 */
+	public List<INodeEntity> getChildren();
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/NodeEntityBase.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/NodeEntityBase.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/NodeEntityBase.java	(revision 23933)
@@ -0,0 +1,135 @@
+/*
+ * 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 static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+public class NodeEntityBase implements INodeEntity, Comparable<INodeEntity> {
+	public static final String ANONYMOUS = tr("No name");
+	private static List<IAddressEditContainerListener> listeners = new ArrayList<IAddressEditContainerListener>();
+	
+	protected OsmPrimitive osmObject;
+	
+	/**
+	 * @param osmObject
+	 */
+	public NodeEntityBase(OsmPrimitive osmObject) {
+		super();
+		this.osmObject = osmObject;
+	}
+	
+	/**
+	 * @param osmObject the osmObject to set
+	 */
+	protected void setOsmObject(OsmPrimitive osmObject) {
+		this.osmObject = osmObject;
+	}
+
+	/**
+	 * Adds a change listener.
+	 * @param listener
+	 */
+	public static void addChangedListener(IAddressEditContainerListener listener) {
+		listeners.add(listener);
+	}
+	
+	/**
+	 * Removes a change listener.
+	 * @param listener
+	 */
+	public static void removeChangedListener(IAddressEditContainerListener listener) {
+		listeners.remove(listener);
+	}
+	
+	/**
+	 * Notifies clients that the address container changed.
+	 */
+	protected static void fireEntityChanged(INodeEntity entity) {
+		for (IAddressEditContainerListener listener : listeners) {
+			listener.entityChanged(entity);
+		}
+	}
+
+	public OsmPrimitive getOsmObject() {
+		return osmObject;
+	}
+
+	@Override
+	public List<INodeEntity> getChildren() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	/**
+	 * Gets the name of the street or ANONYMOUS, if street has no name.
+	 * @return
+	 */
+	public String getName() {
+		if (TagUtils.hasNameTag(osmObject)) {
+			return  TagUtils.getNameValue(osmObject);
+		}
+		return "";
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.addressEdit.INodeEntity#hasName()
+	 */
+	@Override
+	public boolean hasName() {
+		return TagUtils.hasNameTag(osmObject);
+	}
+	
+	/**
+	 * Internal helper method which changes the given property and
+	 * puts the appropriate command {@link src.org.openstreetmap.josm.command.Command}
+	 * into the undo/redo queue.
+	 * @param tag The tag to change.
+	 * @param newValue The new value for the tag.
+	 */
+	protected void setOSMTag(String tag, String newValue) {
+		Node oldNode = (Node)osmObject;
+		OsmPrimitive newNode = new Node(oldNode);
+		newNode.put(tag, newValue);
+		Main.main.undoRedo.add( new ChangeCommand(oldNode, newNode));
+		fireEntityChanged(this);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		if (hasName()) {
+			return this.getClass().getName() + ": " + getName();
+		}
+		return this.getClass().getName() + ": " + ANONYMOUS;
+	}
+
+	@Override
+	public int compareTo(INodeEntity o) {
+		if (o == null || !(o instanceof NodeEntityBase)) return -1;
+		return this.getName().compareTo(o.getName());
+	}
+
+	
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/NodeFactory.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/NodeFactory.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/NodeFactory.java	(revision 23933)
@@ -0,0 +1,45 @@
+/*
+ * 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.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+
+public class NodeFactory {
+	/**
+	 * Creates an address node from an OSM node, if possible.
+	 * @param osm
+	 * @return
+	 */
+	public static AddressNode createNode(Node osm) {
+		if (TagUtils.isAddress(osm)) {
+			return new AddressNode(osm);
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Creates an node entity from an OSM way, if possible.
+	 * @param way
+	 * @return The new node instance or null; if given way is inappropriate.
+	 */
+	public static StreetSegmentNode createNodeFromWay(Way way) {
+		if (TagUtils.hasHighwayTag(way)) {
+			return new StreetSegmentNode(way);
+		}
+		
+		return null;
+	}
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StreetNode.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StreetNode.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StreetNode.java	(revision 23933)
@@ -0,0 +1,156 @@
+/*
+ * 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.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * This class is the container for all street segments with the same name. Every street
+ * consists at least of one segment.
+ * 
+ * @author Oliver Wieland <oliver.wieland@online.de>
+ */
+public class StreetNode extends NodeEntityBase {
+	private List<INodeEntity> children;
+	private List<AddressNode> addresses;
+			
+	/**
+	 * @param osmPrimitive
+	 */
+	public StreetNode(OsmPrimitive osmPrimitive) {
+		super(osmPrimitive);
+	}
+
+	public List<INodeEntity> getChildren() {
+		return children;
+	}
+	
+	/**
+	 * Adds a street segment to the street node.
+	 * @param segment
+	 */
+	public void addStreetSegment(StreetSegmentNode segment) {
+		lazyCreateChildren();
+		
+		children.add(segment);
+		Collections.sort(children);
+	}
+	
+	private void lazyCreateChildren() {
+		if (children == null) {
+			children = new ArrayList<INodeEntity>();
+		}
+	}
+	
+	public void addAddress(AddressNode aNode) {
+		lazyCreateAddresses();
+		addresses.add(aNode);		
+	}
+
+	private void lazyCreateAddresses() {
+		if (addresses == null) {
+			addresses = new ArrayList<AddressNode>();
+		}
+	}
+	
+	public boolean hasAddresses() {
+		return addresses != null && addresses.size() > 0;
+	}
+	
+	public List<AddressNode> getAddresses() {
+		return addresses;
+	}
+	
+	public void setAddresses(List<AddressNode> addresses) {
+		this.addresses = addresses;
+	}
+	
+	/**
+	 * Gets the number of addresses associated with this street.
+	 * @return
+	 */
+	public int getNumberOfAddresses() {
+		if (addresses == null) return 0;
+		
+		return addresses.size();
+	}
+	
+	/**
+	 * Gets the number of street segments of this street.
+	 * @return
+	 */
+	public int getNumberOfSegments() {
+		if (children == null) return 0;
+		
+		int sc = 0;
+		for (INodeEntity node : children) {
+			if (node instanceof StreetSegmentNode) {
+				sc++;
+			}
+		}
+		return sc;
+	}
+	
+	/**
+	 * Gets the road type(s) of this street. If the street has different types,
+	 * they are separated by comma. 
+	 * @return
+	 */
+	public String getType() {
+		List<String> types = new ArrayList<String>();
+		
+		for (INodeEntity seg : getChildren()) {
+			OsmPrimitive osmPrim = seg.getOsmObject();
+			if (TagUtils.hasHighwayTag(osmPrim)) {
+				String val = osmPrim.get(TagUtils.HIGHWAY_TAG);
+				if (!types.contains(val)) {
+					types.add(val);
+				}
+			}
+		}
+		
+		StringBuffer sb = new StringBuffer(20);
+		for (String string : types) {
+			if (sb.length() > 0) {
+				sb.append(", ");
+			}
+			sb.append(string);
+			
+		}
+		return sb.toString();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.addressEdit.NodeEntityBase#toString()
+	 */
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer(getName());
+		
+		if (children != null) {
+			sb.append(String.format(", %d segments", children.size()));
+		}
+		
+		if (addresses != null) {
+			sb.append(String.format(", %d address entries", addresses.size()));
+		}
+		
+		return sb.toString();
+	}
+
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StreetSegmentNode.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StreetSegmentNode.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StreetSegmentNode.java	(revision 23933)
@@ -0,0 +1,39 @@
+/*
+ * 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;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * Represents a single segment of a street. In many cases a segment may represent the complete street, but
+ * sometimes a street is separated into many segments, e. g. due to different speed limits, bridges, etc..
+ * 
+ * @author Oliver Wieland <oliver.wieland@online.de>
+ * 
+ */
+
+public class StreetSegmentNode extends NodeEntityBase {
+
+	public StreetSegmentNode(OsmPrimitive osmObject) {
+		super(osmObject);
+	}
+
+	@Override
+	public List<INodeEntity> getChildren() {
+		return null;
+	}
+
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StringUtils.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StringUtils.java	(revision 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/StringUtils.java	(revision 23933)
@@ -0,0 +1,150 @@
+/*
+ * 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 class StringUtils {
+	/**
+	 * Checks, if a string is either null or empty.
+	 * 
+	 * @param txt
+	 *            Text to check
+	 * @return True, if string is null or empty; otherwise false
+	 */
+	public static boolean isNullOrEmpty(String txt) {
+		return txt == null || txt.length() == 0;
+	}
+
+	/**
+	 * Gets the length of the longest common substring of a and b
+	 * 
+	 * @param a
+	 *            First string
+	 * @param b
+	 *            Second string
+	 * @return The length of the longest common substring or 0, if no common
+	 *         sequence exists or one of the arguments are invalid. For
+	 *         algorithm details please refer to {@link http
+	 *         ://www.ics.uci.edu/~eppstein/161/960229.html}
+	 */
+	public static int lcsLength(String a, String b) {
+		if (StringUtils.isNullOrEmpty(a))
+			return 0;
+		if (StringUtils.isNullOrEmpty(b))
+			return 0;
+
+		int[][] L = createLCSTable(a, b);
+		return L[0][0];
+	}
+
+	/**
+	 * Internal use only
+	 */
+	private static int[][] createLCSTable(String a, String b) {
+		if (StringUtils.isNullOrEmpty(a))
+			return null;
+		if (StringUtils.isNullOrEmpty(b))
+			return null;
+
+		int m = a.length();
+		int n = b.length();
+		int[][] l = new int[m + 1][n + 1];
+		for (int i = 0; i < l.length; i++) {
+			l[i] = new int[n + 1];
+		}
+
+		int i, j;
+		for (i = m - 1; i >= 0; i--) {
+			for (j = n - 1; j >= 0; j--) {
+				/*
+				 * if (i >= m || j >= n) { l[i][j] = 0; } else
+				 */if (a.charAt(i) == b.charAt(j)) {
+					l[i][j] = 1 + l[i + 1][j + 1];
+				} else {
+					l[i][j] = Math.max(l[i + 1][j], l[i][j + 1]);
+				}
+			}
+		}
+		return l;
+	}
+
+	/**
+	 * Gets the longest common substring of a and b.
+	 * 
+	 * @param a The first string.
+	 * @param b The second string.
+	 * @return
+	 */
+	public static String getLongestCommonSubstring(String a, String b) {
+		if (StringUtils.isNullOrEmpty(a))
+			return null;
+		if (StringUtils.isNullOrEmpty(b))
+			return null;
+
+		StringBuffer sb = new StringBuffer();
+		int[][] l = createLCSTable(a, b);
+		int m = a.length();
+		int n = b.length();
+		int i = 0;
+		int j = 0;
+		while (i < m && j < n) {
+			char aa = a.charAt(i);
+			char bb = b.charAt(j);
+			if (aa == bb) {
+				sb.append(aa);
+				i++;
+				j++;
+			} else if (l[i + 1][j] >= l[i][j + 1]) {
+				i++;
+			} else {
+				j++;
+			}
+		}
+
+		l = null;
+		return sb.toString();
+	}
+		
+	/**
+	 * @param needle The string to find the best match for.
+	 * @param haystack The list of strings to pick the the best match from.
+	 * @return The string of the list with the longest common substring to needle or
+	 * <tt>null</tt>, if either <tt>needle</tt> or <tt>haystack</tt> is empty or null.
+	 */
+	public static String findBestMatch(String needle, List<String> haystack) {
+		String bestMatch = null;
+		double maxRatio = Double.MIN_VALUE;
+				
+		if (StringUtils.isNullOrEmpty(needle)) {
+			return null;
+		}
+		if (haystack == null || haystack.size() == 0) {
+			return null;
+		}
+		
+		int lNeedle = needle.length();
+		for (String curString : haystack) {
+			int ll = lcsLength(needle, curString);
+			double ratio = ll / (double)lNeedle;
+			if (ratio > maxRatio) {
+				maxRatio = ratio;
+				bestMatch = curString;
+			}
+			
+		}
+		
+		return bestMatch;
+	}
+}
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 23933)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/TagUtils.java	(revision 23933)
@@ -0,0 +1,1946 @@
+/*
+ * 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.data.osm.OsmPrimitive;
+
+/**
+ * Contains the tags used within OSM. FIXME: Maybe there is a class or similar
+ * within JOSM which already defines them, but I have not found it so far.
+ * 
+ * @author Oliver Wieland <oliver.wieland@online.de>
+ * 
+ */
+public final class TagUtils {
+	/**
+	 * Checks if the given OSM primitive is an address node.
+	 * @return
+	 */
+	public static boolean isAddress(OsmPrimitive osmObject) {
+		return 	TagUtils.hasAddrCityTag(osmObject) || TagUtils.hasAddrCountryTag(osmObject) ||
+				TagUtils.hasAddrHousenumberTag(osmObject) || TagUtils.hasAddrPostcodeTag(osmObject) ||
+				TagUtils.hasAddrStateTag(osmObject) || TagUtils.hasAddrStreetTag(osmObject);
+	}
+	
+	/**
+	 * Check if OSM primitive has a tag 'parking'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasParkingTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(PARKING_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'parking'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getParkingValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(PARKING_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'shop'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasShopTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SHOP_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'shop'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getShopValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SHOP_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'craft'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasCraftTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(CRAFT_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'craft'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getCraftValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(CRAFT_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'surface'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasSurfaceTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SURFACE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'surface'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getSurfaceValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SURFACE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'cuisine'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasCuisineTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(CUISINE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'cuisine'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getCuisineValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(CUISINE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'wood'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasWoodTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(WOOD_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'wood'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getWoodValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(WOOD_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'foot'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasFootTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(FOOT_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'foot'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getFootValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(FOOT_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'name:de'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasNameDeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(NAME_DE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'name:de'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getNameDeValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(NAME_DE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'nat_ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasNatRefTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(NAT_REF_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'nat_ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getNatRefValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(NAT_REF_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'note:de'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasNoteDeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(NOTE_DE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'note:de'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getNoteDeValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(NOTE_DE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:street'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrStreetTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADDR_STREET_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:street'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrStreetValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_STREET_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'type'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasTypeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(TYPE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'type'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getTypeValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(TYPE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:city'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrCityTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADDR_CITY_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:city'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrCityValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_CITY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'boundary'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasBoundaryTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(BOUNDARY_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'boundary'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getBoundaryValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(BOUNDARY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'smoothness'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasSmoothnessTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SMOOTHNESS_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'smoothness'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getSmoothnessValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SMOOTHNESS_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'opening_hours'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasOpeningHoursTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(OPENING_HOURS_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'opening_hours'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getOpeningHoursValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(OPENING_HOURS_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'bicycle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasBicycleTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(BICYCLE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'bicycle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getBicycleValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(BICYCLE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'religion'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasReligionTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(RELIGION_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'religion'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getReligionValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(RELIGION_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'barrier'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasBarrierTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(BARRIER_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'barrier'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getBarrierValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(BARRIER_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'power'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasPowerTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(POWER_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'power'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getPowerValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(POWER_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'landuse'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasLanduseTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(LANDUSE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'landuse'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getLanduseValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(LANDUSE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'fireplace'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasFireplaceTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(FIREPLACE_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'fireplace'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getFireplaceValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(FIREPLACE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'int_ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasIntRefTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(INT_REF_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'int_ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getIntRefValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(INT_REF_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'whitewater:section_grade'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasWhitewaterSectionGradeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive
+				.hasKey(WHITEWATER_SECTION_GRADE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'whitewater:section_grade'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getWhitewaterSectionGradeValue(
+			OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive
+				.get(WHITEWATER_SECTION_GRADE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'denomination'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasDenominationTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(DENOMINATION_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'denomination'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getDenominationValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(DENOMINATION_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:postcode'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrPostcodeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADDR_POSTCODE_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:postcode'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrPostcodeValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_POSTCODE_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'wires'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasWiresTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(WIRES_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'wires'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getWiresValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(WIRES_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'loc_ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasLocRefTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(LOC_REF_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'loc_ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getLocRefValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(LOC_REF_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'width'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasWidthTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(WIDTH_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'width'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getWidthValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(WIDTH_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'tourism'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasTourismTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(TOURISM_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'tourism'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getTourismValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(TOURISM_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'leisure'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasLeisureTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(LEISURE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'leisure'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getLeisureValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(LEISURE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'electrified'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasElectrifiedTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ELECTRIFIED_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'electrified'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getElectrifiedValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ELECTRIFIED_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'junction'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasJunctionTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(JUNCTION_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'junction'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getJunctionValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(JUNCTION_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'railway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasRailwayTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(RAILWAY_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'railway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getRailwayValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(RAILWAY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'voltage'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasVoltageTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(VOLTAGE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'voltage'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getVoltageValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(VOLTAGE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'bridge'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasBridgeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(BRIDGE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'bridge'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getBridgeValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(BRIDGE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'motor_vehicle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasMotorVehicleTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(MOTOR_VEHICLE_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'motor_vehicle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getMotorVehicleValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(MOTOR_VEHICLE_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'comment'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasCommentTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(COMMENT_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'comment'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getCommentValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(COMMENT_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'maxspeed'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasMaxspeedTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(MAXSPEED_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'maxspeed'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getMaxspeedValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(MAXSPEED_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'natural'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasNaturalTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(NATURAL_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'natural'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getNaturalValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(NATURAL_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'sac_scale'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasSacScaleTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SAC_SCALE_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'sac_scale'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getSacScaleValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SAC_SCALE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'tunnel'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasTunnelTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(TUNNEL_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'tunnel'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getTunnelValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(TUNNEL_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'waterway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasWaterwayTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(WATERWAY_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'waterway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getWaterwayValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(WATERWAY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'trail_visibility'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasTrailVisibilityTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(TRAIL_VISIBILITY_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'trail_visibility'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getTrailVisibilityValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(TRAIL_VISIBILITY_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'highway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasHighwayTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(HIGHWAY_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'highway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getHighwayValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(HIGHWAY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'vehicle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasVehicleTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(VEHICLE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'vehicle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getVehicleValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(VEHICLE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'horse'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasHorseTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(HORSE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'horse'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getHorseValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(HORSE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'goods'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasGoodsTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(GOODS_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'goods'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getGoodsValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(GOODS_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'frequency'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasFrequencyTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(FREQUENCY_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'frequency'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getFrequencyValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(FREQUENCY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'man_made'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasManMadeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(MAN_MADE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'man_made'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getManMadeValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(MAN_MADE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:housenumber'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrHousenumberTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADDR_HOUSENUMBER_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:housenumber'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrHousenumberValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_HOUSENUMBER_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'area'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAreaTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(AREA_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'area'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAreaValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(AREA_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'building:levels'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasBuildingLevelsTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(BUILDING_LEVELS_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'building:levels'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getBuildingLevelsValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(BUILDING_LEVELS_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'wheelchair'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasWheelchairTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(WHEELCHAIR_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'wheelchair'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getWheelchairValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(WHEELCHAIR_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'name'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasNameTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(NAME_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'name'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getNameValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(NAME_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'oneway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasOnewayTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ONEWAY_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'oneway'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getOnewayValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ONEWAY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'FIXME'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasFIXMETag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(FIXME_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'FIXME'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getFIXMEValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(FIXME_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'capacity'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasCapacityTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(CAPACITY_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'capacity'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getCapacityValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(CAPACITY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'motorcycle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasMotorcycleTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(MOTORCYCLE_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'motorcycle'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getMotorcycleValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(MOTORCYCLE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'hgv'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasHgvTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(HGV_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'hgv'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getHgvValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(HGV_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'construction'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasConstructionTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(CONSTRUCTION_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'construction'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getConstructionValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(CONSTRUCTION_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:state'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrStateTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADDR_STATE_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:state'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrStateValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_STATE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'lanes'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasLanesTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(LANES_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'lanes'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getLanesValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(LANES_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'note'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasNoteTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(NOTE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'note'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getNoteValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(NOTE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'lit'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasLitTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(LIT_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'lit'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getLitValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(LIT_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'building'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasBuildingTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(BUILDING_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'building'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getBuildingValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(BUILDING_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'segregated'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasSegregatedTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SEGREGATED_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'segregated'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getSegregatedValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SEGREGATED_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:inclusion'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrInclusionTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADDR_INCLUSION_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:inclusion'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrInclusionValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_INCLUSION_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'layer'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasLayerTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(LAYER_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'layer'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getLayerValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(LAYER_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'sport'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasSportTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SPORT_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'sport'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getSportValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SPORT_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:interpolation'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrInterpolationTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive
+				.hasKey(ADDR_INTERPOLATION_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:interpolation'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrInterpolationValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_INTERPOLATION_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'cutting'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasCuttingTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(CUTTING_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'cutting'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getCuttingValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(CUTTING_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'amenity'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAmenityTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(AMENITY_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'amenity'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAmenityValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(AMENITY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'access'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAccessTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ACCESS_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'access'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAccessValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ACCESS_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'agricultural'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAgriculturalTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(AGRICULTURAL_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'agricultural'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAgriculturalValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(AGRICULTURAL_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'capacity:disabled'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasCapacityDisabledTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive
+				.hasKey(CAPACITY_DISABLED_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'capacity:disabled'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getCapacityDisabledValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(CAPACITY_DISABLED_TAG)
+				: null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'operator'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasOperatorTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(OPERATOR_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'operator'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getOperatorValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(OPERATOR_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasRefTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(REF_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'ref'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getRefValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(REF_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'noexit'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasNoexitTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(NOEXIT_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'noexit'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getNoexitValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(NOEXIT_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'admin_level'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAdminLevelTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADMIN_LEVEL_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'admin_level'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAdminLevelValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADMIN_LEVEL_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'source'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasSourceTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SOURCE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'source'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getSourceValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SOURCE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'tracktype'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasTracktypeTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(TRACKTYPE_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'tracktype'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getTracktypeValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(TRACKTYPE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'addr:country'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasAddrCountryTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ADDR_COUNTRY_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'addr:country'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getAddrCountryValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ADDR_COUNTRY_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'route'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasRouteTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(ROUTE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'route'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getRouteValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(ROUTE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'cables'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasCablesTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(CABLES_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'cables'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getCablesValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(CABLES_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'service'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasServiceTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(SERVICE_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'service'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getServiceValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(SERVICE_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'motorcar'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasMotorcarTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(MOTORCAR_TAG) : false;
+	}
+
+	/**
+	 * Gets the value of tag 'motorcar'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getMotorcarValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(MOTORCAR_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'whitewater'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasWhitewaterTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(WHITEWATER_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'whitewater'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getWhitewaterValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(WHITEWATER_TAG) : null;
+	}
+
+	/**
+	 * Check if OSM primitive has a tag 'embankment'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static boolean hasEmbankmentTag(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.hasKey(EMBANKMENT_TAG)
+				: false;
+	}
+
+	/**
+	 * Gets the value of tag 'embankment'.
+	 * 
+	 * @param osmPrimitive
+	 *            The OSM entity to check.
+	 */
+	public static String getEmbankmentValue(OsmPrimitive osmPrimitive) {
+		return osmPrimitive != null ? osmPrimitive.get(EMBANKMENT_TAG) : null;
+	}
+
+	public static final String PARKING_TAG = "parking";
+	public static final String SHOP_TAG = "shop";
+	public static final String CRAFT_TAG = "craft";
+	public static final String SURFACE_TAG = "surface";
+	public static final String CUISINE_TAG = "cuisine";
+	public static final String WOOD_TAG = "wood";
+	public static final String FOOT_TAG = "foot";
+	public static final String NAME_DE_TAG = "name:de";
+	public static final String NAT_REF_TAG = "nat_ref";
+	public static final String NOTE_DE_TAG = "note:de";
+	public static final String ADDR_STREET_TAG = "addr:street";
+	public static final String TYPE_TAG = "type";
+	public static final String ADDR_CITY_TAG = "addr:city";
+	public static final String BOUNDARY_TAG = "boundary";
+	public static final String SMOOTHNESS_TAG = "smoothness";
+	public static final String OPENING_HOURS_TAG = "opening_hours";
+	public static final String BICYCLE_TAG = "bicycle";
+	public static final String RELIGION_TAG = "religion";
+	public static final String BARRIER_TAG = "barrier";
+	public static final String POWER_TAG = "power";
+	public static final String LANDUSE_TAG = "landuse";
+	public static final String FIREPLACE_TAG = "fireplace";
+	public static final String INT_REF_TAG = "int_ref";
+	public static final String WHITEWATER_SECTION_GRADE_TAG = "whitewater:section_grade";
+	public static final String DENOMINATION_TAG = "denomination";
+	public static final String ADDR_POSTCODE_TAG = "addr:postcode";
+	public static final String WIRES_TAG = "wires";
+	public static final String LOC_REF_TAG = "loc_ref";
+	public static final String WIDTH_TAG = "width";
+	public static final String TOURISM_TAG = "tourism";
+	public static final String LEISURE_TAG = "leisure";
+	public static final String ELECTRIFIED_TAG = "electrified";
+	public static final String JUNCTION_TAG = "junction";
+	public static final String RAILWAY_TAG = "railway";
+	public static final String VOLTAGE_TAG = "voltage";
+	public static final String BRIDGE_TAG = "bridge";
+	public static final String MOTOR_VEHICLE_TAG = "motor_vehicle";
+	public static final String COMMENT_TAG = "comment";
+	public static final String MAXSPEED_TAG = "maxspeed";
+	public static final String NATURAL_TAG = "natural";
+	public static final String BUILDING_HEIGHT_TAG = "building:height";
+	public static final String SAC_SCALE_TAG = "sac_scale";
+	public static final String TUNNEL_TAG = "tunnel";
+	public static final String WATERWAY_TAG = "waterway";
+	public static final String TRAIL_VISIBILITY_TAG = "trail_visibility";
+	public static final String HIGHWAY_TAG = "highway";
+	public static final String VEHICLE_TAG = "vehicle";
+	public static final String HORSE_TAG = "horse";
+	public static final String GOODS_TAG = "goods";
+	public static final String FREQUENCY_TAG = "frequency";
+	public static final String MAN_MADE_TAG = "man_made";
+	public static final String ADDR_HOUSENUMBER_TAG = "addr:housenumber";
+	public static final String AREA_TAG = "area";
+	public static final String BUILDING_LEVELS_TAG = "building:levels";
+	public static final String WHEELCHAIR_TAG = "wheelchair";
+	public static final String NAME_TAG = "name";
+	public static final String ONEWAY_TAG = "oneway";
+	public static final String FIXME_TAG = "FIXME";
+	public static final String CAPACITY_TAG = "capacity";
+	public static final String MOTORCYCLE_TAG = "motorcycle";
+	public static final String HGV_TAG = "hgv";
+	public static final String CONSTRUCTION_TAG = "construction";
+	public static final String ADDR_STATE_TAG = "addr:state";
+	public static final String LANES_TAG = "lanes";
+	public static final String NOTE_TAG = "note";
+	public static final String LIT_TAG = "lit";
+	public static final String BUILDING_TAG = "building";
+	public static final String SEGREGATED_TAG = "segregated";
+	public static final String ADDR_INCLUSION_TAG = "addr:inclusion";
+	public static final String LAYER_TAG = "layer";
+	public static final String SPORT_TAG = "sport";
+	public static final String ADDR_INTERPOLATION_TAG = "addr:interpolation";
+	public static final String CUTTING_TAG = "cutting";
+	public static final String AMENITY_TAG = "amenity";
+	public static final String ACCESS_TAG = "access";
+	public static final String AGRICULTURAL_TAG = "agricultural";
+	public static final String CAPACITY_DISABLED_TAG = "capacity:disabled";
+	public static final String OPERATOR_TAG = "operator";
+	public static final String REF_TAG = "ref";
+	public static final String NOEXIT_TAG = "noexit";
+	public static final String ADMIN_LEVEL_TAG = "admin_level";
+	public static final String SOURCE_TAG = "source";
+	public static final String TRACKTYPE_TAG = "tracktype";
+	public static final String ADDR_COUNTRY_TAG = "addr:country";
+	public static final String ROUTE_TAG = "route";
+	public static final String CABLES_TAG = "cables";
+	public static final String SERVICE_TAG = "service";
+	public static final String MOTORCAR_TAG = "motorcar";
+	public static final String WHITEWATER_TAG = "whitewater";
+	public static final String EMBANKMENT_TAG = "embankment";
+}
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AbstractAddressEditAction.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AbstractAddressEditAction.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AbstractAddressEditAction.java	(revision 23933)
@@ -17,5 +17,5 @@
 
 import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
 
 /**
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditDialog.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditDialog.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditDialog.java	(revision 23933)
@@ -50,10 +50,10 @@
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel.PresetHandler;
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
-import org.openstreetmap.josm.plugins.addressEdit.IAddressEditContainerListener;
-import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
-import org.openstreetmap.josm.plugins.addressEdit.StreetNode;
-import org.openstreetmap.josm.plugins.addressEdit.StringUtils;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.IAddressEditContainerListener;
+import org.openstreetmap.josm.plugins.fixAddresses.INodeEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.StreetNode;
+import org.openstreetmap.josm.plugins.fixAddresses.StringUtils;
 import org.openstreetmap.josm.tools.ImageProvider;
 
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditModel.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditModel.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditModel.java	(revision 23933)
@@ -22,7 +22,7 @@
 import javax.swing.tree.TreeNode;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
-import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
-import org.openstreetmap.josm.plugins.addressEdit.StreetNode;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.INodeEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.StreetNode;
 
 public class AddressEditModel {
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditSelectionEvent.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditSelectionEvent.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditSelectionEvent.java	(revision 23933)
@@ -20,7 +20,7 @@
 import javax.swing.JTable;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
-import org.openstreetmap.josm.plugins.addressEdit.StreetNode;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.StreetNode;
 
 public class AddressEditSelectionEvent extends ActionEvent {
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditTableModel.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditTableModel.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditTableModel.java	(revision 23933)
@@ -16,7 +16,7 @@
 import javax.swing.table.DefaultTableModel;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.IAddressEditContainerListener;
-import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.IAddressEditContainerListener;
+import org.openstreetmap.josm.plugins.fixAddresses.INodeEntity;
 
 public abstract class AddressEditTableModel extends DefaultTableModel implements IAddressEditContainerListener{
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/ApplyAllGuessesAction.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/ApplyAllGuessesAction.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/ApplyAllGuessesAction.java	(revision 23933)
@@ -19,6 +19,6 @@
 import java.util.List;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
 
 @SuppressWarnings("serial")
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AssignAddressToStreetAction.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AssignAddressToStreetAction.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AssignAddressToStreetAction.java	(revision 23933)
@@ -16,7 +16,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
-import org.openstreetmap.josm.plugins.addressEdit.StreetNode;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.StreetNode;
 
 public class AssignAddressToStreetAction extends AbstractAddressEditAction {
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/GuessAddressDataAction.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/GuessAddressDataAction.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/GuessAddressDataAction.java	(revision 23933)
@@ -19,7 +19,7 @@
 import java.util.List;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressFinderThread;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressFinderThread;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
 
 /**
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesMouseListener.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesMouseListener.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesMouseListener.java	(revision 23933)
@@ -20,6 +20,6 @@
 import javax.swing.JTable;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
-import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.INodeEntity;
 
 public class IncompleteAddressesMouseListener implements MouseListener {
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesTableModel.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesTableModel.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesTableModel.java	(revision 23933)
@@ -16,8 +16,8 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
-import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
-import org.openstreetmap.josm.plugins.addressEdit.StringUtils;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.INodeEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.StringUtils;
 
 public class IncompleteAddressesTableModel extends AddressEditTableModel {
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/SelectAddressesInMapAction.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/SelectAddressesInMapAction.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/SelectAddressesInMapAction.java	(revision 23933)
@@ -35,6 +35,6 @@
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
 
 /**
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/StreetTableModel.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/StreetTableModel.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/StreetTableModel.java	(revision 23933)
@@ -16,7 +16,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
-import org.openstreetmap.josm.plugins.addressEdit.StreetNode;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.INodeEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.StreetNode;
 
 public class StreetTableModel extends AddressEditTableModel {
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/UnresolvedAddressesTableModel.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/UnresolvedAddressesTableModel.java	(revision 23932)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/UnresolvedAddressesTableModel.java	(revision 23933)
@@ -31,7 +31,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
-import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
-import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.AddressNode;
+import org.openstreetmap.josm.plugins.fixAddresses.INodeEntity;
 
 /**
