Index: locale/en/mlx.po
===================================================================
--- locale/en/mlx.po	(revision 349)
+++ locale/en/mlx.po	(revision 373)
@@ -12,4 +12,7 @@
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+
+msgid "secondary"
+msgstr "Secondary"
 
 msgid "aircraft_b736"
Index: locale/hu/mlx.po
===================================================================
--- locale/hu/mlx.po	(revision 349)
+++ locale/hu/mlx.po	(revision 373)
@@ -13,4 +13,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 
+msgid "secondary"
+msgstr "Másodlagos"
+
 msgid "aircraft_b736"
 msgstr "Boeing 737-600"
Index: mlx.nsi
===================================================================
--- mlx.nsi	(revision 28)
+++ mlx.nsi	(revision 373)
@@ -5,8 +5,16 @@
 
   !include "MUI.nsh"
+  !include "nsDialogs.nsh"
+  !include "TextFunc.nsh"
   !include "mlx-common.nsh"
 
 ;--------------------------------
 ;General
+
+  Var ApplicationName
+
+  Function .onInit
+    StrCpy $ApplicationName "Mava Logger X"
+  FunctionEnd
 
   ;Name and file
@@ -17,7 +25,4 @@
   ;Default installation folder
   InstallDir "$PROGRAMFILES\MAVA Logger X"
-  
-  ;Get installation folder from registry if available
-  InstallDirRegKey HKCU "Software\MAVA Logger X" ""
 
   ;Vista redirects $SMPROGRAMS to all users without this
@@ -29,4 +34,9 @@
   Var MUI_TEMP
   Var STARTMENU_FOLDER
+  Var Variable
+  Var Secondary
+  Var Secondary_State
+  Var LinkName
+  Var Parameters
 
 ;--------------------------------
@@ -40,23 +50,59 @@
 ;Pages
 
+
   !insertmacro MUI_PAGE_LICENSE "license.txt"
+  Page custom optionsPage ;optionsPageLeave
   !insertmacro MUI_PAGE_COMPONENTS
   !insertmacro MUI_PAGE_DIRECTORY
 
   ;Start Menu Folder Page Configuration
-  !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" 
-  !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\MAVA Logger X" 
-  !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
-  
+  ;!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
+  ;!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\MAVA Logger X"
+  ;!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
+
   !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
 
   !insertmacro MUI_PAGE_INSTFILES
-  
+
   !insertmacro MUI_UNPAGE_CONFIRM
   !insertmacro MUI_UNPAGE_INSTFILES
-  
+
+  Function optionsPage
+     !insertmacro MUI_HEADER_TEXT "Installation Options" "Choose the options for the installation"
+
+     nsDialogs::Create 1018
+     Pop $Variable
+
+     ${If} $Variable == error
+         Abort
+     ${Endif}
+
+     ${NSD_CreateLabel} 0 0 100% 24u "If you select the option below, the program will be installed in a way that it can be used besides another, already existing installation. Read the manual on how to set up this secondary version to avoid conflicting with the primary one."
+     Pop $Variable
+
+     ${NSD_CreateCheckBox} 12 54 100% 12u "Install as secondary"
+     Pop $Secondary
+     ${NSD_SetState} $Secondary $Secondary_State
+     GetFunctionAddress $Variable onSecondaryClicked
+     nsDialogs::onClick $Secondary $Variable
+
+     nsDialogs::Show
+  FunctionEnd
+
+  Function onSecondaryClicked
+     Pop $Secondary
+     ${NSD_GetState} $Secondary $Secondary_State
+     ${If} $Secondary_State == ${BST_CHECKED}
+         StrCpy $INSTDIR "$PROGRAMFILES\MAVA Logger X (Secondary)"
+         StrCpy $STARTMENU_FOLDER "MAVA Logger X (Secondary)"
+     ${Else}
+         StrCpy $INSTDIR "$PROGRAMFILES\MAVA Logger X"
+         StrCpy $STARTMENU_FOLDER "MAVA Logger X"
+     ${EndIf}
+  FunctionEnd
+
 ;--------------------------------
 ;Languages
- 
+
   !insertmacro MUI_LANGUAGE "English"
 
@@ -67,12 +113,22 @@
 
   SetOutPath "$INSTDIR"
-  
+
+  ${If} $Secondary_State == ${BST_CHECKED}
+    StrCpy $LinkName "MAVA Logger X (Secondary)"
+    StrCpy $Parameters "secondary"
+  ${Else}
+    StrCpy $LinkName "MAVA Logger X"
+    StrCpy $Parameters ""
+  ${EndIf}
+
   ;ADD YOUR OWN FILES HERE...
   File /r dist\*.*
 
