diff --git a/java/com/tigervnc/rfb/CSecurityTLS.java b/java/com/tigervnc/rfb/CSecurityTLS.java
index c7e3108..4486eef 100644
--- a/java/com/tigervnc/rfb/CSecurityTLS.java
+++ b/java/com/tigervnc/rfb/CSecurityTLS.java
@@ -34,11 +34,9 @@
 import java.util.Collection;
 import javax.swing.JOptionPane;
 
-import com.tigervnc.vncviewer.UserPrefs;
 import com.tigervnc.rdr.*;
 import com.tigervnc.network.*;
-import java.util.concurrent.Executors;
-import java.nio.channels.SelectionKey;
+import com.tigervnc.vncviewer.*;
 
 public class CSecurityTLS extends CSecurity {
 
@@ -74,24 +72,24 @@
     crlfile = x509crl.getData(); 
   }
 
+  public static String getDefaultCA() {
+    if (UserPreferences.get("viewer", "x509ca") != null)
+      return UserPreferences.get("viewer", "x509ca");
+    return FileUtils.getVncHomeDir()+"x509_ca.pem";
+  }
+
+  public static String getDefaultCRL() {
+    if (UserPreferences.get("viewer", "x509crl") != null)
+      return UserPreferences.get("viewer", "x509crl");
+    return FileUtils.getVncHomeDir()+"x509_crl.pem";
+  }
+
   public static void setDefaults()
   {
-    String homeDir = null;
-    
-    if ((homeDir=UserPrefs.getHomeDir()) == null) {
-      vlog.error("Could not obtain VNC home directory path");
-      return;
-    }
-
-    String vnchomedir = homeDir+UserPrefs.getFileSeparator()+".vnc"+
-                        UserPrefs.getFileSeparator();
-    String caDefault = new String(vnchomedir+"x509_ca.pem");
-    String crlDefault = new String(vnchomedir+"x509_crl.pem");
-
-    if (new File(caDefault).exists())
-      x509ca.setDefaultStr(caDefault);
-    if (new File(crlDefault).exists())
-      x509crl.setDefaultStr(crlDefault);
+    if (new File(getDefaultCA()).exists())
+      x509ca.setDefaultStr(getDefaultCA());
+    if (new File(getDefaultCRL()).exists())
+      x509crl.setDefaultStr(getDefaultCRL());
   }
 
 // FIXME:
diff --git a/java/com/tigervnc/rfb/Configuration.java b/java/com/tigervnc/rfb/Configuration.java
index de8cfc7..aca8b53 100644
--- a/java/com/tigervnc/rfb/Configuration.java
+++ b/java/com/tigervnc/rfb/Configuration.java
@@ -24,9 +24,15 @@
 
 package com.tigervnc.rfb;
 
+import java.io.FileInputStream;
+import java.io.PrintWriter;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
 public class Configuration {
 
-  static LogWriter vlog = new LogWriter("Config");
+  static LogWriter vlog = new LogWriter("Configuration");
 
   public enum ConfigurationObject { ConfGlobal, ConfServer, ConfViewer };
 
@@ -263,6 +269,67 @@
     }
   }
 
