Index: /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputDialog.java
===================================================================
--- /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputDialog.java	(revision 19084)
+++ /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputDialog.java	(revision 19084)
@@ -0,0 +1,291 @@
+/**
+ * 
+ */
+package terracer;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Choice;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.GridLayout;
+import java.util.TreeSet;
+
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.widgets.AutoCompleteComboBox;
+
+/**
+ * The HouseNumberInputDialog is the layout of the house number input logic.
+ * Created with the Eclipse Visual Editor.
+ * 
+ *  This dialog is concerned with the layout.
+ * 
+ * @author casualwalker
+ *
+ */
+public class HouseNumberInputDialog extends JDialog {
+
+	protected static final String DEFAULT_MESSAGE = "Enter housenumbers or amount of segments";
+	private static final long serialVersionUID = 1L;
+	private JPanel jContentPane = null;
+	private JPanel inputPanel = null;
+	private JPanel buttonPanel = null;
+	private JLabel loLabel = null;
+	JTextField lo = null;
+	private JLabel hiLabel = null;
+	JTextField hi = null;
+	private JLabel streetLabel = null;
+	AutoCompleteComboBox street;
+	// JTextField street = null;
+	private JLabel segmentsLabel = null;
+	JTextField segments = null;
+	JTextArea messageLabel = null;
+	JButton okButton = null;
+	JButton cancelButton = null;
+	private JLabel interpolationLabel = null;
+	Choice interpolation = null;
+
+	/**
+	 * @param owner
+	 */
+	public HouseNumberInputDialog(Frame owner) {
+		super(owner);
+		initialize();
+	}
+
+	/**
+	 * This method initializes this
+	 * 
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(300, 200);
+		this.setTitle("Terrace a house");
+		this.setContentPane(getJContentPane());
+	}
+
+	/**
+	 * This method initializes jContentPane
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getJContentPane() {
+		if (jContentPane == null) {
+			messageLabel = new JTextArea();
+			messageLabel.setText(DEFAULT_MESSAGE);
+			messageLabel.setAutoscrolls(true);
+
+			messageLabel.setLineWrap(true);
+			messageLabel.setRows(2);
+			messageLabel.setBackground(new Color(238, 238, 238));
+			messageLabel.setEditable(false);
+			jContentPane = new JPanel();
+			jContentPane.setLayout(new BoxLayout(getJContentPane(),
+					BoxLayout.Y_AXIS));
+			jContentPane.add(getInputPanel(), null);
+			jContentPane.add(messageLabel, null);
+			jContentPane.add(getButtonPanel(), null);
+
+		}
+		return jContentPane;
+	}
+
+	/**
+	 * This method initializes inputPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getInputPanel() {
+		if (inputPanel == null) {
+			interpolationLabel = new JLabel();
+			interpolationLabel.setText("Interpolation");
+			segmentsLabel = new JLabel();
+			segmentsLabel.setText("Segments");
+			streetLabel = new JLabel();
+			streetLabel.setText("Street");
+			hiLabel = new JLabel();
+			hiLabel.setText("Highest Number");
+			loLabel = new JLabel();
+			loLabel.setText("Lowest Number");
+			loLabel.setPreferredSize(new Dimension(111, 16));
+			loLabel.setToolTipText("Lowest housenumber of the terraced house");
+			GridLayout gridLayout = new GridLayout();
+			gridLayout.setRows(5);
+			gridLayout.setColumns(2);
+			inputPanel = new JPanel();
+			inputPanel.setLayout(gridLayout);
+			inputPanel.add(loLabel, null);
+
+			inputPanel.add(getLo(), null);
+			inputPanel.add(hiLabel, null);
+			inputPanel.add(getHi(), null);
+			inputPanel.add(interpolationLabel, null);
+			inputPanel.add(getInterpolation(), null);
+			inputPanel.add(segmentsLabel, null);
+			inputPanel.add(getSegments(), null);
+			inputPanel.add(streetLabel, null);
+			inputPanel.add(getStreet(), null);
+		}
+		return inputPanel;
+	}
+
+	/**
+	 * This method initializes buttonPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getButtonPanel() {
+		if (buttonPanel == null) {
+			buttonPanel = new JPanel();
+			buttonPanel.setLayout(new FlowLayout());
+			buttonPanel.add(getOkButton(), null);
+			buttonPanel.add(getCancelButton(), null);
+		}
+		return buttonPanel;
+	}
+
+	/**
+	 * This method initializes lo	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getLo() {
+		if (lo == null) {
+			lo = new JTextField();
+			lo.setText("");
+		}
+		return lo;
+	}
+
+	/**
+	 * This method initializes hi	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getHi() {
+		if (hi == null) {
+			hi = new JTextField();
+			hi.setText("");
+		}
+		return hi;
+	}
+
+	/**
+	 * This method initializes street	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private AutoCompleteComboBox getStreet() {
+
+		if (street == null) {
+			final TreeSet<String> names = createAutoCompletionInfo();
+
+			street = new AutoCompleteComboBox();
+			street.setPossibleItems(names);
+			street.setEditable(true);
+			street.setSelectedItem(null);
+
+		}
+		return street;
+	}
+
+	/**
+	 * This method initializes segments	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getSegments() {
+		if (segments == null) {
+			segments = new JTextField();
+			segments.setText("1");
+		}
+		return segments;
+	}
+
+	/**
+	 * This method initializes okButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getOkButton() {
+		if (okButton == null) {
+			okButton = new JButton();
+			okButton.setText("OK");
+			okButton.setName("OK");
+		}
+		return okButton;
+	}
+
+	/**
+	 * This method initializes cancelButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getCancelButton() {
+		if (cancelButton == null) {
+			cancelButton = new JButton();
+			cancelButton.setText("Cancel");
+			cancelButton.setName("CANCEL");
+		}
+		return cancelButton;
+	}
+
+	/**
+	 * This method initializes interpolation	
+	 * 	
+	 * @return java.awt.Choice	
+	 */
+	private Choice getInterpolation() {
+		if (interpolation == null) {
+			interpolation = new Choice();
+			interpolation.add(tr("All"));
+			interpolation.add(tr("Even/Odd"));
+		}
+		return interpolation;
+	}
+
+	public void addHandler(HouseNumberInputHandler handler) {
+		this.hi.addActionListener(handler);
+		this.hi.addFocusListener(handler);
+
+		this.lo.addActionListener(handler);
+		this.lo.addFocusListener(handler);
+
+		this.segments.addActionListener(handler);
+		this.segments.addFocusListener(handler);
+
+		this.okButton.addActionListener(handler);
+		this.cancelButton.addActionListener(handler);
+
+		this.interpolation.addItemListener(handler);
+
+	}
+
+	/**
+	 * Generates a list of all visible names of highways in order to do
+	 * autocompletion on the road name.
+	 */
+	TreeSet<String> createAutoCompletionInfo() {
+		final TreeSet<String> names = new TreeSet<String>();
+		for (OsmPrimitive osm : Main.main.getCurrentDataSet()
+				.allNonDeletedPrimitives()) {
+			if (osm.getKeys() != null && osm.keySet().contains("highway")
+					&& osm.keySet().contains("name")) {
+				names.add(osm.get("name"));
+			}
+		}
+		return names;
+	}
+
+}
Index: /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputHandler.java
===================================================================
--- /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputHandler.java	(revision 19084)
+++ /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputHandler.java	(revision 19084)
@@ -0,0 +1,251 @@
+/**
+ * 
+ */
+package terracer;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.JButton;
+import javax.swing.JTextField;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * The Class HouseNumberInputHandler contains all the logic
+ * behind the house number input dialog.
+ * 
+ * From a refactoring viewpoint, this class is indeed more interested in the fields
+ * of the HouseNumberInputDialog. This is desired design, as the HouseNumberInputDialog 
+ * is already cluttered with auto-generated layout code.  
+ * 
+ * @author casualwalker
+ */
+public class HouseNumberInputHandler implements ChangeListener, ItemListener,
+		ActionListener, FocusListener {
+
+	TerracerAction terracerAction;
+	Way way;
+	HouseNumberInputDialog dialog;
+
+	public HouseNumberInputHandler(TerracerAction terracerAction, Way way,
+			String title) {
+		this.terracerAction = terracerAction;
+		this.way = way;
+		dialog = new HouseNumberInputDialog(null);
+		dialog.addHandler(this);
+
+		dialog.setVisible(true);
+		dialog.setTitle(title);
+
+	}
+
+	private void validateInput() {
+		boolean isOk = true;
+		StringBuffer message = new StringBuffer();
+
+		isOk = isOk && checkNumberOrder(message);
+		isOk = isOk && checkSegmentsFromHousenumber(message);
+		isOk = isOk && checkSegments(message);
+		isOk = isOk
+				&& checkNumberStringField(dialog.lo, "Lowest number", message);
+		isOk = isOk
+				&& checkNumberStringField(dialog.hi, "Highest number", message);
+		isOk = isOk
+				&& checkNumberStringField(dialog.segments, "Segments", message);
+
+		if (isOk) {
+			dialog.okButton.setEnabled(true);
+			dialog.messageLabel.setForeground(Color.black);
+			dialog.messageLabel.setText(HouseNumberInputDialog.DEFAULT_MESSAGE);
+
+		} else {
+			dialog.okButton.setEnabled(false);
+			dialog.messageLabel.setForeground(Color.red);
+			dialog.messageLabel.setText(message.toString());
+		}
+	}
+
+	private boolean checkNumberOrder(StringBuffer message) {
+		if (numberFrom() != null && numberTo() != null) {
+			if (numberFrom().intValue() > numberTo().intValue()) {
+				appendMessageNewLine(message);
+				message
+						.append("Lowest housenumber cannot be higher than highest housenumber");
+				return false;
+			}
+		}
+		return true;
+	}
+
+	private boolean checkSegmentsFromHousenumber(StringBuffer message) {
+		dialog.segments.setEditable(true);
+
+		if (numberFrom() != null && numberTo() != null) {
+			int segments = numberTo().intValue() - numberFrom().intValue();
+
+			if (segments % stepSize() != 0) {
+				appendMessageNewLine(message);
+				message.append("Housenumbers do not match odd/even setting");
+				return false;
+			}
+
+			int steps = segments / stepSize();
+			dialog.segments.setText(String.valueOf(steps));
+			dialog.segments.setEditable(false);
+
+		}
+		return true;
+	}
+
+	private boolean checkSegments(StringBuffer message) {
+		if (segments() == null || segments().intValue() < 1) {
+			appendMessageNewLine(message);
+			message.append("Segment must be a number greater 1");
+			return false;
+
+		}
+		return true;
+	}
+
+	/**
+	 * Check, if a string field contains a positive integer. 
+	 * 
+	 * @param field the field
+	 * @param label the label
+	 * @param message the message
+	 * 
+	 * @return true, if successful
+	 */
+	private boolean checkNumberStringField(JTextField field, String label,
+			StringBuffer message) {
+		String content = field.getText();
+		if (content != null && !content.isEmpty()) {
+			try {
+				int i = Integer.parseInt(content);
+				if (i < 0) {
+					appendMessageNewLine(message);
+					message.append(label + " must be greater than 0");
+					return false;
+				}
+			} catch (NumberFormatException e) {
+				appendMessageNewLine(message);
+				message.append(label + " is not a number");
+				return false;
+			}
+
+		}
+		return true;
+	}
+
+	/**
+	 * @param message
+	 */
+	private void appendMessageNewLine(StringBuffer message) {
+		if (message.length() > 0) {
+			message.append("\n");
+		}
+	}
+
+	@Override
+	public void stateChanged(ChangeEvent e) {
+		validateInput();
+
+	}
+
+	@Override
+	public void itemStateChanged(ItemEvent e) {
+		validateInput();
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+
+		if (e.getSource() instanceof JButton) {
+			JButton button = (JButton) e.getSource();
+			if ("OK".equals(button.getName())) {
+				terracerAction.terraceBuilding(way, segments(), numberFrom(),
+						numberTo(), stepSize(), streetName());
+
+				this.dialog.dispose();
+			} else if ("CANCEL".equals(button.getName())) {
+				this.dialog.dispose();
+			}
+		} else {
+			validateInput();
+		}
+
+	}
+
+	public int stepSize() {
+		return (dialog.interpolation.getSelectedItem() == tr("All")) ? 1 : 2;
+	}
+
+	public Integer segments() {
+		try {
+			return Integer.parseInt(dialog.segments.getText());
+		} catch (NumberFormatException ex) {
+			return null;
+		}
+	}
+
+	public Integer numberFrom() {
+		try {
+			return Integer.parseInt(dialog.lo.getText());
+		} catch (NumberFormatException ex) {
+			return null;
+		}
+	}
+
+	public Integer numberTo() {
+		try {
+			return Integer.parseInt(dialog.hi.getText());
+		} catch (NumberFormatException ex) {
+			return null;
+		}
+	}
+
+	public String streetName() {
+		// Object selected = street.getSelectedItem();
+		Object selected = dialog.street.getSelectedItem();
+		if (selected == null) {
+			return null;
+		} else {
+			String name = selected.toString();
+			if (name.length() == 0) {
+				return null;
+			} else {
+				return name;
+			}
+		}
+	}
+
+	@Override
+	public void focusGained(FocusEvent e) {
+		validateInput();
+	}
+
+	@Override
+	public void focusLost(FocusEvent e) {
+		validateInput();
+	}
+
+	/**
+	 * Indicates, if house numbers should be used (instead of segments).
+	 * 
+	 * @return true, if if both number values are set to a number.
+	 */
+	private boolean useHouseNumbers() {
+		return numberFrom() != null && numberTo() != null;
+
+	}
+}
Index: /applications/editors/josm/plugins/terracer/src/terracer/TerracerAction.java
===================================================================
--- /applications/editors/josm/plugins/terracer/src/terracer/TerracerAction.java	(revision 19083)
+++ /applications/editors/josm/plugins/terracer/src/terracer/TerracerAction.java	(revision 19084)
@@ -11,10 +11,5 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.awt.Choice;
-import java.awt.Component;
-import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
@@ -24,12 +19,5 @@
 import java.util.TreeSet;
 
