Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 118)
+++ src/org/openstreetmap/josm/Main.java	(revision 119)
@@ -7,6 +7,6 @@
 import java.awt.Rectangle;
 import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
 import java.io.File;
-import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -19,4 +19,5 @@
 import java.util.regex.Pattern;
 
+import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.JMenu;
@@ -46,4 +47,5 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.dialogs.AnnotationTester;
 import org.openstreetmap.josm.gui.dialogs.SelectionListDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -128,5 +130,5 @@
 		}
 	}
-	
+
 	/**
 	 * Remove the specified layer from the map. If it is the last layer, remove the map as well.
@@ -142,4 +144,13 @@
 		main = this;
 		contentPane.add(panel, BorderLayout.CENTER);
+
+		final Action annotationTesterAction = new AbstractAction(){
+			public void actionPerformed(ActionEvent e) {
+				String[] args = pref.get("annotation.sources").split(";");
+				new AnnotationTester(args);
+			}
+		};
+		annotationTesterAction.putValue(Action.NAME, "Annotation Preset Tester");
+		annotationTesterAction.putValue(Action.SMALL_ICON, ImageProvider.get("annotation-tester"));
 
 		final Action uploadAction = new UploadAction();
@@ -171,5 +182,5 @@
 		mainMenu.add(layerMenu);
 		layerMenu.setVisible(false);
-		
+
 		final JMenu editMenu = new JMenu(tr("Edit"));
 		editMenu.setMnemonic('E');
@@ -183,4 +194,6 @@
 		final JMenu helpMenu = new JMenu(tr("Help"));
 		helpMenu.setMnemonic('H');
+		helpMenu.add(annotationTesterAction);
+		helpMenu.addSeparator();
 		helpMenu.add(aboutAction);
 		mainMenu.add(helpMenu);
@@ -263,27 +276,8 @@
 	 */
 	public static void preConstructorInit(Map<String, Collection<String>> args) {
-		// load preferences
-		String errMsg = null;
 		try {
-			if (args.containsKey("reset-preferences")) {
-				Main.pref.resetToDefault();
-			} else {
-				Main.pref.load();
-			}
-		} catch (final IOException e1) {
-			e1.printStackTrace();
-			errMsg = tr("Preferences could not be loaded. Write default preference file to \"{0}\".",
-                    pref.getPreferencesDir() + "preferences");
-			Main.pref.resetToDefault();
-		}
-
-		try {
-	        Main.pref.upgrade(Integer.parseInt(AboutAction.version));
-        } catch (NumberFormatException e1) {
-        }
-
-		
-		if (errMsg != null)
-			JOptionPane.showMessageDialog(null, errMsg);
+			Main.pref.upgrade(Integer.parseInt(AboutAction.version));
+		} catch (NumberFormatException e1) {
+		}
 
 		try {
Index: src/org/openstreetmap/josm/command/ChangePropertyCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 118)
+++ src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 119)
@@ -70,5 +70,5 @@
 			text += " "+tr(v.className)+" "+v.name;
 		} else
-			text += objects.size()+" "+trn("object","objects",objects.size());
+			text += " "+objects.size()+" "+trn("object","objects",objects.size());
 		DefaultMutableTreeNode root = new DefaultMutableTreeNode(new JLabel(text, ImageProvider.get("data", "key"), JLabel.HORIZONTAL));
 		if (objects.size() == 1)
Index: src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 118)
+++ src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 119)
@@ -153,7 +153,18 @@
 			}
 		}
-		if (my == null)
+		if (my == null) {
+			// Add the way and replace any incomplete segments that we already have
 			ds.ways.add(other);
-		else {
+			for (Segment s : other.segments) {
+				if (s.incomplete) {
+					for (Segment ourSegment : ds.segments) {
+						if (ourSegment.id == s.id) {
+							mergedSegments.put(s, ourSegment);
+							break;
+						}
+					}
+				}
+			}
+		} else {
 			mergeCommon(my, other);
 			if (my.modified && !other.modified)
@@ -213,7 +224,6 @@
 	    	t.segments.addAll(newSegments);
 	    }
-	    for (Segment ls : t.segments) {
+	    for (Segment ls : t.segments)
 	    	fixSegment(ls);
-	    }
     }
 
