Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 206)
+++ src/org/openstreetmap/josm/Main.java	(revision 207)
@@ -14,5 +14,7 @@
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.SortedMap;
 import java.util.StringTokenizer;
+import java.util.TreeMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -190,22 +192,40 @@
 
 	/**
-	 * Load all plugins specified in preferences. Has to be called after the complete
-	 * GUI has been set up. (post-constructor)
-	 */
-	public void loadPlugins() {
-		if (Main.pref.hasKey("plugins")) {
-			for (String pluginName : Main.pref.get("plugins").split(",")) {
+	 * Load all plugins specified in preferences. If the parameter is <code>true</code>, all
+	 * early plugins are loaded (before constructor).
+	 */
+	public static void loadPlugins(boolean early) {
+		if (!Main.pref.hasKey("plugins"))
+			return;
+		SortedMap<Integer, Collection<PluginInformation>> p = new TreeMap<Integer, Collection<PluginInformation>>();
+		for (String pluginName : Main.pref.get("plugins").split(",")) {
+			File pluginFile = new File(pref.getPreferencesDir()+"plugins/"+pluginName+".jar");
+			if (pluginFile.exists()) {
+				PluginInformation info = new PluginInformation(pluginFile);
+				if (info.early != early)
+					continue;
+				if (!p.containsKey(info.stage))
+					p.put(info.stage, new LinkedList<PluginInformation>());
+				p.get(info.stage).add(info);
+			} else {
+				if (early)
+					System.out.println("Plugin not found: "+pluginName); // do not translate
+				else	
+					JOptionPane.showMessageDialog(Main.parent, tr("Plugin not found: {0}.", pluginName));
+			}
+		}
+		for (Collection<PluginInformation> c : p.values()) {
+			for (PluginInformation info : c) {
 				try {
-					File pluginFile = new File(pref.getPreferencesDir()+"plugins/"+pluginName+".jar");
-					if (pluginFile.exists()) {
-						PluginInformation info = new PluginInformation(pluginFile);
-						Class<?> klass = info.loadClass();
-						ImageProvider.sources.add(0, klass);
-						plugins.add(info.load(klass));
-					} else
-						JOptionPane.showMessageDialog(Main.parent, tr("Plugin not found: {0}.", pluginName));
+					Class<?> klass = info.loadClass();
+					ImageProvider.sources.add(0, klass);
+					System.out.println("loading "+info.name);
+					plugins.add(info.load(klass));
 				} catch (PluginException e) {
 					e.printStackTrace();
-					JOptionPane.showMessageDialog(Main.parent, tr("Could not load plugin {0}.", pluginName));
+					if (early)
+						System.out.println("Could not load plugin: "+info.name); // do not translate
+					else
+						JOptionPane.showMessageDialog(Main.parent, tr("Could not load plugin {0}.", info.name));
 				}
 			}
@@ -307,5 +327,5 @@
 			bounds = !args.containsKey("no-fullscreen") ? new Rectangle(0,0,screenDimension.width,screenDimension.height) : new Rectangle(1000,740);
 
-		pleaseWaitDlg = new PleaseWaitDialog();
+			pleaseWaitDlg = new PleaseWaitDialog();
 	}
 
@@ -319,5 +339,5 @@
 		if (args.containsKey("selection"))
 			for (String s : args.get("selection"))
-				SearchAction.search(s, SearchAction.SearchMode.add);
+				SearchAction.search(s, SearchAction.SearchMode.add, false);
 	}
 
Index: src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 206)
+++ src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 207)
@@ -9,4 +9,5 @@
 
 import javax.swing.ButtonGroup;
+import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -51,4 +52,6 @@
     	bg.add(add);
     	bg.add(remove);
+    	
+    	JCheckBox caseSensitive = new JCheckBox(tr("case sensitive"), false);
     
     	JPanel p = new JPanel(new GridBagLayout());
@@ -57,5 +60,6 @@
     	p.add(replace, GBC.eol());
     	p.add(add, GBC.eol());
-    	p.add(remove, GBC.eol());
+    	p.add(remove, GBC.eop());
+    	p.add(caseSensitive, GBC.eol());
     	JOptionPane pane = new JOptionPane(p, JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null){
     		@Override public void selectInitialValue() {
@@ -69,8 +73,8 @@
     	lastSearch = input.getText();
     	SearchAction.SearchMode mode = replace.isSelected() ? SearchAction.SearchMode.replace : (add.isSelected() ? SearchAction.SearchMode.add : SearchAction.SearchMode.remove);
-    	search(lastSearch, mode);
+    	search(lastSearch, mode, caseSensitive.isSelected());
     }
 
-	public static void search(String search, SearchMode mode) {
+	public static void search(String search, SearchMode mode, boolean caseSensitive) {
     	if (search.startsWith("http://") || search.startsWith("ftp://") || search.startsWith("https://") || search.startsWith("file:/")) {
     		SelectionWebsiteLoader loader = new SelectionWebsiteLoader(search, mode);
@@ -81,5 +85,5 @@
     	}
     	Collection<OsmPrimitive> sel = Main.ds.getSelected();
-    	SearchCompiler.Match matcher = SearchCompiler.compile(search);
+    	SearchCompiler.Match matcher = SearchCompiler.compile(search, caseSensitive);
     	for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives()) {
     		if (mode == SearchMode.replace) {
Index: src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 206)
+++ src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 207)
@@ -17,4 +17,6 @@
 public class SearchCompiler {
 
+	boolean caseSensitive = false;
+	
 	abstract public static class Match {
 		abstract public boolean match(OsmPrimitive osm);
@@ -65,5 +67,5 @@
 	}
 
-	private static class KeyValue extends Match {
+	private class KeyValue extends Match {
 		private String key;
 		private String value;
@@ -78,10 +80,12 @@
 			if (value == null)
 				return notValue;
-			return (value.toLowerCase().indexOf(this.value.toLowerCase()) != -1) != notValue;
+			String v1 = caseSensitive ? value : value.toLowerCase();
+			String v2 = caseSensitive ? this.value : this.value.toLowerCase();
+			return (v1.indexOf(v2) != -1) != notValue;
 		}
 		@Override public String toString() {return key+"="+(notValue?"!":"")+value;}
 	}
 
-	private static class Any extends Match {
+	private class Any extends Match {
 		private String s;
 		public Any(String s) {this.s = s;}
@@ -89,8 +93,11 @@
 			if (osm.keys == null)
 				return s.equals("");
-			for (Entry<String, String> e : osm.keys.entrySet())
-				if (e.getKey().toLowerCase().indexOf(s.toLowerCase()) != -1 
-						|| e.getValue().toLowerCase().indexOf(s.toLowerCase()) != -1)
+			for (Entry<String, String> e : osm.keys.entrySet()) {
+				String key = caseSensitive ? e.getKey() : e.getKey().toLowerCase();
+				String value = caseSensitive ? e.getValue() : e.getValue().toLowerCase();
+				String search = caseSensitive ? s : s.toLowerCase();
+				if (key.indexOf(search) != -1 || value.indexOf(search) != -1)
 					return true;
+			}
 			return false;
 		}
@@ -134,6 +141,8 @@
 	}
 	
-	public static Match compile(String searchStr) {
-		return new SearchCompiler().parse(new PushbackReader(new StringReader(searchStr)));
+	public static Match compile(String searchStr, boolean caseSensitive) {
+		SearchCompiler searchCompiler = new SearchCompiler();
+		searchCompiler.caseSensitive = caseSensitive;
+		return searchCompiler.parse(new PushbackReader(new StringReader(searchStr)));
 	}
 
Index: src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainApplication.java	(revision 206)
+++ src/org/openstreetmap/josm/gui/MainApplication.java	(revision 207)
@@ -21,8 +21,6 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.plugins.PluginException;
 import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.tools.BugReportExceptionHandler;
-import org.openstreetmap.josm.tools.ImageProvider;
 /**
  * Main window class application.
@@ -119,23 +117,5 @@
 
 		// load the early plugins
-		if (Main.pref.hasKey("plugins")) {
-			for (String pluginName : Main.pref.get("plugins").split(",")) {
-				try {
-					File pluginFile = new File(pref.getPreferencesDir()+"plugins/"+pluginName+".jar");
-					if (pluginFile.exists()) {
-						PluginInformation info = new PluginInformation(pluginFile);
-						if (!info.early)
-							continue;
-						Class<?> klass = info.loadClass();
-						ImageProvider.sources.add(0, klass);
-						Main.plugins.add(info.load(klass));
-					} else
-						System.out.println("Plugin not found: "+pluginName);
-				} catch (PluginException e) {
-					System.out.println("Could not load plugin "+pluginName);
-					e.printStackTrace();
-				}
-			}
-		}
+		Main.loadPlugins(true);
 
 		if (argList.contains("--help") || argList.contains("-?") || argList.contains("-h")) {
@@ -171,5 +151,5 @@
 		Main.parent = mainFrame;
 		final Main main = new MainApplication(mainFrame);
-		main.loadPlugins();
+		Main.loadPlugins(false);
 
 		mainFrame.setVisible(true);
Index: src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 206)
+++ src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 207)
@@ -40,4 +40,5 @@
 	public final boolean early;
 	public final String author;
+	public final int stage;
 	public final List<URL> libraries = new ArrayList<URL>();
 
@@ -57,4 +58,6 @@
 			description = attr.getValue("Plugin-Description");
 			early = Boolean.parseBoolean(attr.getValue("Plugin-Early"));
+			String stageStr = attr.getValue("Plugin-Stage");
+			stage = stageStr == null ? 50 : Integer.parseInt(stageStr);
 			author = attr.getValue("Author");
 			libraries.add(new URL(getURLString(file.getAbsolutePath())));