-import javax.swing.JFormattedTextField;
-import javax.swing.JLabel;
 import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
@@ -44,6 +32,4 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.widgets.AutoCompleteComboBox;
-import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -63,15 +49,12 @@
 	// smsms1 asked for the last value to be remembered to make it easier to do
 	// repeated terraces. this is the easiest, but not necessarily nicest, way.
-	//private static String lastSelectedValue = "";
+	// private static String lastSelectedValue = "";
 
 	public TerracerAction() {
-		super(tr("Terrace a building"),
-				"terrace",
+		super(tr("Terrace a building"), "terrace",
 				tr("Creates individual buildings from a long building."),
-				Shortcut.registerShortcut("tools:Terracer",
-						tr("Tool: {0}", tr("Terrace a building")),
-						KeyEvent.VK_T, Shortcut.GROUP_EDIT,
-						Shortcut.SHIFT_DEFAULT),
-						true);
+				Shortcut.registerShortcut("tools:Terracer", tr("Tool: {0}",
+						tr("Terrace a building")), KeyEvent.VK_T,
+						Shortcut.GROUP_EDIT, Shortcut.SHIFT_DEFAULT), true);
 	}
 
@@ -81,5 +64,6 @@
 	 */
 	public void actionPerformed(ActionEvent e) {
-		Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
+		Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet()
+				.getSelected();
 		boolean badSelect = false;
 
@@ -88,32 +72,47 @@
 
 			if (prim instanceof Way) {
-				Way way = (Way)prim;
-
-				if ((way.getNodesCount() >= 5) &&
-						way.isClosed()) {
+				Way way = (Way) prim;
+
+				if ((way.getNodesCount() >= 5) && way.isClosed()) {
+					String title = trn("Change {0} object",
+							"Change {0} objects", sel.size(), sel.size());
+					if (sel.size() == 0)
+						title = tr("Nothing selected!");
+
 					// first ask the user how many buildings to terrace into
-					HouseNumberDialog dialog = new HouseNumberDialog();
-					final JOptionPane optionPane = new JOptionPane(dialog, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
-
-					String title = trn("Change {0} object", "Change {0} objects", sel.size(), sel.size());
-					if(sel.size() == 0)
-						title = tr("Nothing selected!");
-
-					optionPane.createDialog(Main.parent, title).setVisible(true);
-					Object answerObj = optionPane.getValue();
-					if (answerObj != null &&
-							answerObj != JOptionPane.UNINITIALIZED_VALUE &&
-							(answerObj instanceof Integer &&
-									(Integer)answerObj == JOptionPane.OK_OPTION)) {
-
-						// call out to the method which does the actual
-						// terracing.
-						terraceBuilding(way,
-								dialog.numberFrom(),
-								dialog.numberTo(),
-								dialog.stepSize(),
-								dialog.streetName());
-
-					}
+					HouseNumberInputHandler handler = new HouseNumberInputHandler(
+							this, way, title);
+
+					// IntermediateInputDialog inputDialog = new
+					// IntermediateInputDialog(
+					// this, way);
+					// inputDialog.pack();
+					// inputDialog.setVisible(true);
+
+					// HouseNumberDialog dialog = new HouseNumberDialog(this);
+					// final JOptionPane optionPane = new JOptionPane(dialog,
+					// JOptionPane.PLAIN_MESSAGE,
+					// JOptionPane.OK_CANCEL_OPTION);
+					//
+					// String title = trn("Change {0} object",
+					// "Change {0} objects", sel.size(), sel.size());
+					// if (sel.size() == 0)
+					// title = tr("Nothing selected!");
+					//
+					// optionPane.createDialog(Main.parent, title)
+					// .setVisible(true);
+					// Object answerObj = optionPane.getValue();
+					// if (answerObj != null
+					// && answerObj != JOptionPane.UNINITIALIZED_VALUE
+					// && (answerObj instanceof Integer && (Integer) answerObj
+					// == JOptionPane.OK_OPTION)) {
+					//
+					// // call out to the method which does the actual
+					// // terracing.
+					// terraceBuilding(way, dialog.numberFrom(), dialog
+					// .numberTo(), dialog.stepSize(), dialog
+					// .streetName());
+					//
+					// }
 				} else {
 					badSelect = true;
@@ -142,9 +141,19 @@
 	 * @param w The closed, quadrilateral way to terrace.
 	 */
-	private void terraceBuilding(Way w, int from, int to, int step, String streetName) {
-		final int nb = 1 + (to - from) / step;
+	public void terraceBuilding(Way w, Integer segments, Integer from,
+			Integer to, int step, String streetName) {
+		final int nb;
+		if (to != null && from != null) {
+			nb = 1 + (to.intValue() - from.intValue()) / step;
+		} else if (segments != null) {
+			nb = segments.intValue();
+		} else {
+			// TODO: we're in trouble.
+			// do exception handling.
+			nb = 0;
+		}
 
 		// now find which is the longest side connecting the first node
-		Pair<Way,Way> interp = findFrontAndBack(w);
+		Pair<Way, Way> interp = findFrontAndBack(w);
 
 		final double frontLength = wayLength(interp.a);
@@ -159,6 +168,8 @@
 		// create intermediate nodes by interpolating.
 		for (int i = 0; i <= nb; ++i) {
-			new_nodes[0][i] = interpolateAlong(interp.a, frontLength * (i) / (nb));
-			new_nodes[1][i] = interpolateAlong(interp.b, backLength * (i) / (nb));
+			new_nodes[0][i] = interpolateAlong(interp.a, frontLength * (i)
+					/ (nb));
+			new_nodes[1][i] = interpolateAlong(interp.b, backLength * (i)
+					/ (nb));
 			commands.add(new AddCommand(new_nodes[0][i]));
 			commands.add(new AddCommand(new_nodes[1][i]));
@@ -172,5 +183,6 @@
 		}
 		// note that we don't actually add the street member to the relation, as
-		// the name isn't unambiguous and it could cause confusion if the editor were
+		// the name isn't unambiguous and it could cause confusion if the editor
+		// were
 		// to automatically select one which wasn't the one the user intended.
 
@@ -178,12 +190,17 @@
 		for (int i = 0; i < nb; ++i) {
 			Way terr = new Way();
-			// Using Way.nodes.add rather than Way.addNode because the latter doesn't
+			// Using Way.nodes.add rather than Way.addNode because the latter
+			// doesn't
 			// exist in older versions of JOSM.
 			terr.addNode(new_nodes[0][i]);
-			terr.addNode(new_nodes[0][i+1]);
-			terr.addNode(new_nodes[1][i+1]);
+			terr.addNode(new_nodes[0][i + 1]);
+			terr.addNode(new_nodes[1][i + 1]);
 			terr.addNode(new_nodes[1][i]);
 			terr.addNode(new_nodes[0][i]);
-			terr.put("addr:housenumber", "" + (from + i * step));
+
+			if (from != null) {
+				// only, if the user has specified house numbers
+				terr.put("addr:housenumber", "" + (from + i * step));
+			}
 			terr.put("building", "yes");
 			if (streetName != null) {
@@ -215,6 +232,7 @@
 	private Node interpolateAlong(Way w, double l) {
 		Node n = null;
-		for (Pair<Node,Node> p : w.getNodePairs(false)) {
-			final double seg_length = p.a.getCoor().greatCircleDistance(p.b.getCoor());
+		for (Pair<Node, Node> p : w.getNodePairs(false)) {
+			final double seg_length = p.a.getCoor().greatCircleDistance(
+					p.b.getCoor());
 			if (l <= seg_length) {
 				n = interpolateNode(p.a, p.b, l / seg_length);
@@ -225,6 +243,8 @@
 		}
 		if (n == null) {
-			// sometimes there is a small overshoot due to numerical roundoff, so we just
-			// set these cases to be equal to the last node. its not pretty, but it works ;-)
+			// sometimes there is a small overshoot due to numerical roundoff,
+			// so we just
+			// set these cases to be equal to the last node. its not pretty, but
+			// it works ;-)
 			n = w.getNode(w.getNodesCount() - 1);
 		}
@@ -241,5 +261,5 @@
 	private double wayLength(Way w) {
 		double length = 0.0;
-		for (Pair<Node,Node> p : w.getNodePairs(false)) {
+		for (Pair<Node, Node> p : w.getNodePairs(false)) {
 			length += p.a.getCoor().greatCircleDistance(p.b.getCoor());
 		}
@@ -275,9 +295,10 @@
 
 		// if the second side has a shorter length and an approximately equal
-		// sideness then its better to choose the shorter, as with quadrilaterals
+		// sideness then its better to choose the shorter, as with
+		// quadrilaterals
 		// created using the orthogonalise tool the sideness will be about the
 		// same for all sides.
-		if (sideLength(w, side1) > sideLength(w, side1 + 1) &&
-			Math.abs(sideness[side1] - sideness[side1 + 1]) < 0.001) {
+		if (sideLength(w, side1) > sideLength(w, side1 + 1)
+				&& Math.abs(sideness[side1] - sideness[side1 + 1]) < 0.001) {
 			side1 = side1 + 1;
 			side2 = (side2 + 1) % (w.getNodesCount() - 1);
@@ -286,5 +307,6 @@
 		// swap side1 and side2 into sorted order.
 		if (side1 > side2) {
-			// i can't believe i have to write swap() myself - surely java standard
+			// i can't believe i have to write swap() myself - surely java
+			// standard
 			// library has this somewhere??!!?ONE!
 			int tmp = side2;
@@ -316,5 +338,5 @@
 	private double sideLength(Way w, int i) {
 		Node a = w.getNode(i);
-		Node b = w.getNode((i+1) % (w.getNodesCount() - 1));
+		Node b = w.getNode((i + 1) % (w.getNodesCount() - 1));
 		return a.getCoor().greatCircleDistance(b.getCoor());
 	}
@@ -336,7 +358,10 @@
 			public double x;
 			public int i;
+
 			public SortWithIndex(double a, int b) {
-				x = a; i = b;
-			}
+				x = a;
+				i = b;
+			}
+
 			public int compareTo(SortWithIndex o) {
 				return Double.compare(x, o.x);
@@ -366,15 +391,12 @@
 		double[] sideness = new double[length];
 
-		sideness[0] = calculateSideness(
-				w.getNode(length - 1), w.getNode(0),
-				w.getNode(1), w.getNode(2));
+		sideness[0] = calculateSideness(w.getNode(length - 1), w.getNode(0), w
+				.getNode(1), w.getNode(2));
 		for (int i = 1; i < length - 1; ++i) {
-			sideness[i] = calculateSideness(
-					w.getNode(i-1), w.getNode(i),
-					w.getNode(i+1), w.getNode(i+2));
-		}
-		sideness[length-1] = calculateSideness(
-				w.getNode(length - 2), w.getNode(length - 1),
-				w.getNode(length), w.getNode(1));
+			sideness[i] = calculateSideness(w.getNode(i - 1), w.getNode(i), w
+					.getNode(i + 1), w.getNode(i + 2));
+		}
+		sideness[length - 1] = calculateSideness(w.getNode(length - 2), w
+				.getNode(length - 1), w.getNode(length), w.getNode(1));
 
 		return sideness;
@@ -392,120 +414,6 @@
 		final double pdy = d.getCoor().getY() - c.getCoor().getY();
 
-		return (ndx * pdx + ndy * pdy) /
-		Math.sqrt((ndx * ndx + ndy * ndy) * (pdx * pdx + pdy * pdy));
-	}
-
-	/**
-	 * Dialog box to allow users to input housenumbers in a nice way.
-	 */
-	class HouseNumberDialog extends JPanel {
-		private SpinnerNumberModel lo, hi;
-		private JSpinner clo, chi;
-		private Choice step;
-		private AutoCompleteComboBox street;
-
-		public HouseNumberDialog() {
-			super(new GridBagLayout());
-			lo = new SpinnerNumberModel(1, 1, 1, 1);
-			hi = new SpinnerNumberModel(1, 1, null, 1);
-			step = new Choice();
-			step.add(tr("All"));
-			step.add(tr("Even"));
-			step.add(tr("Odd"));
-			clo = new JSpinner(lo);
-			chi = new JSpinner(hi);
-
-			lo.addChangeListener(new ChangeListener() {
-				public void stateChanged(ChangeEvent e) {
-					hi.setMinimum((Integer)lo.getNumber());
-				}
-			});
-			hi.addChangeListener(new ChangeListener() {
-				public void stateChanged(ChangeEvent e) {
-					lo.setMaximum((Integer)hi.getNumber());
-				}
-			});
-			step.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					if (step.getSelectedItem() == tr("All")) {
-						hi.setStepSize(1);
-						lo.setStepSize(1);
-					} else {
-						int odd_or_even = 0;
-						int min = 0;
-
-						if (step.getSelectedItem() == tr("Even")) {
-							odd_or_even = 0;
-							min = 2;
-						} else {
-							odd_or_even = 1;
-							min = 1;
-						}
-
-						if ((lo.getNumber().intValue() & 1) != odd_or_even) {
-							int nextval = lo.getNumber().intValue() - 1;
-							lo.setValue((nextval > min) ? nextval : min);
-						}
-						if ((hi.getNumber().intValue() & 1) != odd_or_even) {
-							int nextval = hi.getNumber().intValue() - 1;
-							hi.setValue((nextval > min) ? nextval : min);
-						}
-						lo.setMinimum(min);
-						hi.setStepSize(2);
-						lo.setStepSize(2);
-					}
-				}
-			});
-
-			final TreeSet<String> names = createAutoCompletionInfo();
-
-			street = new AutoCompleteComboBox();
-			street.setPossibleItems(names);
-			street.setEditable(true);
-			street.setSelectedItem(null);
-
-			JFormattedTextField x;
-			x = ((JSpinner.DefaultEditor)clo.getEditor()).getTextField();
-			x.setColumns(5);
-			x = ((JSpinner.DefaultEditor)chi.getEditor()).getTextField();
-			x.setColumns(5);
-			addLabelled(tr("Highest number") + ": ",   chi);
-			addLabelled(tr("Lowest number") + ": ", clo);
-			addLabelled(tr("Interpolation") + ": ", step);
-			addLabelled(tr("Street name") + " (" + tr("Optional") + "): ", street);
-		}
-
-		private void addLabelled(String str, Component c) {
-			JLabel label = new JLabel(str);
-			add(label, GBC.std());
-			label.setLabelFor(c);
-			add(c, GBC.eol());
-		}
-
-		public int numberFrom() {
-			return lo.getNumber().intValue();
-		}
-
-		public int numberTo() {
-			return hi.getNumber().intValue();
-		}
-
-		public int stepSize() {
-			return (step.getSelectedItem() == tr("All")) ? 1 : 2;
-		}
-
-		public String streetName() {
-			Object selected = street.getSelectedItem();
-			if (selected == null) {
-				return null;
-			} else {
-				String name = selected.toString();
-				if (name.length() == 0) {
-					return null;
-				} else {
-					return name;
-				}
-			}
-		}
+		return (ndx * pdx + ndy * pdy)
+				/ Math.sqrt((ndx * ndx + ndy * ndy) * (pdx * pdx + pdy * pdy));
 	}
 
@@ -513,11 +421,13 @@
 	 * Generates a list of all visible names of highways in order to do
 	 * autocompletion on the road name.
-	 */
-	private TreeSet<String> createAutoCompletionInfo() {
+	 * 
+	 * TODO: REMOVE this method here!
+	 */
+	TreeSet<String> createAutoCompletionInfo() {
 		final TreeSet<String> names = new TreeSet<String>();
-		for (OsmPrimitive osm : Main.main.getCurrentDataSet().allNonDeletedPrimitives()) {
-			if (osm.getKeys() != null &&
-					osm.keySet().contains("highway") &&
-					osm.keySet().contains("name")) {
+		for (OsmPrimitive osm : Main.main.getCurrentDataSet()
+				.allNonDeletedPrimitives()) {
+			if (osm.getKeys() != null && osm.keySet().contains("highway")
+					&& osm.keySet().contains("name")) {
 				names.add(osm.get("name"));
 			}
@@ -553,6 +463,8 @@
 		// screen coordinates rather than lat/lon, but it doesn't seem to
 		// make a great deal of difference at the scale of most terraces.
-		return new LatLon(a.getCoor().lat() * (1.0 - f) + b.getCoor().lat() * f,
-				a.getCoor().lon() * (1.0 - f) + b.getCoor().lon() * f);
+		return new LatLon(
+				a.getCoor().lat() * (1.0 - f) + b.getCoor().lat() * f, a
+						.getCoor().lon()
+						* (1.0 - f) + b.getCoor().lon() * f);
 	}
 }
