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 24172)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditTableModel.java	(revision 24174)
@@ -14,5 +14,13 @@
 package org.openstreetmap.josm.plugins.fixAddresses.gui;
 
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.Comparator;
+
+import javax.swing.JTable;
+import javax.swing.event.TableModelEvent;
 import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
 
 import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
@@ -20,11 +28,11 @@
 import org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity;
 
-public abstract class AddressEditTableModel extends DefaultTableModel implements IAddressEditContainerListener{
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 424009321818130586L;
+@SuppressWarnings("serial")
+public abstract class AddressEditTableModel extends DefaultTableModel implements
+		IAddressEditContainerListener {
+	
 	protected AddressEditContainer addressContainer;
+	protected int sortCol = 0;
+	protected boolean isSortAsc = true;
 
 	public AddressEditTableModel(AddressEditContainer addressContainer) {
@@ -46,17 +54,133 @@
 		} // else we don't do anything
 	}
-	
+
 	/**
-	 * Gets the node entity for the given row or null; if row contains no entity.
-	 * @param row The row to get the entity object for.
+	 * Gets the node entity for the given row or null; if row contains no
+	 * entity.
+	 * 
+	 * @param row
+	 *            The row to get the entity object for.
 	 * @return
 	 */
 	public abstract IOSMEntity getEntityOfRow(int row);
-	
+
 	/**
-	 * Gets the row for the given node entity or -1; if the model does not contain the entity.
-	 * @param entity The entity to get the row for.
+	 * Gets the row for the given node entity or -1; if the model does not
+	 * contain the entity.
+	 * 
+	 * @param entity
+	 *            The entity to get the row for.
 	 * @return
 	 */
 	public abstract int getRowOfEntity(IOSMEntity entity);
+
+	/**
+	 * Sorts the model data by the given column.
+	 * 
+	 * @param column
+	 *            the column
+	 * @param ascending
+	 *            the ascending
+	 */
+	protected abstract void sortByColumn(int column, boolean ascending);
+
+	
+	/**
+	 * The listener interface for receiving column events.
+	 * The class that is interested in processing a column
+	 * event implements this interface, and the object created
+	 * with that class is registered with a component using the
+	 * component's <code>addColumnListener<code> method. When
+	 * the column event occurs, that object's appropriate
+	 * method is invoked.
+	 *
+	 * @see ColumnEvent
+	 */
+	class ColumnListener extends MouseAdapter {
+		protected JTable table;
+
+		/**
+		 * Instantiates a new column listener.
+		 *
+		 * @param t the t
+		 */
+		public ColumnListener(JTable t) {
+			table = t;
+		}
+
+		/* (non-Javadoc)
+		 * @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)
+		 */
+		public void mouseClicked(MouseEvent e) {
+			TableColumnModel colModel = table.getColumnModel();
+			int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
+			int modelIndex = colModel.getColumn(columnModelIndex)
+					.getModelIndex();
+
+			if (modelIndex < 0) {
+				return;
+			}
+			// Same column? If yes, flip order
+			if (sortCol == modelIndex) {
+				isSortAsc = !isSortAsc;
+			} else {
+				sortCol = modelIndex;
+			}
+
+			for (int i = 0; i < colModel.getColumnCount(); i++) {
+				TableColumn column = colModel.getColumn(i);
+				column.setHeaderValue(getColumnName(column.getModelIndex()));
+			}
+			table.getTableHeader().repaint();
+
+			//Collections.sort(addressContainer, new MyComparator(isSortAsc));
+			
+			sortByColumn(sortCol, isSortAsc);
+			table.tableChanged(new TableModelEvent(AddressEditTableModel.this));
+			table.repaint();
+		}
+	}
+	
+	/**
+	 * Internal base class to sort items by different columns.
+	 */
+	protected abstract class ColumnSorter<E> implements Comparator<E> {
+		private int column;
+		private boolean ascending;
+		
+		/**
+		 * Instantiates a new address sorter.
+		 *
+		 * @param column the column to sort by
+		 */
+		public ColumnSorter(int column, boolean ascending) {
+			super();
+			this.column = column;
+			this.ascending = ascending;
+		}
+		
+		/**
+		 * Gets the index of the column to sort.
+		 *
+		 * @return the column
+		 */
+		protected int getColumn() {
+			return column;
+		}
+				
+		/**
+		 * Checks if sort mode is ascending or not.
+		 *
+		 * @return true, if is ascending
+		 */
+		protected boolean isAscending() {
+			return ascending;
+		}
+
+		/* (non-Javadoc)
+		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+		 */
+		@Override
+		public abstract int compare(E arg0, E arg1);
+	}
 }
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesDialog.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesDialog.java	(revision 24172)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesDialog.java	(revision 24174)
@@ -23,4 +23,5 @@
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
+import javax.swing.table.JTableHeader;
 
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
@@ -79,5 +80,8 @@
 		JPanel p = new JPanel(new BorderLayout());
 		