-  ;Store installation folder
-  WriteRegStr HKCU "Software\MAVA Logger X" "" $INSTDIR
-  
+  ;Create the uninstaller config file
+  ${ConfigWrite} "$INSTDIR\Uninstall.conf" "StartMenuFolder=" "$STARTMENU_FOLDER" $Variable
+  ${ConfigWrite} "$INSTDIR\Uninstall.conf" "LinkName=" "$LinkName" $Variable
+
   ;Create uninstaller
+
   WriteUninstaller "$INSTDIR\Uninstall.exe"
 
@@ -80,7 +136,7 @@
     ;Create shortcuts
     CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
-    CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\MAVA Logger X.lnk" "$INSTDIR\runmlx.exe"
+    CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\MAVA Logger X.lnk" "$INSTDIR\runmlx.exe" "$Parameters"
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
-    CreateShortCut "$DESKTOP\MAVA Logger X.lnk" "$INSTDIR\runmlx.exe"
+    CreateShortCut "$DESKTOP\$LinkName.lnk" "$INSTDIR\runmlx.exe" "$Parameters"
   !insertmacro MUI_STARTMENU_WRITE_END
 SectionEnd
@@ -102,25 +158,25 @@
 Section "Uninstall"
 
+  ;Read the uninstaller config file
+  ${ConfigRead} "$INSTDIR\Uninstall.conf" "StartMenuFolder=" $MUI_TEMP
+  ${ConfigRead} "$INSTDIR\Uninstall.conf" "LinkName=" $LinkName
+
   RMDir /r "$INSTDIR"
 
-  !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
-    
-  Delete "$DESKTOP\MAVA Logger X.lnk"
+  Delete "$DESKTOP\$LinkName.lnk"
   Delete "$SMPROGRAMS\$MUI_TEMP\MAVA Logger X.lnk"
   Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
-  
+
   ;Delete empty start menu parent diretories
   StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
- 
+
   startMenuDeleteLoop:
     ClearErrors
     RMDir $MUI_TEMP
     GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
-    
+
     IfErrors startMenuDeleteLoopDone
-  
+
     StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop
   startMenuDeleteLoopDone:
-
-  DeleteRegKey /ifempty HKCU "Software\MAVA Logger X"
 SectionEnd
Index: setup.py
===================================================================
--- setup.py	(revision 287)
+++ setup.py	(revision 373)
@@ -39,5 +39,5 @@
         data_files.append((os.path.join("library", path),
                            glob(os.path.join(gtkRuntimeDir, path, "*"))))
