Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/DuplicateNodesFinder.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/DuplicateNodesFinder.java	(revision 24053)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/DuplicateNodesFinder.java	(revision 24054)
@@ -41,7 +41,10 @@
 		});
 
+		//sweep from top to bottom.
 		double prevY = Double.NEGATIVE_INFINITY;
 
 		for(Point2D point: points) {
+			boolean mappedToOtherPoint = false;
+
 			if (point.getY() - prevY > tolerance){
 				sweepLine.clear();
@@ -49,33 +52,27 @@
 			} else {
 				//small offset, test against existing points (there may be more than one)
-				while (sweepLine.containsKey(point)){
+
+				while (!mappedToOtherPoint && sweepLine.containsKey(point)) {
 					//a close point found
 					Point2D closePoint = sweepLine.get(point);
 					double dy = point.getY() - closePoint.getY();
-					if (dy <= tolerance){
+					if (dy <= tolerance) {
 						//mark them as close
-						result.put(closePoint, point);
+						result.put(point, closePoint);
+						mappedToOtherPoint = true;
 					}
+					else
+					{
+						sweepLine.remove(point);
 
-					sweepLine.remove(closePoint);
+					}
 				}
 			}
 
-			prevY = point.getY();
-			sweepLine.put(point, point);
-		}
-
-		//remove cascading relations
-		for(Point2D pt: points) {
-			if (!result.containsKey(pt)){
-				continue;
+			if (!mappedToOtherPoint) {
+				sweepLine.put(point, point);
 			}
 
-			Point2D rep = result.get(pt);
-			while (result.containsKey(rep)){
-				rep = result.get(rep);
-			}
-
-			result.put(pt, rep);
+			prevY = point.getY();
 		}
 
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/LoadPdfDialog.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/LoadPdfDialog.java	(revision 24053)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/LoadPdfDialog.java	(revision 24054)
@@ -3,5 +3,4 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.BorderLayout;
 import java.awt.Cursor;
 import java.awt.GridBagConstraints;
@@ -69,4 +68,6 @@
 	private JButton saveButton;
 	private JCheckBox debugModeCheck;
+	private JCheckBox mergeCloseNodesCheck;
+	private JTextField mergeCloseNodesTolerance;
 
 	public LoadPdfDialog() {
@@ -162,4 +163,15 @@
 
 		this.debugModeCheck = new JCheckBox(tr("Debug info"));
+		this.mergeCloseNodesCheck = new JCheckBox(tr("Merge close nodes"));
+		this.mergeCloseNodesTolerance = new JTextField();
+
+		JPanel configPanel = new JPanel(new GridBagLayout());
+		c.gridx = 0; c.gridy = 0; c.gridwidth = 1;
+		configPanel.add(this.mergeCloseNodesCheck, c);
+		c.gridx = 1; c.gridy = 0; c.gridwidth = 1;
+		configPanel.add(this.mergeCloseNodesTolerance, c);
+
+		c.gridx = 0; c.gridy = 1; c.gridwidth = 2;
+		configPanel.add(this.debugModeCheck, c);
 
 
@@ -169,6 +181,4 @@
 		selectFilePanel.add(this.loadFileButton, c);
 
-		c.gridx = 0; c.gridy = 1; c.gridwidth = 1;
-		selectFilePanel.add(this.debugModeCheck, c);
 
 		JPanel projectionPanel = new JPanel(new GridBagLayout());
@@ -221,8 +231,13 @@
 		okCancelPanel.add(this.saveButton);
 
-		JPanel panel = new JPanel(new BorderLayout());
-		panel.add(okCancelPanel, BorderLayout.SOUTH);
-		panel.add(projectionPanel, BorderLayout.CENTER);
-		panel.add(selectFilePanel, BorderLayout.NORTH);
+		JPanel panel = new JPanel(new GridBagLayout());
+		c.gridx = 0; c.gridy = 0; c.gridwidth = 1;
+		panel.add(configPanel, c);
+		c.gridx = 0; c.gridy = 1; c.gridwidth = 1;
+		panel.add(selectFilePanel, c);
+		c.gridx = 0; c.gridy = 2; c.gridwidth = 1;
+		panel.add(projectionPanel, c);
+		c.gridx = 0; c.gridy = 3; c.gridwidth = 1;
+		panel.add(okCancelPanel, c);
 
 		this.setSize(400, 400);
@@ -438,16 +453,17 @@
 		}
 
-		/*
-		File file = new File(fileName);
-
-		Document document = file.getDocument();
-		Page page = document.getPages().get(0);
-		data.bounds = page.getBox();
-
-		PDFStreamProcessor processor = new PDFStreamProcessor(data, document);
-		Contents c = page.getContents();
-		processor.process(new ContentScanner(c));
-		processor.finish();
-		document.delete();*/
+		if (this.mergeCloseNodesCheck.isSelected()) {
+			try {
+				double tolerance = Double.parseDouble(this.mergeCloseNodesTolerance.getText());
+				data.mergeNodes(tolerance);
+			}
+			catch (Exception e) {
+				JOptionPane
+				.showMessageDialog(
+						Main.parent,
+						tr("Tolerance is not a number"));
+				return null;
+			}
+		}
 
 		data.optimize();
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/PathOptimizer.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/PathOptimizer.java	(revision 24053)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/PathOptimizer.java	(revision 24054)
@@ -71,9 +71,7 @@
 	}
 
-	public void optimize()
-	{
-		//fix points
+
+	public void mergeNodes(double tolerance) {
 		Map<Point2D, Point2D> pointMap = DuplicateNodesFinder.findDuplicateNodes(uniquePoints, POINT_TOLERANCE);
-
 
 		for(LayerContents layer: this.layers) {
@@ -81,6 +79,8 @@
 			this.concatenatePaths(layer);
 		}
-
-
+	}
+
+	public void optimize()
+	{
 		List<LayerContents> newLayers = new ArrayList<LayerContents>();
 		/*
@@ -467,3 +467,4 @@
 	}
 
+
 }