Index: src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainApplication.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/MainApplication.java	(revision 119)
@@ -8,4 +8,5 @@
 import java.awt.event.WindowEvent;
 import java.io.File;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
@@ -87,5 +88,25 @@
 		}
 
-		// very first thing to do is to setup the locale
+		// get the preferences.
+		final File prefDir = new File(Main.pref.getPreferencesDir());
+		if (prefDir.exists() && !prefDir.isDirectory()) {
+			JOptionPane.showMessageDialog(null, "Cannot open preferences directory: "+Main.pref.getPreferencesDir());
+			return;
+		}
+		if (!prefDir.exists())
+			prefDir.mkdirs();
+		try {
+			if (args.containsKey("reset-preferences")) {
+				Main.pref.resetToDefault();
+			} else {
+				Main.pref.load();
+			}
+		} catch (final IOException e1) {
+			e1.printStackTrace();
+			JOptionPane.showMessageDialog(null, "Preferences could not be loaded. Write default preference file to "+pref.getPreferencesDir()+"preferences");
+			Main.pref.resetToDefault();
+		}
+
+		// setup the locale
 		if (args.containsKey("language") && !args.get("language").isEmpty() && args.get("language").iterator().next().length() >= 2) {
 			String s = args.get("language").iterator().next();
@@ -98,6 +119,16 @@
 				l = new Locale(s.substring(0,2), s.substring(3,5), s.substring(6));
 			Locale.setDefault(l);
+		} else if (!Main.pref.get("language").equals("")) {
+			String lang = Main.pref.get("language");
+			for (Locale l : Locale.getAvailableLocales()) {
+				if (l.toString().equals(lang)) {
+					Locale.setDefault(l);
+					break;
+				}
+			}
 		}
 		