-		incompleteAddr = new JTable(new IncompleteAddressesTableModel(container));
+		IncompleteAddressesTableModel model = new IncompleteAddressesTableModel(container);
+		incompleteAddr = new JTable(model);
+	    JTableHeader header = incompleteAddr.getTableHeader();
+		header.addMouseListener(model.new ColumnListener(incompleteAddr));
 		incompleteAddr.getSelectionModel().addListSelectionListener(this);
 		
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 24172)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/IncompleteAddressesTableModel.java	(revision 24174)
@@ -16,7 +16,9 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Collections;
+
 import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
+import org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity;
 import org.openstreetmap.josm.plugins.fixAddresses.OSMAddress;
-import org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity;
 
 public class IncompleteAddressesTableModel extends AddressEditTableModel  {
@@ -26,5 +28,5 @@
 	private static final long serialVersionUID = -5951629033395186324L;
 	
-	// TODO: Add "state" colum, if required
+	// TODO: Add "state" column, if required
 	private static final int NUMBER_OF_COLUMNS = 5;
 	private static final String[] COLUMN_NAMES = new String[]{tr("Country"), tr("City"), tr("Postcode"), tr("Street"), tr("Number")}; 
@@ -110,5 +112,4 @@
 	@Override
 	public boolean isCellEditable(int row, int column) {
-		// TODO Auto-generated method stub
 		return false;
 	}
@@ -139,3 +140,62 @@
 		return addressContainer.getIncompleteAddresses().indexOf(entity);
 	}
+	
+
+	@Override
+	protected void sortByColumn(int column, boolean ascending) {
+		if (addressContainer.getNumberOfIncompleteAddresses() == 0) return;
+		
+		Collections.sort(addressContainer.getIncompleteAddresses(), 
+				new IncompleteAddressModelSorter(column, ascending));
+	}
+	
+	/**
+	 * Internal class StreetModelSorter.
+	 */
+	class IncompleteAddressModelSorter extends ColumnSorter<OSMAddress> {
+
+		/**
+		 * Instantiates a new incomplete address model sorter.
+		 *
+		 * @param column the column to sort
+		 * @param asc sort ascending
+		 */
+		public IncompleteAddressModelSorter(int column, boolean asc) {
+			super(column, asc);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel.ColumnSorter#compare(java.lang.Object, java.lang.Object)
+		 */
+		@Override
+		public int compare(OSMAddress arg0, OSMAddress arg1) {
+			int cc = 0;
+			
+			switch (getColumn()) {
+			case 0:								
+				cc=arg0.getCountry().compareTo(arg1.getCountry());
+				break;
+			case 1:
+				cc=arg0.getCity().compareTo(arg1.getCity());
+				break;
+			case 2:
+				cc=arg0.getPostCode().compareTo(arg1.getPostCode());
+				break;
+			case 3:
+				cc= arg0.getStreetName().compareTo(arg1.getStreetName());
+				break;
+			case 4:
+				cc=arg0.getHouseNumber().compareTo(arg1.getHouseNumber());
+				break;
+			default:
+				throw new RuntimeException("Invalid column index: " + getColumn());
+			}		
+			
+			if (!isAscending()) {
+				cc = -cc;
+			}
+			
+			return cc;
+		}
+	}
 }
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 24172)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/StreetTableModel.java	(revision 24174)
@@ -16,19 +16,15 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Collections;
+
 import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
 import org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity;
 import org.openstreetmap.josm.plugins.fixAddresses.OSMStreet;
 