+  public static void load(String filename) {
+    if (filename == null)
+      return;
+
+    /* Read parameters from file */
+    Properties props = new Properties();
+    try {
+      props.load(new FileInputStream(filename));
+    } catch(java.security.AccessControlException e)	{
+      vlog.error("Cannot access system properties:"+e.getMessage());
+      return;
+    } catch (java.lang.Exception e)	{
+      vlog.error("Error opening config file:"+e.getMessage());
+      return;
+    }
+
+    for (Iterator i = props.stringPropertyNames().iterator(); i.hasNext();) {
+      String name = (String)i.next();
+      if (name.startsWith("[")) {
+        // skip the section delimiters
+        continue;
+      } else if (name.equals("host")) {
+        setParam("Server", props.getProperty(name));
+      } else if (name.equals("disableclipboard")) {
+        setParam("RecvClipboard", props.getProperty(name));
+        setParam("SendClipboard", props.getProperty(name));
+      } else if (name.equals("localcursor")) {
+        setParam("UseLocalCursor", props.getProperty(name));
+      } else {
+        if (!setParam(name, props.getProperty(name)))
+          vlog.debug("Cannot set parameter: "+name);
+      }
+    }
+  }
+
+  public static void save(String filename) {
+    PrintWriter pw = null;
+    try {
+      pw = new PrintWriter(filename, "UTF-8");
+    } catch (java.lang.Exception e)	{
+      vlog.error("Error opening config file:"+e.getMessage());
+      return;
+    }
+
+    pw.println("# TigerVNC viewer configuration");
+    DateFormat dateFormat = new SimpleDateFormat("E MMM d k:m:s z yyyy");
+    Date date = new Date();
+    pw.println("# "+dateFormat.format(date));
+    VoidParameter current = Configuration.global().head;
+    while (current != null) {
+      String name = current.getName();
+      String value = current.getValueStr();
+      if (!name.equals("Server") && !name.equals("Port") &&
+          value != null && value != current.getDefaultStr())
+        pw.println(name+"="+current.getValueStr());
+      current = current._next;
+    }
+    pw.flush();
+    pw.close();
+  }
+
   // Name for this Configuration
   private String name;
 
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index 3b42c39..22cbe1f 100644
--- a/java/com/tigervnc/vncviewer/CConn.java
+++ b/java/com/tigervnc/vncviewer/CConn.java
@@ -766,8 +766,8 @@
 
   public void setOptions() {
     int digit;
-    options.autoSelect.setSelected(autoSelect);
-    options.fullColour.setSelected(fullColour);
+    options.autoSelect.setSelected(viewer.autoSelect.getValue());
+    options.fullColour.setSelected(viewer.fullColour.getValue());
     options.veryLowColour.setSelected(!fullColour && lowColourLevel == 0);
     options.lowColour.setSelected(!fullColour && lowColourLevel == 1);
     options.mediumColour.setSelected(!fullColour && lowColourLevel == 2);
@@ -810,8 +810,12 @@
       options.secVnc.setEnabled(false);
       options.secPlain.setEnabled(false);
       options.sendLocalUsername.setEnabled(false);
+      options.cfLoadButton.setEnabled(false);
+      options.cfSaveAsButton.setEnabled(true);
     } else {
       options.shared.setSelected(viewer.shared.getValue());
+      options.sendLocalUsername.setSelected(viewer.sendLocalUsername.getValue());
+      options.cfSaveAsButton.setEnabled(false);
 
       /* Process non-VeNCrypt sectypes */
       java.util.List<Integer> secTypes = new ArrayList<Integer>();
@@ -819,15 +823,15 @@
       for (Iterator i = secTypes.iterator(); i.hasNext();) {
         switch ((Integer)i.next()) {
         case Security.secTypeVeNCrypt:
-          options.secVeNCrypt.setSelected(true);
+          options.secVeNCrypt.setSelected(UserPreferences.getBool("viewer", "secVeNCrypt", true));
           break;
         case Security.secTypeNone:
           options.encNone.setSelected(true);
-          options.secNone.setSelected(true);
+          options.secNone.setSelected(UserPreferences.getBool("viewer", "secTypeNone", true));
           break;
         case Security.secTypeVncAuth:
           options.encNone.setSelected(true);
-          options.secVnc.setSelected(true);
+          options.secVnc.setSelected(UserPreferences.getBool("viewer", "secTypeVncAuth", true));
           break;
         }
       }
@@ -839,46 +843,55 @@
         for (Iterator iext = secTypesExt.iterator(); iext.hasNext();) {
           switch ((Integer)iext.next()) {
           case Security.secTypePlain:
-            options.secPlain.setSelected(true);
+            options.encNone.setSelected(UserPreferences.getBool("viewer", "encNone", true));
+            options.secPlain.setSelected(UserPreferences.getBool("viewer", "secPlain", true));
             break;
           case Security.secTypeIdent:
-            options.secIdent.setSelected(true);
+            options.encNone.setSelected(UserPreferences.getBool("viewer", "encNone", true));
+            options.secIdent.setSelected(UserPreferences.getBool("viewer", "secIdent", true));
             break;
           case Security.secTypeTLSNone:
-            options.encTLS.setSelected(true);
-            options.secNone.setSelected(true);
+            options.encTLS.setSelected(UserPreferences.getBool("viewer", "encTLS", true));
+            options.secNone.setSelected(UserPreferences.getBool("viewer", "secNone", true));
             break;
           case Security.secTypeTLSVnc:
-            options.encTLS.setSelected(true);
-            options.secVnc.setSelected(true);
+            options.encTLS.setSelected(UserPreferences.getBool("viewer", "encTLS", true));
+            options.secVnc.setSelected(UserPreferences.getBool("viewer", "secVnc", true));
             break;
           case Security.secTypeTLSPlain:
-            options.encTLS.setSelected(true);
-            options.secPlain.setSelected(true);
+            options.encTLS.setSelected(UserPreferences.getBool("viewer", "encTLS", true));
+            options.secPlain.setSelected(UserPreferences.getBool("viewer", "secPlain", true));
             break;
           case Security.secTypeTLSIdent:
-            options.encTLS.setSelected(true);
-            options.secIdent.setSelected(true);
+            options.encTLS.setSelected(UserPreferences.getBool("viewer", "encTLS", true));
+            options.secIdent.setSelected(UserPreferences.getBool("viewer", "secIdent", true));
             break;
           case Security.secTypeX509None:
-            options.encX509.setSelected(true);
-            options.secNone.setSelected(true);
+            options.encX509.setSelected(UserPreferences.getBool("viewer", "encX509", true));
+            options.secNone.setSelected(UserPreferences.getBool("viewer", "secNone", true));
             break;
           case Security.secTypeX509Vnc:
-            options.encX509.setSelected(true);
-            options.secVnc.setSelected(true);
+            options.encX509.setSelected(UserPreferences.getBool("viewer", "encX509", true));
+            options.secVnc.setSelected(UserPreferences.getBool("viewer", "secVnc", true));
             break;
           case Security.secTypeX509Plain:
-            options.encX509.setSelected(true);
-            options.secPlain.setSelected(true);
+            options.encX509.setSelected(UserPreferences.getBool("viewer", "encX509", true));
+            options.secPlain.setSelected(UserPreferences.getBool("viewer", "secPlain", true));
             break;
           case Security.secTypeX509Ident:
-            options.encX509.setSelected(true);
-            options.secIdent.setSelected(true);
+            options.encX509.setSelected(UserPreferences.getBool("viewer", "encX509", true));
+            options.secIdent.setSelected(UserPreferences.getBool("viewer", "secIdent", true));
             break;
           }
         }
       }
+      options.encNone.setEnabled(options.secVeNCrypt.isSelected());
+      options.encTLS.setEnabled(options.secVeNCrypt.isSelected());
+      options.encX509.setEnabled(options.secVeNCrypt.isSelected());
+      options.ca.setEnabled(options.secVeNCrypt.isSelected());
+      options.crl.setEnabled(options.secVeNCrypt.isSelected());
+      options.secIdent.setEnabled(options.secVeNCrypt.isSelected());
+      options.secPlain.setEnabled(options.secVeNCrypt.isSelected());
       options.sendLocalUsername.setEnabled(options.secPlain.isSelected()||
         options.secIdent.isSelected());
     }
diff --git a/java/com/tigervnc/vncviewer/F8Menu.java b/java/com/tigervnc/vncviewer/F8Menu.java
index 5d804b5..07e8974 100644
--- a/java/com/tigervnc/vncviewer/F8Menu.java
+++ b/java/com/tigervnc/vncviewer/F8Menu.java
@@ -22,6 +22,7 @@
 import java.awt.Cursor;
 import java.awt.event.*;
 import javax.swing.JFrame;
+import javax.swing.JFileChooser;
 import javax.swing.JPopupMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JCheckBoxMenuItem;
@@ -58,6 +59,7 @@
     addSeparator();
     newConn    = addMenuItem("New connection...", KeyEvent.VK_W);
     options    = addMenuItem("Options...", KeyEvent.VK_O);
+    save       = addMenuItem("Save connection info as...", KeyEvent.VK_S);
     info       = addMenuItem("Connection info...", KeyEvent.VK_I);
     about      = addMenuItem("About VncViewer...", KeyEvent.VK_A);
     addSeparator();