+		// Locale is set. From now on, tr(), trn() and trc() may be called.
+
 		if (argList.contains("--help") || argList.contains("-?") || argList.contains("-h")) {
 			System.out.println(tr("Java OpenStreetMap Editor")+"\n\n"+
@@ -127,12 +158,4 @@
 		}
 
-		final File prefDir = new File(Main.pref.getPreferencesDir());
-		if (prefDir.exists() && !prefDir.isDirectory()) {
-			JOptionPane.showMessageDialog(null, tr("Cannot open preferences directory: {0}",Main.pref.getPreferencesDir()));
-			return;
-		}
-		if (!prefDir.exists())
-			prefDir.mkdirs();
-
 		preConstructorInit(args);
 		JFrame mainFrame = new JFrame(tr("Java Open Street Map - Editor"));
Index: src/org/openstreetmap/josm/gui/PreferenceDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/PreferenceDialog.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/PreferenceDialog.java	(revision 119)
@@ -10,4 +10,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.util.Locale;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -69,4 +70,5 @@
 		public void actionPerformed(ActionEvent e) {
 			Main.pref.put("laf", ((LookAndFeelInfo)lafCombo.getSelectedItem()).getClassName());
+			Main.pref.put("language", languages.getSelectedItem().toString());
 			Main.pref.put("projection", projectionCombo.getSelectedItem().getClass().getName());
 			Main.pref.put("osm-server.url", osmDataServer.getText());
@@ -94,5 +96,5 @@
 				String name = (String)colors.getValueAt(i, 0);
 				Color col = (Color)colors.getValueAt(i, 1);
-				Main.pref.put("color."+tr(name), ColorHelper.color2html(col));
+				Main.pref.put("color."+name, ColorHelper.color2html(col));
 			}
 
@@ -130,4 +132,5 @@
 	 */
 	private JComboBox lafCombo = new JComboBox(UIManager.getInstalledLookAndFeels());
+	private JComboBox languages = new JComboBox(new Locale[]{Locale.ENGLISH, Locale.GERMAN, Locale.FRENCH});
 	/**
 	 * The main tab panel.
@@ -202,4 +205,18 @@
 				requiresRestart = true;
 			}
+		});
+
+		// language
+		String lang = Main.pref.get("language");
+		for (int i = 0; i < languages.getItemCount(); ++i) {
+			if (languages.getItemAt(i).toString().equals(lang)) {
+				languages.setSelectedIndex(i);
+				break;
+			}
+		}
+		languages.setRenderer(new DefaultListCellRenderer(){
+			@Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+	            return super.getListCellRendererComponent(list, ((Locale)value).getDisplayName(), index, isSelected, cellHasFocus);
+            }
 		});
 
@@ -359,4 +376,7 @@
 		display.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
 		display.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
+		display.add(new JLabel(tr("Language")), GBC.std());
+		display.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+		display.add(languages, GBC.eol().fill(GBC.HORIZONTAL));
 		display.add(drawRawGpsLines, GBC.eol().insets(20,0,0,0));
 		display.add(forceRawGpsLines, GBC.eop().insets(40,0,0,0));
Index: src/org/openstreetmap/josm/gui/dialogs/AnnotationTester.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/AnnotationTester.java	(revision 119)
+++ src/org/openstreetmap/josm/gui/dialogs/AnnotationTester.java	(revision 119)
@@ -0,0 +1,97 @@
+package org.openstreetmap.josm.gui.dialogs;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Vector;
+
+import javax.swing.BorderFactory;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import org.xml.sax.SAXException;
+
+public class AnnotationTester extends JFrame {
+
+	private JComboBox annotationPresets;
+	private final String[] args;
+	private JPanel annotationPanel = new JPanel(new BorderLayout());
+	private JPanel panel = new JPanel(new BorderLayout());
+
+	public void reload() {
+		Vector<AnnotationPreset> allPresets = new Vector<AnnotationPreset>();
+		for (String source : args) {
+			InputStream in = null;
+			try {
+				if (source.startsWith("http") || source.startsWith("ftp") || source.startsWith("file"))
+					in = new URL(source).openStream();
+				else if (source.startsWith("resource://"))
+					in = AnnotationTester.class.getResourceAsStream(source.substring("resource:/".length()));
+				else
+					in = new FileInputStream(source);
+				allPresets.addAll(AnnotationPreset.readAll(in));
+			} catch (IOException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(null, "Could not read annotation preset source: "+source);
+			} catch (SAXException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(null, "Error parsing "+source+": "+e.getMessage());
+			}
+		}
+		annotationPresets.setModel(new DefaultComboBoxModel(allPresets));
+	}
+
+	public void reselect() {
+		annotationPanel.removeAll();
+		AnnotationPreset preset = (AnnotationPreset)annotationPresets.getSelectedItem();
+		JPanel p = preset.createPanel();
+		p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+		if (p != null)
+			annotationPanel.add(p, BorderLayout.NORTH);
+		panel.validate();
+		panel.repaint();
+	}
+	
+	public AnnotationTester(String[] args) {
+		super("Annotation Preset Tester");
+		this.args = args;
+		annotationPresets = new JComboBox();
+		reload();
+
+		panel.add(annotationPresets, BorderLayout.NORTH);
+		panel.add(annotationPanel, BorderLayout.CENTER);
+		annotationPresets.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				reselect();
+			}
+		});
+		reselect();
+
+		JButton b = new JButton("Reload");
+		b.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				int i = annotationPresets.getSelectedIndex();
+				reload();
+				annotationPresets.setSelectedIndex(i);
+			}
+		});
+		panel.add(b, BorderLayout.SOUTH);
+
+		setContentPane(panel);
+		setSize(300,500);
+		setVisible(true);
+	}
+
+	public static void main(String[] args) {
+		JFrame f = new AnnotationTester(args);
+		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+	}
+}
Index: src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 119)
@@ -5,5 +5,4 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Dimension;
 import java.awt.event.KeyEvent;
 import java.util.Collection;
@@ -30,6 +29,5 @@
 
 	public CommandStackDialog(final MapFrame mapFrame) {
-		super(tr("Command Stack"), "commandstack", tr("Open a list of all commands (undo buffer)."), KeyEvent.VK_C);
-		setPreferredSize(new Dimension(320,100));
+		super(tr("Command Stack"), "commandstack", tr("Open a list of all commands (undo buffer)."), KeyEvent.VK_C, 100);
 		mapFrame.mapView.addLayerChangeListener(new LayerChangeListener(){
 			public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
Index: src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 119)
@@ -49,5 +49,5 @@
 
 	public ConflictDialog() {
-		super(tr("Conflict"), "conflict", tr("Merging conflicts."), KeyEvent.VK_C);
+		super(tr("Conflict"), "conflict", tr("Merging conflicts."), KeyEvent.VK_C, 100);
 		displaylist.setCellRenderer(new OsmPrimitivRenderer());
 		displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
Index: src/org/openstreetmap/josm/gui/dialogs/LayerList.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 119)
@@ -5,5 +5,4 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Dimension;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
@@ -117,7 +116,6 @@
 	 */
 	public LayerList(MapFrame mapFrame) {
-		super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."), KeyEvent.VK_L);
+		super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."), KeyEvent.VK_L, 100);
 		instance = new JList(model);
-		setPreferredSize(new Dimension(320,100));
 		add(new JScrollPane(instance), BorderLayout.CENTER);
 		instance.setBackground(UIManager.getColor("Button.background"));
Index: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 119)
@@ -7,5 +7,4 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.GridLayout;
@@ -209,7 +208,6 @@
 	 */
 	public PropertiesDialog(MapFrame mapFrame) {
-		super(tr("Properties"), "propertiesdialog", tr("Property for selected objects."), KeyEvent.VK_P);
-		setPreferredSize(new Dimension(320,150));
-		
+		super(tr("Properties"), "propertiesdialog", tr("Property for selected objects."), KeyEvent.VK_P, 150);
+
 		Vector<AnnotationPreset> allPresets = new Vector<AnnotationPreset>();
 		String allAnnotations = Main.pref.get("annotation.sources");
@@ -219,18 +217,18 @@
 			String source = st.nextToken();
 			try {
-	            if (source.startsWith("http") || source.startsWith("ftp") || source.startsWith("file"))
-	            	in = new URL(source).openStream();
-	            else if (source.startsWith("resource://"))
-	            	in = Main.class.getResourceAsStream(source.substring("resource:/".length()));
-	            else
-	            	in = new FileInputStream(source);
-	            allPresets.addAll(AnnotationPreset.readAll(in));
-            } catch (IOException e) {
-	            e.printStackTrace();
-	            JOptionPane.showMessageDialog(Main.parent, tr("Could not read annotation preset source: {0}",source));
-            } catch (SAXException e) {
-	            e.printStackTrace();
-	            JOptionPane.showMessageDialog(Main.parent, tr("Error parsing {0}: ", source)+e.getMessage());
-            }
+				if (source.startsWith("http") || source.startsWith("ftp") || source.startsWith("file"))
+					in = new URL(source).openStream();
+				else if (source.startsWith("resource://"))
+					in = Main.class.getResourceAsStream(source.substring("resource:/".length()));
+				else
+					in = new FileInputStream(source);
+				allPresets.addAll(AnnotationPreset.readAll(in));
+			} catch (IOException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(Main.parent, tr("Could not read annotation preset source: {0}",source));
+			} catch (SAXException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(Main.parent, tr("Error parsing {0}: ", source)+e.getMessage());
+			}
 		}
 		if (allPresets.size() > 0) {
@@ -256,5 +254,5 @@
 				}
 				annotationPresets.setSelectedIndex(0);