+@SuppressWarnings("serial")
 public class StreetTableModel extends AddressEditTableModel {
-
 	private static final int NUMBER_OF_COLUMNS = 3;
 	private static final String[] COLUMN_NAMES = new String[]{tr("Type"), tr("Name"), tr("Addresses")}; 
 	private static final Class<?>[] COLUMN_CLASSES = new Class<?>[]{String.class, String.class, Integer.class};
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 424009321818130586L;
-
 	/**
 	 * @param addressContainer
@@ -127,3 +123,45 @@
 		return addressContainer.getStreetList().indexOf(entity);
 	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel#sortByColumn(int, boolean)
+	 */
+	@Override
+	protected void sortByColumn(int column, boolean ascending) {
+		Collections.sort(addressContainer.getStreetList(), new StreetModelSorter(column, ascending));
+	}
+	
+	/**
+	 * Internal class StreetModelSorter.
+	 */
+	class StreetModelSorter extends ColumnSorter<OSMStreet> {
+
+		public StreetModelSorter(int column, boolean asc) {
+			super(column, asc);
+		}
+
+		public int compare(OSMStreet arg0, OSMStreet arg1) {
+			if (arg0 == null || arg1 == null) return 0;
+			
+			switch (getColumn()) {
+			case 0:
+				if (arg0.getType() != null) {
+					return arg0.getType().compareTo(arg1.getType());
+				} else {
+					return arg1.hasName() ? -1 : 0;
+				}
+			case 1:
+				if (arg0.hasName()) {
+					return arg0.getName().compareTo(arg1.getName());
+				} else {
+					return arg1.hasName() ? -1 : 0;
+				}
+			case 2:
+				return new Integer(arg0.getNumberOfAddresses()).
+								compareTo(new Integer(arg1.getNumberOfAddresses()));
+			default:
+			}
+			return 0;
+		}
+	}
 }
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 24172)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/UnresolvedAddressesTableModel.java	(revision 24174)
@@ -31,4 +31,6 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Collections;
+
 import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
 import org.openstreetmap.josm.plugins.fixAddresses.OSMAddress;
@@ -36,7 +38,10 @@
 import org.openstreetmap.josm.plugins.fixAddresses.StringUtils;
 import org.openstreetmap.josm.plugins.fixAddresses.TagUtils;
+import org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel.ColumnSorter;
+import org.openstreetmap.josm.plugins.fixAddresses.gui.IncompleteAddressesTableModel.IncompleteAddressModelSorter;
 
 /**
  * Provides a table model to show unresolved addresses.
+ * 
  * @author Oliver Wieland <oliver.wieland@online.de>
  * 
@@ -46,15 +51,16 @@
 
 	private static final int NUMBER_OF_COLUMNS = 5;
-	private static final String[] COLUMN_NAMES = new String[]{
-		tr("Street"), tr("Number"), tr("City"), tr("Postcode"), tr("Name")};
-	
-	private static final Class<?>[] COLUMN_CLASSES = new Class<?>[]{
-		String.class, String.class, String.class, String.class, String.class};
-	
+	private static final String[] COLUMN_NAMES = new String[] { tr("Street"),
+			tr("Number"), tr("City"), tr("Postcode"), tr("Name") };
+
+	private static final Class<?>[] COLUMN_CLASSES = new Class<?>[] {
+			String.class, String.class, String.class, String.class,
+			String.class };
+
 	/**
 	 * 
 	 */
 	private static final long serialVersionUID = 424009321818130586L;
-	
+
 	/**
 	 * @param addressContainer
@@ -64,5 +70,7 @@
 	}
 
-	/* (non-Javadoc)
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see javax.swing.table.DefaultTableModel#getColumnCount()
 	 */
@@ -72,5 +80,7 @@
 	}
 