-        
+
         path = os.path.join("share", "locale", "hu", "LC_MESSAGES")
         data_files.append((os.path.join("library", path),
@@ -46,5 +46,5 @@
         data_files.append((os.path.join("library", path),
                            glob(os.path.join(gtkRuntimeDir, path, "*"))))
-        
+
     with open("mlx-common.nsh", "wt") as f:
             print >>f, '!define MLX_VERSION "%s"' % (mlx.const.VERSION)
@@ -81,2 +81,4 @@
 if os.name=="nt":
     mlx.update.buildManifest(os.path.join(scriptdir, "dist"))
+    with open(os.path.join(scriptdir, "dist", "Uninstall.conf")) as f:
+        print >> f, "startMenuFolder=MAVA Logger X"
Index: src/mlx/config.py
===================================================================
--- src/mlx/config.py	(revision 298)
+++ src/mlx/config.py	(revision 373)
@@ -2,11 +2,13 @@
 
 import const
+from util import secondaryInstallation
 
 import os
 import sys
+import traceback
 import ConfigParser
 
 ## @package mlx.config
-# 
+#
 # The handling of the configuration.
 #
@@ -22,5 +24,6 @@
 
 configPath = os.path.join(os.path.expanduser("~"),
-                          "mlx.config" if os.name=="nt" else ".mlxrc")
+                          "mlx.config" if os.name=="nt" else ".mlxrc") + \
+                          ("-secondary" if secondaryInstallation else "")
 
 #-------------------------------------------------------------------------------
@@ -54,5 +57,5 @@
         """Check if the given hotkey is not equal to the other one."""
         return not self==other
-        
+
     def __str__(self):
         """Construct the hotkey to a string."""
@@ -69,5 +72,5 @@
     # The name of the section of the checklists
     SECTION="checklists"
-    
+
     @staticmethod
     def fromConfig(config, aircraftType):
@@ -108,5 +111,5 @@
         """Determine if the checklist is not equal to the given other one."""
         return not self==other
-        
+
     def __len__(self):
         """Get the length of the file list."""
@@ -127,5 +130,5 @@
     # The name of the section of the approach callouts
     SECTION="callouts"
-    
+
     @staticmethod
     def fromConfig(config, aircraftType):
@@ -145,5 +148,5 @@
                 break
 
-        return ApproachCallouts(mapping)    
+        return ApproachCallouts(mapping)
 
     def __init__(self, mapping = None):
@@ -211,5 +214,5 @@
 
     _messageTypesSection = "messageTypes"
-    
+
     def __init__(self):
         """Construct the configuration with default values."""
@@ -222,6 +225,6 @@
         self._hideMinimizedWindow = True
         self._quitOnClose = False
-        self._onlineGateSystem = True
-        self._onlineACARS = True
+        self._onlineGateSystem = not secondaryInstallation
+        self._onlineACARS = not secondaryInstallation
         self._flareTimeFromFS = False
         self._syncFSTime = False
@@ -232,5 +235,5 @@
         self._pirepDirectory = None
 
-        self._enableSounds = True
+        self._enableSounds = not secondaryInstallation
 
         self._pilotControlsSounds = True
@@ -242,7 +245,9 @@
         self._enableChecklists = False
         self._checklistHotkey = Hotkey(ctrl = True, shift = True, key = "0")
-                
-        self._autoUpdate = True        
+
+        self._autoUpdate = True
         self._updateURL = Config.DEFAULT_UPDATE_URL
+        if secondaryInstallation:
+            self._updateURL += "/exp"
 
         self._messageTypeLevels = {}
@@ -253,5 +258,5 @@
             self._checklists[aircraftType] = Checklist()
             self._approachCallouts[aircraftType] = ApproachCallouts()
-            
+
         self._modified = False
 
@@ -315,5 +320,5 @@
             self._hideMinimizedWindow = hideMinimizedWindow
             self._modified = True
-    
+
     @property
     def quitOnClose(self):
@@ -329,5 +334,5 @@
             self._quitOnClose = quitOnClose
             self._modified = True
-    
+
     @property
     def onlineGateSystem(self):
@@ -462,5 +467,5 @@
         return level==const.MESSAGELEVEL_FS or \
                level==const.MESSAGELEVEL_BOTH
-        
+
     def setMessageTypeLevel(self, messageType, level):
         """Set the level of the given message type."""
@@ -482,5 +487,5 @@
             self._modified = True
 
-    @property 
+    @property
     def pilotControlsSounds(self):
         """Get whether the pilot controls the background sounds."""
@@ -529,5 +534,5 @@
             self._speedbrakeAtTD = speedbrakeAtTD
             self._modified = True
-        
+
     @property
     def enableChecklists(self):
@@ -600,6 +605,10 @@
     def load(self):
         """Load the configuration from its default location."""
-        config = ConfigParser.RawConfigParser()
-        config.read(configPath)
+        try:
+            config = ConfigParser.RawConfigParser()
+            config.read(configPath)
+        except:
+            traceback.print_exc()
+            return
 
         self._pilotID = self._get(config, "login", "id", "")
@@ -615,10 +624,11 @@
         self._quitOnClose = self._getBoolean(config, "general",
                                              "quitOnClose", False)
-        
+
         self._onlineGateSystem = self._getBoolean(config, "general",
                                                   "onlineGateSystem",
-                                                  True)
+                                                  not secondaryInstallation)
         self._onlineACARS = self._getBoolean(config, "general",
-                                             "onlineACARS", True)
+                                             "onlineACARS",
+                                             not secondaryInstallation)
         self._flareTimeFromFS = self._getBoolean(config, "general",
                                                  "flareTimeFromFS",
@@ -644,6 +654,6 @@
                 self._getMessageTypeLevel(config, messageType)
 
-        self._enableSounds = self._getBoolean(config, "sounds",
-                                              "enable", True)
+        self._enableSounds = self._getBoolean(config, "sounds", "enable",
+                                              not secondaryInstallation)
         self._pilotControlsSounds = self._getBoolean(config, "sounds",
                                                      "pilotControls", True)
@@ -659,8 +669,9 @@
         self._checklistHotkey.set(self._get(config, "sounds",
                                             "checklistHotkey", "CS0"))
-            
+
         self._autoUpdate = self._getBoolean(config, "update", "auto", True)
         self._updateURL = self._get(config, "update", "url",
-                                    Config.DEFAULT_UPDATE_URL)
+                                    Config.DEFAULT_UPDATE_URL +
+                                    ("/exp" if secondaryInstallation else ""))
 
         for aircraftType in const.aircraftTypes:
@@ -714,5 +725,5 @@
             if messageType in self._messageTypeLevels:
                 option = self._getMessageTypeLevelOptionName(messageType)
-                level = self._messageTypeLevels[messageType]                
+                level = self._messageTypeLevels[messageType]
                 config.set(Config._messageTypesSection, option,
                            const.messageLevel2string(level))
@@ -733,5 +744,5 @@
         config.set("sounds", "checklistHotkey",
                    str(self._checklistHotkey))
-        
+
         config.add_section("update")
         config.set("update", "auto",
@@ -760,5 +771,5 @@
                if config.has_option(section, option) \
                else default
-    
+
     def _get(self, config, section, option, default):
         """Get the given option as a string, if found in the given config,
@@ -774,9 +785,11 @@
             value = config.get(Config._messageTypesSection, option)
             return const.string2messageLevel(value)
+        elif secondaryInstallation:
+            return const.MESSAGELEVEL_NONE
         elif messageType in [const.MESSAGETYPE_LOGGER_ERROR,
                              const.MESSAGETYPE_FAULT,
                              const.MESSAGETYPE_NOGO,
                              const.MESSAGETYPE_GATE_SYSTEM,
-                             const.MESSAGETYPE_HELP]:            
+                             const.MESSAGETYPE_HELP]:
             return const.MESSAGELEVEL_BOTH
         else:
Index: src/mlx/gui/common.py
===================================================================
--- src/mlx/gui/common.py	(revision 362)
+++ src/mlx/gui/common.py	(revision 373)
@@ -2,4 +2,6 @@
 import mlx.const as _const
 from mlx.i18n import xstr
+
+from mlx.util import secondaryInstallation
 
 import os
@@ -262,4 +264,6 @@
 
 WINDOW_TITLE_BASE = PROGRAM_NAME + " " + _const.VERSION
+if secondaryInstallation:
+    WINDOW_TITLE_BASE += " (" + xstr("secondary") + ")"
 
 #------------------------------------------------------------------------------
Index: src/mlx/mlx.py
===================================================================
--- src/mlx/mlx.py	(revision 298)
+++ src/mlx/mlx.py	(revision 373)
@@ -3,4 +3,5 @@
 from i18n import setLanguage
 from sound import initializeSound
+from util import secondaryInstallation
 
 import os
@@ -51,5 +52,5 @@
 
     instance.close()
-    os.execv(programPath, args)    
+    os.execv(programPath, args)
 
 #--------------------------------------------------------------------------------------
@@ -60,5 +61,6 @@
 
     global instance
-    instance = SingleInstance("mlx", raiseCallbackWrapper)
+    instance = SingleInstance("mlx" + ("-secondary" if secondaryInstallation
+                                       else ""), raiseCallbackWrapper)
     if not instance: return
 
@@ -69,11 +71,11 @@
 
     if (len(sys.argv)<=1 or sys.argv[1]!="usedeflang") and config.setupLocale():
-        restart(["usedeflang"])
+        restart(["usedeflang"] + (["secondary"] if secondaryInstallation else []))
 
     setLanguage(programDirectory, config.getLanguage())
-    
+
     from .gui.gui import GUI
     gui = GUI(programDirectory, config)
-    
+
     sys.stdout = StdIOHandler(gui)
     sys.stderr = StdIOHandler(gui)
Index: src/mlx/util.py
===================================================================
--- src/mlx/util.py	(revision 298)
+++ src/mlx/util.py	(revision 373)
@@ -2,4 +2,5 @@
 import math
 import time
+import sys
 
 #------------------------------------------------------------------------------
@@ -26,5 +27,5 @@
     - the seconds as an integer
     - 1.0 if the value was non-negative, -1.0 if it was negative."""
-    
+
     if degrees<0:
         degrees = -degrees
@@ -32,5 +33,5 @@
     else:
         mul = 1.0
-        
+
     deg = int(degrees)
     min = int((degrees*60.0)%60.0)
@@ -125,5 +126,5 @@
 
     This function calculates the rhumb distance."""
-    
+
     latitude1 = math.radians(latitude1)
     longitude1 = math.radians(longitude1)
@@ -160,2 +161,6 @@
     return "%.0f metres" % (visibility,) if visibility<10000 \
            else "%.1f kilometres" % (visibility/1000.0,)
+
+#------------------------------------------------------------------------------
+
+secondaryInstallation="secondary" in sys.argv