-            }
+			}
 		});
 
Index: src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 119)
@@ -4,5 +4,4 @@
 
 import java.awt.BorderLayout;
-import java.awt.Dimension;
 import java.awt.GridBagLayout;
 import java.awt.GridLayout;
@@ -63,34 +62,34 @@
 		private OsmIdReader idReader = new OsmIdReader();
 		public SelectionWebsiteLoader(String urlStr, SearchMode mode) {
-	        super(tr("Load Selection"));
-	        this.mode = mode;
-	        URL u = null;
+			super(tr("Load Selection"));
+			this.mode = mode;
+			URL u = null;
 			try {u = new URL(urlStr);} catch (MalformedURLException e) {}
-            this.url = u;
-        }
+			this.url = u;
+		}
 		@Override protected void realRun() {
 			currentAction.setText(tr("Contact {0}...", url.getHost()));
 			sel = mode != SearchMode.remove ? new LinkedList<OsmPrimitive>() : Main.ds.allNonDeletedPrimitives();
 			try {
-		        URLConnection con = url.openConnection();
-		        InputStream in = new ProgressInputStream(con, progress, currentAction);
+				URLConnection con = url.openConnection();
+				InputStream in = new ProgressInputStream(con, progress, currentAction);
 				currentAction.setText(tr("Downloading..."));
 				Map<Long, String> ids = idReader.parseIds(in);
-		        for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives()) {
-		        	if (ids.containsKey(osm.id) && osm.getClass().getName().toLowerCase().endsWith(ids.get(osm.id))) {
-		        		if (mode == SearchMode.remove)
-		        			sel.remove(osm);
-		        		else
-		        			sel.add(osm);
-		        	}
+				for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives()) {
+					if (ids.containsKey(osm.id) && osm.getClass().getName().toLowerCase().endsWith(ids.get(osm.id))) {
+						if (mode == SearchMode.remove)
+							sel.remove(osm);
+						else
+							sel.add(osm);
+					}
 				}
-	        } catch (IOException e) {
-		        e.printStackTrace();
-		        JOptionPane.showMessageDialog(Main.parent, tr("Could not read from url: \"{0}\"",url));
-	        } catch (SAXException e) {
-		        e.printStackTrace();
-		        JOptionPane.showMessageDialog(Main.parent,tr("Parsing error in url: \"{0}\"",url));
-	        }
-        }
+			} catch (IOException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(Main.parent, tr("Could not read from url: \"{0}\"",url));
+			} catch (SAXException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(Main.parent,tr("Parsing error in url: \"{0}\"",url));
+			}
+		}
 		@Override protected void cancel() {
 			sel = null;
@@ -100,7 +99,7 @@
 			if (sel != null)
 				Main.ds.setSelected(sel);
-        }
-	}
-	
+		}
+	}
+
 	/**
 	 * The selection's list data.
@@ -111,5 +110,5 @@
 	 */
 	private JList displaylist = new JList(list);