-	/* (non-Javadoc)
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see javax.swing.table.DefaultTableModel#getColumnName(int)
 	 */
@@ -80,10 +90,13 @@
 	}
 
-	/* (non-Javadoc)
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see javax.swing.table.DefaultTableModel#getRowCount()
 	 */
 	@Override
 	public int getRowCount() {
-		if (addressContainer == null || addressContainer.getUnresolvedAddresses() == null) {
+		if (addressContainer == null
+				|| addressContainer.getUnresolvedAddresses() == null) {
 			return 0;
 		}
@@ -91,5 +104,7 @@
 	}
 
-	/* (non-Javadoc)
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see javax.swing.table.DefaultTableModel#getValueAt(int, int)
 	 */
@@ -97,9 +112,9 @@
 	public Object getValueAt(int row, int column) {
 		OSMAddress aNode = (OSMAddress) getEntityOfRow(row);
-		
+
 		if (aNode == null) {
 			return null;
 		}
-		
+
 		switch (column) {
 		case 0:
@@ -121,8 +136,10 @@
 			throw new RuntimeException("Invalid column index: " + column);
 		}
-		
-	}
-	
-	/* (non-Javadoc)
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
 	 */
@@ -132,5 +149,7 @@
 	}
 
-	/* (non-Javadoc)
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see javax.swing.table.DefaultTableModel#isCellEditable(int, int)
 	 */
@@ -140,10 +159,15 @@
 	}
 
-	/* (non-Javadoc)
-	 * @see org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel#getEntityOfRow(int)
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel
+	 * #getEntityOfRow(int)
 	 */
 	@Override
 	public IOSMEntity getEntityOfRow(int row) {
-		if (addressContainer == null || addressContainer.getUnresolvedAddresses() == null) {
+		if (addressContainer == null
+				|| addressContainer.getUnresolvedAddresses() == null) {
 			return null;
 		}
@@ -151,14 +175,76 @@
 			return null;
 		}
-		return addressContainer.getUnresolvedAddresses().get(row);	
-	}
-	
+		return addressContainer.getUnresolvedAddresses().get(row);
+	}
+
 	@Override
 	public int getRowOfEntity(IOSMEntity entity) {
-		if (addressContainer == null || addressContainer.getUnresolvedAddresses() == null) {
+		if (addressContainer == null
+				|| addressContainer.getUnresolvedAddresses() == null) {
 			return -1;
 		}
-		
+
 		return addressContainer.getUnresolvedAddresses().indexOf(entity);
 	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel
+	 * #sortByColumn(int, boolean)
+	 */
+	@Override
+	protected void sortByColumn(int column, boolean ascending) {
+		if (addressContainer.getNumberOfUnresolvedAddresses() == 0)
+			return;
+
+		Collections.sort(addressContainer.getUnresolvedAddresses(),
+				new UnresolvedAddressModelSorter(column, ascending));
+	}
+
+	/**
+	 * Internal class StreetModelSorter.
+	 */
+	class UnresolvedAddressModelSorter extends ColumnSorter<OSMAddress> {
+
+		public UnresolvedAddressModelSorter(int column, boolean asc) {
+			super(column, asc);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditTableModel
+		 * .ColumnSorter#compare(java.lang.Object, java.lang.Object)
+		 */
+		@Override
+		public int compare(OSMAddress arg0, OSMAddress arg1) {
+			int cc = 0;
+			switch (getColumn()) {
+			case 0:
+				cc = arg0.getStreetName().compareTo(arg1.getStreetName());
+				break;
+			case 1:
+				cc = arg0.getHouseNumber().compareTo(arg1.getHouseNumber());
+				break;
+			case 2:
+				cc = arg0.getCity().compareTo(arg1.getCity());
+				break;
+			case 3:
+				cc = arg0.getPostCode().compareTo(arg1.getPostCode());
+				break;
+			default:
+				throw new RuntimeException("Invalid column index: "
+						+ getColumn());
+			}
+
+			if (!isAscending()) {
+				cc = -cc;
+			}
+
+			return cc;
+		}
+	}
 }