@@ -115,6 +117,17 @@
       VncViewer.newViewer(cc.viewer);
     } else if (actionMatch(ev, options)) {
       cc.options.showDialog(cc.viewport);
+    } else if (actionMatch(ev, save)) {
+      JFileChooser fc = new JFileChooser();
+      fc.setDialogTitle("Save current configuration as:");
+      fc.setApproveButtonText("OK");
+      fc.setFileHidingEnabled(false);
+      int ret = fc.showOpenDialog(this);
+      if (ret == JFileChooser.APPROVE_OPTION) {
+        String filename = fc.getSelectedFile().toString();
+        if (filename != null)
+          Configuration.save(filename);
+      }
     } else if (actionMatch(ev, info)) {
       cc.showInfo();
     } else if (actionMatch(ev, about)) {
@@ -127,7 +140,7 @@
   CConn cc;
   JMenuItem restore, move, size, minimize, maximize;
   JMenuItem exit, clipboard, ctrlAltDel, refresh;
-  JMenuItem newConn, options, info, about, dismiss;
+  JMenuItem newConn, options, save, info, about, dismiss;
   static JMenuItem f8;
   JCheckBoxMenuItem fullScreen;
   static LogWriter vlog = new LogWriter("F8Menu");
diff --git a/java/com/tigervnc/vncviewer/FileUtils.java b/java/com/tigervnc/vncviewer/FileUtils.java
new file mode 100644
index 0000000..e7f3c5a
--- /dev/null
+++ b/java/com/tigervnc/vncviewer/FileUtils.java
@@ -0,0 +1,84 @@
+/* Copyright (C) 2012 Brian P. Hinz
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+package com.tigervnc.vncviewer;
+
+import javax.swing.filechooser.FileSystemView;
+
+import com.tigervnc.rfb.LogWriter;
+
+public class FileUtils {
+
+  public static final String getHomeDir() {
+    String homeDir = null;
+    try {
+      String os = System.getProperty("os.name");
+      try {
+        if (os.startsWith("Windows")) {
+          // JRE prior to 1.5 cannot reliably determine USERPROFILE
+          // return user.home and hope it's right...
+          if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) < 5) {
+            try {
+              homeDir = System.getProperty("user.home");
+            } catch(java.security.AccessControlException e) {
+              vlog.error("Cannot access user.home system property:"+e.getMessage());
+            }
+          } else {
+            homeDir = System.getenv("USERPROFILE");
+          }
+        } else {
+          try {
+          homeDir = FileSystemView.getFileSystemView().
+            getDefaultDirectory().getCanonicalPath();
+          } catch(java.security.AccessControlException e) {
+            vlog.error("Cannot access system property:"+e.getMessage());
+          }
+        }
+      } catch (java.lang.Exception e) {
+        e.printStackTrace();
+      }
+    } catch(java.security.AccessControlException e) {
+      vlog.error("Cannot access os.name system property:"+e.getMessage());
+    }
+
+    String separator = null;
+    try {
+      separator = Character.toString(java.io.File.separatorChar);
+    } catch(java.security.AccessControlException e) {
+      vlog.error("Cannot access file.separator system property:"+e.getMessage());
+    }
+
+    return homeDir + getFileSeparator();
+  }
+
+  public static final String getVncHomeDir() {
+    return getHomeDir()+".vnc"+getFileSeparator();
+  }
+
+  public static final String getFileSeparator() {
+    String separator = null;
+    try {
+      separator = Character.toString(java.io.File.separatorChar);
+    } catch(java.security.AccessControlException e) {
+      vlog.error("Cannot access file.separator system property:"+e.getMessage());
+    }
+    return separator;
+  }
+
+  static LogWriter vlog = new LogWriter("FileUtils");
+}
diff --git a/java/com/tigervnc/vncviewer/OptionsDialog.java b/java/com/tigervnc/vncviewer/OptionsDialog.java
index afeaf2d..4975733 100644
--- a/java/com/tigervnc/vncviewer/OptionsDialog.java
+++ b/java/com/tigervnc/vncviewer/OptionsDialog.java
@@ -21,6 +21,7 @@
 
 import java.awt.*;
 import java.awt.event.*;
+import java.io.File;
 import javax.swing.*;
 import javax.swing.border.*;
 
@@ -48,15 +49,13 @@
   JCheckBox secNone, secVnc, secPlain, secIdent, sendLocalUsername;
   JButton okButton, cancelButton;
   JButton ca, crl;
-  JButton defSaveButton;
-  UserPrefs defaults;
+  JButton cfLoadButton, cfSaveAsButton, defSaveButton, defReloadButton, defClearButton;
 
   public OptionsDialog(OptionsDialogCallback cb_) { 
     super(false);
     cb = cb_;
     setResizable(false);
     setTitle("VNC Viewer Options");
-    defaults = new UserPrefs("vncviewer");
 
     getContentPane().setLayout(
       new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
@@ -118,7 +117,7 @@
     veryLowColour = addRadioCheckbox("Very low(8 colours)", colourGroup, colourPanel);
 
     addGBComponent(autoSelect,FormatPanel,    0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(4,5,0,5));
-    addGBComponent(encodingPanel,FormatPanel, 0, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,10,0,5));
+    addGBComponent(encodingPanel,FormatPanel, 0, 1, 1, 1, 2, 2, 3, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,5,0,5));
     addGBComponent(colourPanel,FormatPanel,   1, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_END, new Insets(0,0,0,5));
     addGBComponent(tightPanel,FormatPanel,    0, 2, 2, GridBagConstraints.REMAINDER, 2, 2, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,5,0,5));
 
@@ -183,32 +182,28 @@
 
     JPanel configPanel = new JPanel(new GridBagLayout());
     configPanel.setBorder(BorderFactory.createTitledBorder("Configuration File"));
-    JButton cfReloadButton = new JButton("Reload");
-    cfReloadButton.addActionListener(this);
-    addGBComponent(cfReloadButton,configPanel, 0, 0, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
-    JButton cfSaveButton = new JButton("Save");
-    cfSaveButton.addActionListener(this);
-    addGBComponent(cfSaveButton,configPanel, 0, 1, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
-    JButton cfSaveAsButton = new JButton("Save As...");
+    cfLoadButton = new JButton("Load");
+    cfLoadButton.addActionListener(this);
+    addGBComponent(cfLoadButton,configPanel, 0, 0, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
+    cfSaveAsButton = new JButton("Save As...");
     cfSaveAsButton.addActionListener(this);
-    addGBComponent(cfSaveAsButton,configPanel, 0, 2, 1, 1, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
-    cfReloadButton.setEnabled(false);
-    cfSaveButton.setEnabled(false);
-    //cfSaveAsButton.setEnabled(!applet);
+    addGBComponent(cfSaveAsButton,configPanel, 0, 1, 1, 1, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
 
     JPanel defaultsPanel = new JPanel(new GridBagLayout());
     defaultsPanel.setBorder(BorderFactory.createTitledBorder("Defaults"));
-    JButton defReloadButton = new JButton("Reload");
+    defClearButton = new JButton("Clear");
+    defClearButton.addActionListener(this);
+    addGBComponent(defClearButton,defaultsPanel, 0, 0, 1, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
+    defReloadButton = new JButton("Reload");
     defReloadButton.addActionListener(this);
-    addGBComponent(defReloadButton,defaultsPanel, 0, 0, 1, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
+    addGBComponent(defReloadButton,defaultsPanel, 0, 1, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
     defSaveButton = new JButton("Save");
     defSaveButton.addActionListener(this);
-    addGBComponent(defSaveButton,defaultsPanel, 0, 1, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
+    addGBComponent(defSaveButton,defaultsPanel, 0, 2, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
 
     addGBComponent(configPanel,DefaultsPanel, 0, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,5,4,5));
     addGBComponent(defaultsPanel,DefaultsPanel, 1, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,0,4,5));
     //defReloadButton.setEnabled(!applet);
-    //defSaveButton.setEnabled(!applet);
 
     // security tab
     SecPanel=new JPanel(new GridBagLayout());
@@ -295,6 +290,146 @@
     sendLocalUsername.setEnabled(secVeNCrypt.isEnabled()&&
       (secPlain.isSelected()||secIdent.isSelected()));
   }
+  
+  private void updatePreferences() {
+    //UserPreferences.clear("global");
+    if (autoSelect.isSelected()) {
+      UserPreferences.set("global", "AutoSelect", true);
+    } else {
+      UserPreferences.set("global", "AutoSelect", false);
+      if (zrle.isSelected()) {
+        UserPreferences.set("global", "PreferredEncoding", "ZRLE");
+      } else if (hextile.isSelected()) {
+        UserPreferences.set("global", "PreferredEncoding", "hextile");
+      } else if (tight.isSelected()) {
+        UserPreferences.set("global", "PreferredEncoding", "Tight");
+      } else if (raw.isSelected()) {
+        UserPreferences.set("global", "PreferredEncoding", "raw");
+      }
+    }
+    if (fullColour.isSelected()) {
+      UserPreferences.set("global", "FullColour", true);
+    } else {
+      UserPreferences.set("global", "FullColour", false);
+      if (mediumColour.isSelected()) {
+        UserPreferences.set("global", "LowColorLevel", 2);
+      } else if (lowColour.isSelected()) {
+        UserPreferences.set("global", "LowColorLevel", 1);
+      } else if (veryLowColour.isSelected()) {
+        UserPreferences.set("global", "LowColorLevel", 0);
+      }
+    }
+    UserPreferences.set("global", "NoJPEG", !noJpeg.isSelected());
+    UserPreferences.set("global", "QualityLevel", (Integer)qualityLevel.getSelectedItem());
+    UserPreferences.set("global", "CustomCompressLevel", customCompressLevel.isSelected());
+    UserPreferences.set("global", "CompressLevel", (Integer)compressLevel.getSelectedItem());
+    UserPreferences.set("global", "ViewOnly", viewOnly.isSelected());
+    UserPreferences.set("global", "AcceptClipboard", acceptClipboard.isSelected());
+    UserPreferences.set("global", "SendClipboard", sendClipboard.isSelected());
+    String menuKeyStr = MenuKey.getMenuKeySymbols()[menuKey.getSelectedIndex()].name;
+    UserPreferences.set("global", "MenuKey", menuKeyStr);
+    UserPreferences.set("global", "FullScreen", fullScreen.isSelected());
+    UserPreferences.set("global", "Shared", shared.isSelected());
+    UserPreferences.set("global", "UseLocalCursor", useLocalCursor.isSelected());
+    UserPreferences.set("global", "AcceptBell", acceptBell.isSelected());
+    String scaleString = scalingFactor.getSelectedItem().toString();
+    if (scaleString.equalsIgnoreCase("Auto")) {
+      UserPreferences.set("global", "ScalingFactor", "Auto");
+    } else if(scaleString.equalsIgnoreCase("Fixed Aspect Ratio")) {
+      UserPreferences.set("global", "ScalingFactor", "FixedRatio");
+    } else { 
+      scaleString=scaleString.substring(0, scaleString.length()-1);
+      UserPreferences.set("global", "ScalingFactor", scaleString);
+    }
+    UserPreferences.set("viewer", "secVeNCrypt", secVeNCrypt.isSelected());
+    UserPreferences.set("viewer", "encNone", encNone.isSelected());
+    UserPreferences.set("viewer", "encTLS", encTLS.isSelected());
+    UserPreferences.set("viewer", "encX509", encX509.isSelected());
+    UserPreferences.set("viewer", "secNone", secNone.isSelected());
+    UserPreferences.set("viewer", "secVnc", secVnc.isSelected());
+    UserPreferences.set("viewer", "secPlain", secPlain.isSelected());
+    UserPreferences.set("viewer", "secIdent", secIdent.isSelected());
+    UserPreferences.set("global", "SendLocalUsername", sendLocalUsername.isSelected());
+    if (CSecurityTLS.x509ca.getValueStr() != "")
+      UserPreferences.set("viewer", "x509ca", CSecurityTLS.x509ca.getValueStr());
+    if (CSecurityTLS.x509crl.getValueStr() != "")
+      UserPreferences.set("viewer", "x509crl", CSecurityTLS.x509crl.getValueStr());
+  }
+
+  private void restorePreferences() {
+    autoSelect.setSelected(UserPreferences.getBool("global", "AutoSelect"));
+    if (!autoSelect.isSelected()) {
+      if (UserPreferences.getBool("global", "FullColour")) {
+        fullColour.setSelected(true);
+      } else {
+        switch (UserPreferences.getInt("global", "LowColorLevel")) {
+        case 2:
+          mediumColour.setSelected(true);
+          break;
+        case 1:
+          lowColour.setSelected(true);
+          break;
+        case 0:
+          veryLowColour.setSelected(true);
+          break;
+        }
+      }
+      String encoding = UserPreferences.get("global", "PreferredEncoding");
+      if (encoding != null) {
+        switch (Encodings.encodingNum(encoding)) {
+        case Encodings.encodingZRLE:
+          zrle.setSelected(true);
+          break;
+        case Encodings.encodingHextile:
+          hextile.setSelected(true);
+          break;
+        case Encodings.encodingRaw:
+          raw.setSelected(true);
+          break;
+        default:
+          tight.setSelected(true);
+        }
+      }
+    }
+    noJpeg.setSelected(!UserPreferences.getBool("global", "NoJPEG"));
+    qualityLevel.setSelectedItem(UserPreferences.getInt("global", "QualityLevel"));
+    customCompressLevel.setSelected(UserPreferences.getBool("global", "CustomCompressLevel"));
+    compressLevel.setSelectedItem(UserPreferences.getInt("global", "CompressLevel"));
+    viewOnly.setSelected(UserPreferences.getBool("global", "ViewOnly"));
+    acceptClipboard.setSelected(UserPreferences.getBool("global", "AcceptClipboard"));
+    sendClipboard.setSelected(UserPreferences.getBool("global", "SendClipboard"));
+    menuKey.setSelectedItem(UserPreferences.get("global", "MenuKey"));
+    fullScreen.setSelected(UserPreferences.getBool("global", "FullScreen"));
+    if (shared.isEnabled())
+      shared.setSelected(UserPreferences.getBool("global", "Shared"));
+    useLocalCursor.setSelected(UserPreferences.getBool("global", "UseLocalCursor"));
+    acceptBell.setSelected(UserPreferences.getBool("global", "AcceptBell"));
+    String scaleString = UserPreferences.get("global", "ScalingFactor");
+    if (scaleString != null) {
+      if (scaleString.equalsIgnoreCase("Auto")) {
+        scalingFactor.setSelectedItem("Auto");
+      } else if (scaleString.equalsIgnoreCase("FixedRatio")) {
+        scalingFactor.setSelectedItem("Fixed Aspect Ratio");
+      } else { 
+        scalingFactor.setSelectedItem(scaleString+"%");
+      }
+    }
+    if (secVeNCrypt.isEnabled()) {
+      secVeNCrypt.setSelected(UserPreferences.getBool("viewer", "secVeNCrypt", true));
+      if (secVeNCrypt.isSelected()) {
+        encNone.setSelected(UserPreferences.getBool("viewer", "encNone", true));
+        encTLS.setSelected(UserPreferences.getBool("viewer", "encTLS", true));
+        encX509.setSelected(UserPreferences.getBool("viewer", "encX509", true));
+        secPlain.setSelected(UserPreferences.getBool("viewer", "secPlain", true));
+        secIdent.setSelected(UserPreferences.getBool("viewer", "secIdent", true));
+        sendLocalUsername.setSelected(UserPreferences.getBool("global", "SendLocalUsername"));
+      }
+    }
+    if (secNone.isEnabled())
+      secNone.setSelected(UserPreferences.getBool("viewer", "secNone", true));
+    if (secVnc.isEnabled())
+      secVnc.setSelected(UserPreferences.getBool("viewer", "secVnc", true));
+  }
 
   JRadioButton addRadioCheckbox(String str, ButtonGroup group, JPanel panel) {
     JRadioButton c = new JRadioButton(str);
@@ -343,19 +478,50 @@
     } else if (s instanceof JButton && (JButton)s == cancelButton) {
       ok = false;
       endDialog();
-    } else if (s instanceof JButton && (JButton)s == defSaveButton) {
-      try {
-        defaults.Save();
-      } catch (java.lang.Exception x) { }
-    } else if (s instanceof JButton && (JButton)s == ca) {
+    } else if (s instanceof JButton && (JButton)s == cfLoadButton) {
       JFileChooser fc = new JFileChooser();
+      fc.setDialogTitle("Path to configuration file");
+      fc.setApproveButtonText("OK");
+      fc.setFileHidingEnabled(false);
+      int ret = fc.showOpenDialog(this);
+      if (ret == JFileChooser.APPROVE_OPTION) {
+        String filename = fc.getSelectedFile().toString();
+        if (filename != null)
+          Configuration.load(filename);
+        cb.setOptions();
+      }
+    } else if (s instanceof JButton && (JButton)s == cfSaveAsButton) {
+      JFileChooser fc = new JFileChooser();
+      fc.setDialogTitle("Save current configuration as:");
+      fc.setApproveButtonText("OK");
+      fc.setFileHidingEnabled(false);
+      int ret = fc.showOpenDialog(this);
+      if (ret == JFileChooser.APPROVE_OPTION) {
+        String filename = fc.getSelectedFile().toString();
+        if (filename != null)
+          Configuration.save(filename);
+      }
+    } else if (s instanceof JButton && (JButton)s == defSaveButton) {
+      updatePreferences();
+      UserPreferences.save();
+    } else if (s instanceof JButton && (JButton)s == defReloadButton) {
+      restorePreferences();
+    } else if (s instanceof JButton && (JButton)s == defClearButton) {
+      UserPreferences.clear();
+      cb.setOptions();
+    } else if (s instanceof JButton && (JButton)s == ca) {
+      JFileChooser fc = new JFileChooser(new File(CSecurityTLS.getDefaultCA()));
       fc.setDialogTitle("Path to X509 CA certificate");
+      fc.setApproveButtonText("OK");
+      fc.setFileHidingEnabled(false);
       int ret = fc.showOpenDialog(this);
       if (ret == JFileChooser.APPROVE_OPTION)
         CSecurityTLS.x509ca.setParam(fc.getSelectedFile().toString());
     } else if (s instanceof JButton && (JButton)s == crl) {
-      JFileChooser fc = new JFileChooser();
+      JFileChooser fc = new JFileChooser(new File(CSecurityTLS.getDefaultCRL()));
       fc.setDialogTitle("Path to X509 CRL file");
+      fc.setApproveButtonText("OK");
+      fc.setFileHidingEnabled(false);
       int ret = fc.showOpenDialog(this);
       if (ret == JFileChooser.APPROVE_OPTION)
         CSecurityTLS.x509crl.setParam(fc.getSelectedFile().toString());
@@ -373,18 +539,12 @@
       mediumColour.setEnabled(!autoSelect.isSelected());
       lowColour.setEnabled(!autoSelect.isSelected());
       veryLowColour.setEnabled(!autoSelect.isSelected());
-      defaults.setPref("autoSelect",(autoSelect.isSelected()) ? "on" : "off");
     } 
     if (s instanceof JCheckBox && (JCheckBox)s == customCompressLevel) {
       compressLevel.setEnabled(customCompressLevel.isSelected());
-      defaults.setPref("customCompressLevel",(customCompressLevel.isSelected()) ? "on" : "off");
     }
     if (s instanceof JCheckBox && (JCheckBox)s == noJpeg) {
       qualityLevel.setEnabled(noJpeg.isSelected());
-      defaults.setPref("noJpeg",(noJpeg.isSelected()) ? "on" : "off");
-    }
-    if (s instanceof JCheckBox && (JCheckBox)s == sendLocalUsername) {
-      defaults.setPref("sendLocalUsername",(sendLocalUsername.isSelected()) ? "on" : "off");
     }
     if (s instanceof JCheckBox && (JCheckBox)s == secVeNCrypt) {
       encNone.setEnabled(secVeNCrypt.isSelected());
@@ -393,11 +553,15 @@
       ca.setEnabled(secVeNCrypt.isSelected());
       crl.setEnabled(secVeNCrypt.isSelected());
       secIdent.setEnabled(secVeNCrypt.isSelected());
-      secNone.setEnabled(secVeNCrypt.isSelected());
-      secVnc.setEnabled(secVeNCrypt.isSelected());
       secPlain.setEnabled(secVeNCrypt.isSelected());
       sendLocalUsername.setEnabled(secVeNCrypt.isSelected());
     }
+    if (s instanceof JCheckBox && (JCheckBox)s == encNone) {
+      secNone.setSelected(encNone.isSelected() &&
+        UserPreferences.getBool("viewer", "secNone", true));
+      secVnc.setSelected(encNone.isSelected() &&
+        UserPreferences.getBool("viewer", "secVnc", true));
+    }
     if (s instanceof JCheckBox && (JCheckBox)s == secIdent ||
         s instanceof JCheckBox && (JCheckBox)s == secPlain) {
       sendLocalUsername.setEnabled(secIdent.isSelected()||secPlain.isSelected());
diff --git a/java/com/tigervnc/vncviewer/ServerDialog.java b/java/com/tigervnc/vncviewer/ServerDialog.java
index b596dbf..3efc585 100644
--- a/java/com/tigervnc/vncviewer/ServerDialog.java
+++ b/java/com/tigervnc/vncviewer/ServerDialog.java
@@ -57,8 +57,9 @@
     getContentPane().setLayout(new GridBagLayout());
 
     JLabel serverLabel = new JLabel("Server:", JLabel.RIGHT);
-    if (options.defaults.getString("server") != null) {
-      server = new JComboBox(options.defaults.getString("server").split(","));
+    if (UserPreferences.get("ServerDialog", "history") != null) {
+      String valueStr = UserPreferences.get("ServerDialog", "history");
+      server = new JComboBox(valueStr.split(","));
     } else {
       server = new JComboBox();
     }
@@ -123,6 +124,11 @@
     Object s = e.getSource();
     if (s instanceof JButton && (JButton)s == okButton) {
       ok = true;
+      String serverName = (String)server.getSelectedItem();
+      if (serverName != null) {
+        Configuration.setParam("Server", Hostname.getHost(serverName));
+        Configuration.setParam("Port", Integer.toString(Hostname.getPort(serverName)));
+      }
       endDialog();
     } else if (s instanceof JButton && (JButton)s == cancelButton) {
       ok = false;
@@ -143,27 +149,23 @@
   
   public void endDialog() {
     if (ok) {
-      try {
-        if (!server.getSelectedItem().toString().equals("")) {
-          String t = (options.defaults.getString("server")==null) ? "" : options.defaults.getString("server");
-          StringTokenizer st = new StringTokenizer(t, ",");
-          StringBuffer sb = new StringBuffer().append((String)server.getSelectedItem());
-          while (st.hasMoreTokens()) {
-            String s = st.nextToken();
-            if (!s.equals((String)server.getSelectedItem()) && !s.equals("")) {
-              sb.append(',');
-              sb.append(s);
-            }
+      if (!server.getSelectedItem().toString().equals("")) {
+        String valueStr = UserPreferences.get("ServerDialog", "history");
+        String t = (valueStr == null) ? "" : valueStr;
+        StringTokenizer st = new StringTokenizer(t, ",");
+        StringBuffer sb = new StringBuffer().append((String)server.getSelectedItem());
+        while (st.hasMoreTokens()) {
+          String s = st.nextToken();
+          if (!s.equals((String)server.getSelectedItem()) && !s.equals("")) {
+            sb.append(',');
+            sb.append(s);
           }
-          options.defaults.setPref("server", sb.toString());
         }
-        options.defaults.Save();
-      } catch (java.io.IOException e) {
-        System.out.println(e.toString());
-      } catch(java.security.AccessControlException e) {
-        System.out.println(e.toString());
-		  }
+        UserPreferences.set("ServerDialog", "history", sb.toString());
+        UserPreferences.save("ServerDialog");
+      }
     }
+
     done = true;
     if (modal) {
       synchronized (this) {
diff --git a/java/com/tigervnc/vncviewer/UserPreferences.java b/java/com/tigervnc/vncviewer/UserPreferences.java
new file mode 100644
index 0000000..95c56fb
--- /dev/null
+++ b/java/com/tigervnc/vncviewer/UserPreferences.java
@@ -0,0 +1,149 @@
+/* Copyright (C) 2012 Brian P. Hinz
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+//
+// For storing user preferences not specified as configuration parameters.
+//
+
+package com.tigervnc.vncviewer;
+
+import java.util.prefs.Preferences;
+import java.util.prefs.BackingStoreException;
+
+import com.tigervnc.rfb.*;
+
+public class UserPreferences {
+
+  private static Preferences root = Preferences.userRoot().node("TigerVNC");
+
+  public static void set(String nName, String key, String val) {
+    Preferences node = root.node(nName);
+    node.put(key, val);
+  }
+
+  public static void set(String nName, String key, int val) {
+    Preferences node = root.node(nName);
+    node.putInt(key, val);
+  }
+
+  public static void set(String nName, String key, boolean val) {
+    Preferences node = root.node(nName);
+    node.putBoolean(key, val);
+  }
+
+  public static String get(String nName, String key) {
+    Preferences node = root.node(nName);
+    VoidParameter p = Configuration.getParam(key);
+    if (p != null)
+      return node.get(key, p.getDefaultStr());
+    return node.get(key, null);
+  }
+
+  public static boolean getBool(String nName, String key, boolean defval) {
+    Preferences node = root.node(nName);
+    VoidParameter p = Configuration.getParam(key);
+    if (p != null && p.isBool())
+      return node.getBoolean(key, ((p.getDefaultStr() == "1") ? true : false));
+    // for non-parameter preferences
+    return node.getBoolean(key, defval);
+  }
+
+  public static boolean getBool(String nName, String key) {
+    // default value of "false" arbitrarily chosen
+    return getBool(nName, key, false);
+  }
+
+  public static int getInt(String nName, String key) {
+    Preferences node = root.node(nName);
+    VoidParameter p = Configuration.getParam(key);
+    if (p != null && !p.isBool())
+      return node.getInt(key, Integer.parseInt(p.getDefaultStr()));
+    // FIXME
+    return -1;
+  }
+
+  public static void save() {
+    try {
+      root.sync();
+      String[] keys = root.keys();
+      for (int i = 0; i < keys.length; i++)
+        vlog.debug(keys[i]+" = "+root.get(keys[i], null));
+    } catch (BackingStoreException e) {
+      vlog.error(e.getMessage());
+    }
+  }
+
+  public static void save(String nName) {
+    try {
+      Preferences node = root.node(nName);
+      node.sync();
+      String[] keys = root.keys();
+      for (int i = 0; i < keys.length; i++)
+        vlog.debug(keys[i]+" = "+node.get(keys[i], null));
+    } catch (BackingStoreException e) {
+      vlog.error(e.getMessage());
+    }
+  }
+
+  public static void clear() {
+    try {
+      root.clear();
+      String[] children = root.childrenNames();
+      for (int i = 0; i < children.length; i++) {
+        Preferences node = root.node(children[i]);
+        node.removeNode();
+      }
+      root.sync();
+    } catch (BackingStoreException e) {
+      vlog.error(e.getMessage());
+    }
+  }
+
+  public static void clear(String nName) {
+    try {
+      Preferences node = root.node(nName);
+      node.clear();
+      node.sync();
+    } catch (BackingStoreException e) {
+      vlog.error(e.getMessage());
+    }
+  }
+
+  public static void load(String nName) {
+    // Sets the value of any corresponding Configuration parameters
+    try {
+      Preferences node = root.node(nName);
+      String[] keys = node.keys();
+      for (int i = 0; i < keys.length; i++) {
+        String key = keys[i];
+        VoidParameter p = Configuration.getParam(key);
+        if (p == null)
+          continue;
+        String valueStr = node.get(key, null);
+        if (valueStr == null)
+          valueStr = p.getDefaultStr();
+        Configuration.setParam(key, valueStr);
+      }
+    } catch (BackingStoreException e) {
+      vlog.error(e.getMessage());
+    }
+  }
+
+  static LogWriter vlog = new LogWriter("UserPreferences");
+}
+
diff --git a/java/com/tigervnc/vncviewer/UserPrefs.java b/java/com/tigervnc/vncviewer/UserPrefs.java
deleted file mode 100644
index 3294d7f..0000000
--- a/java/com/tigervnc/vncviewer/UserPrefs.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/* Copyright (C) 2011 TigerVNC Team.  All Rights Reserved.
- * 
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-package com.tigervnc.vncviewer;
-
-import java.util.Properties;
-import java.io.FileOutputStream;
-import javax.swing.filechooser.*;
-
-/**
- * Simple, generic class to load up or save properties for an application.
- *  (eg user preferences)
- *
- * While reading in values, it will automatically convert from string format,
- * to your choice of int or boolean, if desired.
- *
- * We assume that you want properties stored in a file named
- * $HOME/.yourappname, where $HOME represents the users "home directory"
- *
- * Feel free to email comments or suggestions to the author
- *
- * @version 1.0, 09/16/1997
- * @author Philip Brown phil@bolthole.com
- */
-
-public class UserPrefs extends Properties {
-	String userhome=null; //This will have fileseparator on end if it
-	String prefFile;
-	String appName;
-	
-	Properties systemprops;
-	
-
-	/**
-	 * We try to read in a preferences file, from the user's "HOME"
-	 * directory. We base the name of the file, on the name of the
-	 * application we are in.
-	 * Use the getHomeDir() call if you want to know what directory
-	 * this is in.
-	 *
-	 * @param appName_ name of application calling this class
-	 */
-	public UserPrefs(String appName_) {
-		appName = appName_;
-		
-		try {
-			systemprops=System.getProperties();
-		} catch(java.security.AccessControlException e) {
-			System.out.println("Cannot access system properties");
-		}
-		// This is guaranteed as always being some valid directory,
-		// according to spec.
-		prefFile= getHomeDir()+getFileSeparator()+
-                "."+appName;
-		try {
-			load(new java.io.FileInputStream(prefFile));
-		} catch(java.security.AccessControlException e)	{
-			System.out.println("Cannot access system properties");
-		} catch (Exception err)	{
-			if(err instanceof java.io.FileNotFoundException) {
-        try {
-		      store(new FileOutputStream(prefFile), appName+" preferences");
-        } catch (Exception e) { /* FIXME */ }
-      } else {
-        // FIXME - should be a dialog
-			  System.out.println("Error opening prefs file:"+err.getMessage());
-      }
-		}
-		
-	}
-
-	// Strip off any comments
-	String trimValue(String prop) {
-		if(prop==null)
-			return null;
-		
-		int lastpos;
-		lastpos=prop.indexOf('#');
-		if(lastpos==-1)
-			lastpos=prop.length()-1;
-		while((prop.charAt(lastpos)==' ') ||
-		      (prop.charAt(lastpos)=='\t'))	{
-			lastpos--;
-			if(lastpos==0)
-				break;
-		}
-		      
-		return prop.substring(0, lastpos+1);
-	}
-
-	/**
-	 * The java spec guarantees that a "home" directory be
-	 * specified. We look it up for our own uses at initialization
-	 * If you want to do other things in the user's home dir,
-	 * this routine is an easy way to find out where it is.
-	 *
-	 *  This returns string that will have trailing fileseparator, eg "/")
-	 *  so you can slap together a filename directly after it, and
-	 *  not worry about that sort of junk.
-	 */
-  final public static String getHomeDir() {
-    String homeDir = null;
-		try {
-    	String os = System.getProperty("os.name");
-      try {
-        if (os.startsWith("Windows")) {
-          // JRE prior to 1.5 cannot reliably determine USERPROFILE
-          // return user.home and hope it's right...
-          if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) < 5) {
-						try {
-            	homeDir = System.getProperty("user.home");
-						} catch(java.security.AccessControlException e) {
-							System.out.println("Cannot access user.home system property");
-						}
-          } else {
-            homeDir = System.getenv("USERPROFILE");
-          }
-        } else {
-					try {
-          homeDir = FileSystemView.getFileSystemView().
-            getDefaultDirectory().getCanonicalPath();
-					} catch(java.security.AccessControlException e) {
-						System.out.println("Cannot access system property");
-					}
-        }
-      } catch (Exception e) {
-        e.printStackTrace();
-      }
-		} catch(java.security.AccessControlException e) {
-			System.out.println("Cannot access os.name system property");
-		}
-    return homeDir;
-  }
-
-  final private String getUserName() {
-    String userName = null;
-		try {
-			userName = (String) System.getProperties().get("user.name");
-		} catch(java.security.AccessControlException e) {
-			System.out.println("Cannot access user.name system property");
-		}
-    return userName;
-  }
-
-  final public static String getFileSeparator() {
-    String separator = null;
-		try {
-			separator = Character.toString(java.io.File.separatorChar);
-		} catch(java.security.AccessControlException e) {
-			System.out.println("Cannot access file.separator system property");
-		}
-    return separator;
-  }
-
-	/**
-	 * way to directly set a preference. You'll have to
-	 * do your own type conversion.
-	 * @param prefname name of property
-	 * @param value string value of property
-	 */
-	public void setPref(String prefname, String value) {
-		setProperty(prefname, value);
-	}
-
-	public void setPref(String prefname, int value) {
-		systemprops.put(prefname, java.lang.Integer.toString(value));
-	}
-
-	public void setPref(String prefname, boolean value) {
-		put(prefname, (value ? "true" : "false"));
-	}
-	
-	/**
-	 * Gets named resource, as a string value.
-	 * returns null if no such resource defined.
-	 * @param name name of property
-	 */
-	public String getString(String name) {
-		return trimValue(getProperty(name));
-	}
-	/**
-	 * Gets named resource, as a string value.
-	 *
-	 * @param name name of property
-	 * @param defval default value to remember and return , if
-	 *   no existing property name found.
-	 */
-	public String getString(String name, String defstr) {
-		String val = trimValue(getProperty(name));
-		if(val==null) {
-			setPref(name, defstr);
-			return defstr;
-		}
-		return val;
-	}
-
-	/**
-	 * look up property that is an int value
-	 * @param name name of property
-	 */	
-	public int getInt(String name) {
-		String strint = trimValue(getProperty(name));
-		int val=0;
-		try {
-			val = Integer.parseInt(strint);
-		} catch (NumberFormatException err) {
-			//we dont care
-		}
-		return val;
-	}
-
-	/**
-	 * look up property that is an int value
-	 * @param name name of property
-	 * @param defval default value to remember and return , if
-	 *   no existing property name found.
-	 */	
-	public int getInt(String name, int defval) {
-		String strint = trimValue(getProperty(name));
-		if(strint==null) {
-			setPref(name, String.valueOf(defval));
-			return defval;
-		}
-		int val=0;
-		try {
-			val = Integer.parseInt(strint);
-		} catch (NumberFormatException err) {
-			//we dont care
-		}
-		return val;
-	}
-
-	/**
-	 * look up property that is a boolean value
-	 * @param name name of property
-	 * @param defval default value to remember and return , if
-	 *   no existing property name found.
-	 */	
-	public boolean getBool(String name) {
-		String strval = trimValue(getProperty(name));
-		if(strval.equals("true"))
-			return true;
-
-		return false;
-	}
-
-	/**
-	 * @param name name of property
-	 * @param defval default value to remember and return , if
-	 *   no existing property name found.
-	 */	
-	public boolean getBool(String name, boolean defval) {
-		String strval = trimValue(getProperty(name));
-		if(strval==null) {
-			setPref(name, String.valueOf(defval));
-			return defval;
-		}
-
-		if(strval.equals("true"))
-			return true;
-
-		return false;
-	}
-
-	/**
-	* save user preferences to default file. Duh.
-	*/
-	public void Save() throws java.io.IOException {
-		store(new FileOutputStream(prefFile), appName+" preferences");
-	}
-}
diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java
index d045e53..f6ef208 100644
--- a/java/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/com/tigervnc/vncviewer/VncViewer.java
@@ -115,6 +115,9 @@
   public VncViewer(String[] argv) {
     applet = false;
 
+    // load user preferences
+    UserPreferences.load("global");
+
     SecurityClient.setDefaults();
     
     // Write about text to console, still using normal locale codeset
@@ -130,6 +133,12 @@
       if (argv[i].length() == 0)
         continue;
 
+      if (argv[i].equalsIgnoreCase("-config")) {
+        if (++i >= argv.length) usage();
+          Configuration.load(argv[i]);
+        continue;
+      }
+
       if (argv[i].equalsIgnoreCase("-log")) {
         if (++i >= argv.length) usage();
         System.err.println("Log setting: "+argv[i]);
@@ -535,6 +544,10 @@
                      "0 = Low, 9 = High",
                      8);
 
+  StringParameter config
+  = new StringParameter("config",
+  "Specifies a configuration file to load.", null);
+
   Thread thread;
   Socket sock;
   boolean applet;