-	
+
 	/**
 	 * Create a SelectionList dialog.
@@ -117,6 +116,5 @@
 	 */
 	public SelectionListDialog(MapFrame mapFrame) {
-		super(tr("Current Selection"), "selectionlist", tr("Open a selection list window."), KeyEvent.VK_E);
-		setPreferredSize(new Dimension(320,150));
+		super(tr("Current Selection"), "selectionlist", tr("Open a selection list window."), KeyEvent.VK_E, 150);
 		displaylist.setCellRenderer(new OsmPrimitivRenderer());
 		displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
@@ -132,5 +130,5 @@
 
 		JPanel buttonPanel = new JPanel(new GridLayout(1,2));
-		
+
 		JButton button = new JButton(tr("Select"), ImageProvider.get("mapmode/selection/select"));
 		button.setToolTipText(tr("Set the selected elements on the map to the selected items in the list above."));
@@ -150,5 +148,5 @@
 		});
 		buttonPanel.add(button);
-		
+
 		button = new JButton(tr("Search"), ImageProvider.get("dialogs", "search"));
 		button.setToolTipText(tr("Search for objects."));
@@ -164,5 +162,5 @@
 						"<li><code>-name:Bak</code>  - not 'Bak' in the name.</li>" +
 						"<li><code>foot:</code>  - key=foot set to any value." +
-						"</ul></html>"));
+				"</ul></html>"));
 
 				JRadioButton replace = new JRadioButton(tr("replace selection"), true);
@@ -183,5 +181,5 @@
 					@Override public void selectInitialValue() {
 						input.requestFocusInWindow();
-                    }
+					}
 				};
 				pane.createDialog(Main.parent,tr("Search")).setVisible(true);
@@ -194,5 +192,5 @@
 		});
 		buttonPanel.add(button);
-		
+
 		add(buttonPanel, BorderLayout.SOUTH);
 		selectionChanged(Main.ds.getSelected());
