Index: trunk/src/org/openstreetmap/josm/data/CustomConfigurator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/CustomConfigurator.java	(revision 5161)
+++ trunk/src/org/openstreetmap/josm/data/CustomConfigurator.java	(revision 5162)
@@ -228,5 +228,5 @@
         try {
             String toXML = Main.pref.toXML(true);
-            InputStream is = new ByteArrayInputStream(toXML.getBytes());
+            InputStream is = new ByteArrayInputStream(toXML.getBytes("UTF-8"));
             DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
             builderFactory.setValidating(false);
@@ -422,4 +422,6 @@
             try {
                 is = new BufferedInputStream(new FileInputStream(file));
+                String fileDir = file.getParentFile().getAbsolutePath();
+                if (fileDir!=null) engine.eval("scriptDir='"+normalizeDirName(fileDir) +"';");
                 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
                 builderFactory.setValidating(false);
@@ -448,4 +450,7 @@
                 engine = new ScriptEngineManager().getEngineByName("rhino");
                 engine.eval("API={}; API.pref={}; API.fragments={};");
+                
+                engine.eval("homeDir='"+normalizeDirName(Main.pref.getPreferencesDir()) +"';");
+                engine.eval("josmVersion="+Version.getInstance().getVersion()+";");
                 String className =  CustomConfigurator.class.getName();
                 engine.eval("API.messageBox="+className+".messageBox");
@@ -679,5 +684,5 @@
          */
         private String evalVars(String s) {
-            Pattern p = Pattern.compile("\\$\\{(.*)\\}");
+            Pattern p = Pattern.compile("\\$\\{([^\\}]*)\\}");
             Matcher mr =  p.matcher(s);
             StringBuffer sb = new StringBuffer();
@@ -713,4 +718,10 @@
 
             return tmpPref;
+        }
+
+        private String normalizeDirName(String dir) {
+            String s = dir.replace("\\", "/");
+            if (s.endsWith("/")) s=s.substring(0,s.length()-1);
+            return s;
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 5161)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 5162)
@@ -304,5 +304,8 @@
             // plugins preference keys may be changed directly later, after plugins are downloaded
             // so we do not want to show it in the table as "changed" now
-            loaded.put("plugins", orig.get("plugins"));
+            Setting pluginSetting = orig.get("plugins");
+            if (pluginSetting!=null) {
+                loaded.put("plugins", pluginSetting);
+            }
         } else {
             loaded = orig;