@@ -241,24 +239,24 @@
 		if (search.startsWith("http://") || search.startsWith("ftp://") || search.startsWith("https://") || search.startsWith("file:/")) {
 			SelectionWebsiteLoader loader = new SelectionWebsiteLoader(search, mode);
-	    	if (loader.url != null) {
-	    		Main.worker.execute(loader);
-	    		loader.pleaseWaitDlg.setVisible(true);
-	    		return;
-	    	}
-	    }
-	    Collection<OsmPrimitive> sel = Main.ds.getSelected();
-    	SearchCompiler.Match matcher = SearchCompiler.compile(search);
-    	for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives()) {
-    		if (mode == SearchMode.replace) {
-    			if (matcher.match(osm))
-    				sel.add(osm);
-    			else
-    				sel.remove(osm);
-    		} else if (mode == SearchMode.add && !osm.selected && matcher.match(osm))
-    			sel.add(osm);
-    		else if (mode == SearchMode.remove && osm.selected && matcher.match(osm))
-    			sel.remove(osm);
-    	}
-	    Main.ds.setSelected(sel);
-    }
+			if (loader.url != null) {
+				Main.worker.execute(loader);
+				loader.pleaseWaitDlg.setVisible(true);
+				return;
+			}
+		}
+		Collection<OsmPrimitive> sel = Main.ds.getSelected();
+		SearchCompiler.Match matcher = SearchCompiler.compile(search);
+		for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives()) {
+			if (mode == SearchMode.replace) {
+				if (matcher.match(osm))
+					sel.add(osm);
+				else
+					sel.remove(osm);
+			} else if (mode == SearchMode.add && !osm.selected && matcher.match(osm))
+				sel.add(osm);
+			else if (mode == SearchMode.remove && osm.selected && matcher.match(osm))
+				sel.remove(osm);
+		}
+		Main.ds.setSelected(sel);
+	}
 }
Index: src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 118)
+++ src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 119)
@@ -2,4 +2,5 @@
 
 import java.awt.BorderLayout;
+import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -44,6 +45,7 @@
 	public final String prefName;
 
-	public ToggleDialog(String name, String iconName, String tooltip, int shortCut) {
+	public ToggleDialog(String name, String iconName, String tooltip, int shortCut, int preferredHeight) {
 		this.prefName = iconName;
+		setPreferredSize(new Dimension(330,preferredHeight));
 		action = new ToggleDialogAction(name, "dialogs/"+iconName, tooltip, shortCut, KeyEvent.ALT_MASK, iconName);
 		setLayout(new BorderLayout());
Index: src/org/openstreetmap/josm/test/MergeVisitorTest.java
===================================================================
--- src/org/openstreetmap/josm/test/MergeVisitorTest.java	(revision 118)
+++ src/org/openstreetmap/josm/test/MergeVisitorTest.java	(revision 119)
@@ -238,5 +238,37 @@
 		assertSame("Do not import incomplete segments when merging ways.", s, w.segments.iterator().next());
 	}
+
+	/**
+	 * When merging an incomplete way over a dataset that contain already all
+	 * necessary segments, the way must be completed.
+	 */
+	@Bug(117)
+	public void testMergeIncompleteOnExistingDoesNotComplete() {
+		// create a dataset with an segment (as base for the later incomplete way)
+		DataSet ds = new DataSet();
+		Node[] n = createNodes(ds, 2);
+		Segment s = DataSetTestCaseHelper.createSegment(ds, n[0], n[1]);
+		s.id = 23;
+		// create an incomplete way which references the former segment
+		Way w = new Way();
+		Segment incompleteSegment = new Segment(s.id);
+		w.segments.add(incompleteSegment);
+		w.id = 42;
+		// merge both
+		MergeVisitor v = new MergeVisitor(ds);
+		v.visit(w);
+		v.fixReferences();
 		
+		assertTrue(ds.ways.contains(w));
+		assertEquals(1, w.segments.size());
+		assertFalse(w.segments.get(0).incomplete);
+	}
+	
+	/**
+	 * Deleted segments should be deleted when merged over unchanged segments.
+	 * Deleted segments should also raise an conflict when merged over changed segments. 
+	 */
+	//TODO
+
 	/**
 	 * Create that amount of nodes and add them to the dataset. The id will be 1,2,3,4...
