Index: src/mlx/config.py
===================================================================
--- src/mlx/config.py	(revision 131)
+++ src/mlx/config.py	(revision 132)
@@ -3,4 +3,6 @@
 
 #-------------------------------------------------------------------------------
+
+import const
 
 import os
@@ -24,4 +26,6 @@
     """Our configuration."""
     DEFAULT_UPDATE_URL = "http://mlx.varadiistvan.hu/update"
+
+    _messageTypesSection = "messageTypes"
     
     def __init__(self):
@@ -32,10 +36,12 @@
         self._rememberPassword = False
 
+        self._language = ""
+        self._flareTimeFromFS = False
+        
         self._autoUpdate = True        
         self._updateURL = Config.DEFAULT_UPDATE_URL
-        
-        self._language = ""
-        self._flareTimeFromFS = False
-
+
+        self._messageTypeLevels = {}
+        
         self._modified = False
 
@@ -102,4 +108,17 @@
             self._modified = True
 
+    def getMessageTypeLevel(self, messageType):
+        """Get the level for the given message type."""
+        return self._messageTypeLevels[messageType] \
+               if messageType in self._messageTypeLevels \
+               else const.MESSAGELEVEL_NONE
+
+    def setMessageTypeLevel(self, messageType, level):
+        """Set the level of the given message type."""
+        if messageType not in self._messageTypeLevels or \
+           self._messageTypeLevels[messageType]!=level:
+            self._messageTypeLevels[messageType] = level
+            self._modified = True
+
     @property
     def autoUpdate(self):
@@ -136,13 +155,18 @@
                                                   "rememberPassword", False)
 
-        self._autoUpdate = self._getBoolean(config, "update", "auto", True)
-        self._updateURL = self._get(config, "update", "url",
-                                    Config.DEFAULT_UPDATE_URL)
-
         self._language = self._get(config, "general", "language", "")
         self._flareTimeFromFS = self._getBoolean(config, "general",
                                                  "flareTimeFromFS",
                                                  False)
-        
+
+        self._messageTypeLevels = {}
+        for messageType in const.messageTypes:
+            self._messageTypeLevels[messageType] = \
+                self._getMessageTypeLevel(config, messageType)
+            
+        self._autoUpdate = self._getBoolean(config, "update", "auto", True)
+        self._updateURL = self._get(config, "update", "url",
+                                    Config.DEFAULT_UPDATE_URL)
+
         self._modified = False
 
@@ -160,9 +184,4 @@
                    "yes" if self._rememberPassword else "no")
 
-        config.add_section("update")
-        config.set("update", "auto",
-                   "yes" if self._autoUpdate else "no")
-        config.set("update", "url", self._updateURL)
-
         config.add_section("general")
         if self._language:
@@ -170,5 +189,18 @@
         config.set("general", "flareTimeFromFS",
                    "yes" if self._flareTimeFromFS else "no")
-        
+
+        config.add_section(Config._messageTypesSection)
+        for messageType in const.messageTypes:
+            if messageType in self._messageTypeLevels:
+                option = self._getMessageTypeLevelOptionName(messageType)
+                level = self._messageTypeLevels[messageType]                
+                config.set(Config._messageTypesSection, option,
+                           const.messageLevel2string(level))
+        
+        config.add_section("update")
+        config.set("update", "auto",
+                   "yes" if self._autoUpdate else "no")
+        config.set("update", "url", self._updateURL)
+
         try:
             fd = os.open(configPath, os.O_CREAT|os.O_TRUNC|os.O_WRONLY,
@@ -194,4 +226,17 @@
                else default
 
+    def _getMessageTypeLevel(self, config, messageType):
+        """Get the message type level for the given message type."""
+        option = self._getMessageTypeLevelOptionName(messageType)
+        if config.has_option(Config._messageTypesSection, option):
+            value = config.get(Config._messageTypesSection, option)
+            return const.string2messageLevel(value)
+        else:
+            return const.MESSAGELEVEL_NONE
+
+    def _getMessageTypeLevelOptionName(self, messageType):
+        """Get the option name for the given message type level."""
+        return const.messageType2string(messageType)
+        
     def getLanguage(self):
         """Get the language to be used."""
Index: src/mlx/const.py
===================================================================
--- src/mlx/const.py	(revision 129)
+++ src/mlx/const.py	(revision 132)
@@ -115,88 +115,4 @@
 # Flight stage: end
 STAGE_END = 12
-
-#-------------------------------------------------------------------------------
-
-# Plane status: unknown
-PLANE_UNKNOWN = 0
-
-# Plane status: at home, i.e. LHBP
-PLANE_HOME = 1
-
-# Plane status: away
-PLANE_AWAY = 2
-
-# Plane status: parking
-PLANE_PARKING = 3
-
-#-------------------------------------------------------------------------------
-
-# Flight type: scheduled
-FLIGHTTYPE_SCHEDULED = 0
-
-# Flight type: old-timer
-FLIGHTTYPE_OLDTIMER = 1
-
-# Flight type: VIP
-FLIGHTTYPE_VIP = 2
-
-# Flight type: charter
-FLIGHTTYPE_CHARTER = 3
-
-#-------------------------------------------------------------------------------
-
-# Delay code: loading problems
-DELAYCODE_LOADING = 0
-
-# Delay code: VATSIM problem
-DELAYCODE_VATSIM = 1
-
-# Delay code: network problems
-DELAYCODE_NETWORK = 2
-
-# Delay code: controller's fault
-DELAYCODE_CONTROLLER = 3
-
-# Delay code: system crash or freeze
-DELAYCODE_SYSTEM = 4
-
-# Delay code: navigation problem
-DELAYCODE_NAVIGATION = 5
-
-# Delay code: traffic problems
-DELAYCODE_TRAFFIC = 6
-
-# Delay code: apron navigation
-DELAYCODE_APRON = 7
-
-# Delay code: weather problems
-DELAYCODE_WEATHER = 8
-
-# Delay code: personal reasons
-DELAYCODE_PERSONAL = 9
-
-#-------------------------------------------------------------------------------
-
-# The available gates at LHBP
-lhbpGateNumbers = []
-
-for i in range(1, 7):
-    lhbpGateNumbers.append(str(i))
-
-for i in range(10, 19):
-    lhbpGateNumbers.append(str(i))
-
-for i in range(24, 28):
-    lhbpGateNumbers.append(str(i))
-
-for i in range(31, 39):
-    lhbpGateNumbers.append(str(i))
-
-for i in range(42, 47):
-    lhbpGateNumbers.append(str(i))
-
-for i in range(60, 84):
-    if i!=70 and i!=80:
-        lhbpGateNumbers.append(str(i))
 
 #-------------------------------------------------------------------------------
@@ -221,3 +137,181 @@
 #-------------------------------------------------------------------------------
 
+# Plane status: unknown
+PLANE_UNKNOWN = 0
+
+# Plane status: at home, i.e. LHBP
+PLANE_HOME = 1
+
+# Plane status: away
+PLANE_AWAY = 2
+
+# Plane status: parking
+PLANE_PARKING = 3
+
+#-------------------------------------------------------------------------------
+
+# Flight type: scheduled
+FLIGHTTYPE_SCHEDULED = 0
+
+# Flight type: old-timer
+FLIGHTTYPE_OLDTIMER = 1
+
+# Flight type: VIP
+FLIGHTTYPE_VIP = 2
+
+# Flight type: charter
+FLIGHTTYPE_CHARTER = 3
+
+#-------------------------------------------------------------------------------
+
+# Delay code: loading problems
+DELAYCODE_LOADING = 0
+
+# Delay code: VATSIM problem
+DELAYCODE_VATSIM = 1
+
+# Delay code: network problems
+DELAYCODE_NETWORK = 2
+
+# Delay code: controller's fault
+DELAYCODE_CONTROLLER = 3
+
+# Delay code: system crash or freeze
+DELAYCODE_SYSTEM = 4
+
+# Delay code: navigation problem
+DELAYCODE_NAVIGATION = 5
+
+# Delay code: traffic problems
+DELAYCODE_TRAFFIC = 6
+
+# Delay code: apron navigation
+DELAYCODE_APRON = 7
+
+# Delay code: weather problems
+DELAYCODE_WEATHER = 8
+
+# Delay code: personal reasons
+DELAYCODE_PERSONAL = 9
+
+#-------------------------------------------------------------------------------
+
+# Message type: logger error
+MESSAGETYPE_LOGGER_ERROR = 1
+
+# Message type: information
+MESSAGETYPE_INFORMATION = 2
+
+# Message type: fault messages
+MESSAGETYPE_FAULT = 3
+
+# Message type: NO-GO fault messages
+MESSAGETYPE_NOGO = 4
+
+# Message type: gate system messages
+MESSAGETYPE_GATE_SYSTEM = 5
+
+# Message type: environment messages
+MESSAGETYPE_ENVIRONMENT = 6
+
+# Message type: help messages
+MESSAGETYPE_HELP = 7
+
+# Message type: visibility messages
+MESSAGETYPE_VISIBILITY = 8
+
+#-------------------------------------------------------------------------------
+
+messageTypes = [ MESSAGETYPE_LOGGER_ERROR,
+                 MESSAGETYPE_INFORMATION,
+                 MESSAGETYPE_FAULT,
+                 MESSAGETYPE_NOGO,
+                 MESSAGETYPE_GATE_SYSTEM,
+                 MESSAGETYPE_ENVIRONMENT,
+                 MESSAGETYPE_HELP,
+                 MESSAGETYPE_VISIBILITY ]
+
+#-------------------------------------------------------------------------------
+
+_messageTypeStrings = { MESSAGETYPE_LOGGER_ERROR : "loggerError",
+                        MESSAGETYPE_INFORMATION : "information",
+                        MESSAGETYPE_FAULT : "fault",
+                        MESSAGETYPE_NOGO : "nogo",
+                        MESSAGETYPE_GATE_SYSTEM : "gateSystem",
+                        MESSAGETYPE_ENVIRONMENT : "environment",
+                        MESSAGETYPE_HELP : "help",
+                        MESSAGETYPE_VISIBILITY : "visibility" }
+
+def messageType2string(messageType):
+    """Get the string equivalent of the given message type."""
+    return _messageTypeStrings[messageType] \
+           if messageType in _messageTypeStrings else None    
+
+#-------------------------------------------------------------------------------
+
+# Message display level: none
+MESSAGELEVEL_NONE = 0
+
+# Message display level: only message in the simulator
+MESSAGELEVEL_FS = 1
+
+# Message display level: only sound
+MESSAGELEVEL_SOUND = 2
+
+# Message display level: both
+MESSAGELEVEL_BOTH = 3
+
+#-------------------------------------------------------------------------------
+
+messageLevels = [ MESSAGELEVEL_NONE,
+                  MESSAGELEVEL_FS,
+                  MESSAGELEVEL_SOUND,
+                  MESSAGELEVEL_BOTH ]
+
+#-------------------------------------------------------------------------------
+
+_messageLevelStrings = { MESSAGELEVEL_NONE : "none",
+                         MESSAGELEVEL_FS : "fs",
+                         MESSAGELEVEL_SOUND : "sound",
+                         MESSAGELEVEL_BOTH : "both" }
+
+def messageLevel2string(messageLevel):
+    """Get the string equivalent of the given message level."""
+    return _messageLevelStrings[messageLevel] \
+           if messageLevel in _messageLevelStrings else None    
+
+def string2messageLevel(str):
+    """Get the message level for the given string."""
+    for (value, s) in _messageLevelStrings.iteritems():
+        if str==s:
+            return value
+    return MESSAGELEVEL_NONE
+
+#-------------------------------------------------------------------------------
+
+# The available gates at LHBP
+lhbpGateNumbers = []
+
+for i in range(1, 7):
+    lhbpGateNumbers.append(str(i))
+
+for i in range(10, 19):
+    lhbpGateNumbers.append(str(i))
+
+for i in range(24, 28):
+    lhbpGateNumbers.append(str(i))
+
+for i in range(31, 39):
+    lhbpGateNumbers.append(str(i))
+
+for i in range(42, 47):
+    lhbpGateNumbers.append(str(i))
+
+for i in range(60, 84):
+    if i!=70 and i!=80:
+        lhbpGateNumbers.append(str(i))
+
+#-------------------------------------------------------------------------------
+
 languages = ["$system", "en_GB", "hu_HU"]
+
Index: src/mlx/gui/common.py
===================================================================
--- src/mlx/gui/common.py	(revision 127)
+++ src/mlx/gui/common.py	(revision 132)
@@ -33,4 +33,5 @@
     DIALOG_MODAL = gtk.DIALOG_MODAL
     WRAP_WORD = gtk.WRAP_WORD
+    JUSTIFY_CENTER = gtk.JUSTIFY_CENTER
 
     def text2unicode(text):
@@ -59,4 +60,5 @@
     DIALOG_MODAL = gtk.DialogFlags.MODAL
     WRAP_WORD = gtk.WrapMode.WORD
+    JUSTIFY_CENTER = gtk.Justification.CENTER
 
     import codecs
Index: src/mlx/gui/prefs.py
===================================================================
--- src/mlx/gui/prefs.py	(revision 131)
+++ src/mlx/gui/prefs.py	(revision 132)
@@ -37,4 +37,10 @@
         notebook.append_page(general, label)
 
+        messages = self._buildMessages()
+        label = gtk.Label(xstr("prefs_tab_messages"))
+        label.set_use_underline(True)
+        label.set_tooltip_text(xstr("prefs_tab_message_tooltip"))
+        notebook.append_page(messages, label)
+
         advanced = self._buildAdvanced()
         label = gtk.Label(xstr("prefs_tab_advanced"))
@@ -62,4 +68,13 @@
         self._setLanguage(config.language)
         self._flareTimeFromFS.set_active(config.flareTimeFromFS)
+
+        for messageType in const.messageTypes:
+            level = config.getMessageTypeLevel(messageType)
+            button = self._msgFSCheckButtons[messageType]
+            button.set_active(level == const.MESSAGELEVEL_FS or
+                              level == const.MESSAGELEVEL_BOTH)
+            button = self._msgSoundCheckButtons[messageType]
+            button.set_active(level == const.MESSAGELEVEL_SOUND or
+                              level == const.MESSAGELEVEL_BOTH)
 
         self._togglingAutoUpdate = True
@@ -75,4 +90,17 @@
         config.language = self._getLanguage()
         config.flareTimeFromFS = self._flareTimeFromFS.get_active()
+
+        for messageType in const.messageTypes:
+            fsButtonActive = self._msgFSCheckButtons[messageType].get_active()
+            soundButtonActive = self._msgSoundCheckButtons[messageType].get_active()
+            if fsButtonActive:
+                level = const.MESSAGELEVEL_BOTH if soundButtonActive \
+                        else const.MESSAGELEVEL_FS
+            elif soundButtonActive:
+                level = const.MESSAGELEVEL_SOUND
+            else:
+                level = const.MESSAGELEVEL_NONE
+            config.setMessageTypeLevel(messageType, level)
+
         config.autoUpdate = self._autoUpdate.get_active()
         config.updateURL = self._updateURL.get_text()
@@ -155,4 +183,82 @@
             self._warnedRestartNeeded = True
 
+    def _buildMessages(self):
+        """Build the page for the message settings."""
+
+        mainAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
+                                      xscale = 0.0, yscale = 0.0)
+        mainAlignment.set_padding(padding_top = 16, padding_bottom = 8,
+                                  padding_left = 4, padding_right = 4)
+        mainBox = gtk.VBox()
+        mainAlignment.add(mainBox)
+
+        table = gtk.Table(len(const.messageTypes) + 1, 3)
+        table.set_row_spacings(8)
+        table.set_col_spacings(32)
+        table.set_homogeneous(False)
+        mainBox.pack_start(table, False, False, 4)
+        
+        label = gtk.Label(xstr("prefs_msgs_fs"))
+        label.set_justify(JUSTIFY_CENTER)
+        label.set_alignment(0.5, 1.0)
+        table.attach(label, 1, 2, 0, 1)
+        
+        label = gtk.Label(xstr("prefs_msgs_sound"))
+        label.set_justify(JUSTIFY_CENTER)
+        label.set_alignment(0.5, 1.0)
+        table.attach(label, 2, 3, 0, 1)
+
+        self._msgFSCheckButtons = {}
+        self._msgSoundCheckButtons = {}        
+        row = 1
+        for messageType in const.messageTypes:
+            messageTypeStr = const.messageType2string(messageType)
+            label = gtk.Label(xstr("prefs_msgs_type_" + messageTypeStr))
+            label.set_justify(JUSTIFY_CENTER)
+            label.set_use_underline(True)
+            label.set_alignment(0.5, 0.5)
+            table.attach(label, 0, 1, row, row+1)
+
+            fsCheckButton = gtk.CheckButton()
+            alignment = gtk.Alignment(xscale = 0.0, yscale = 0.0,
+                                      xalign = 0.5, yalign = 0.5)
+            alignment.add(fsCheckButton)
+            table.attach(alignment, 1, 2, row, row+1)
+            self._msgFSCheckButtons[messageType] = fsCheckButton
+            
+            soundCheckButton = gtk.CheckButton()
+            alignment = gtk.Alignment(xscale = 0.0, yscale = 0.0,
+                                      xalign = 0.5, yalign = 0.5)
+            alignment.add(soundCheckButton)
+            table.attach(alignment, 2, 3, row, row+1)            
+            self._msgSoundCheckButtons[messageType] = soundCheckButton
+
+            mnemonicWidget = gtk.Label("")
+            table.attach(mnemonicWidget, 3, 4, row, row+1)
+            label.set_mnemonic_widget(mnemonicWidget)
+            mnemonicWidget.connect("mnemonic-activate",
+                                   self._msgLabelActivated,
+                                   messageType)
+
+            row += 1
+
+        return mainAlignment
+
+    def _msgLabelActivated(self, button, cycle_group, messageType):
+        """Called when the mnemonic of a label is activated.
+
+        It cycles the corresponding options."""
+        fsCheckButton = self._msgFSCheckButtons[messageType]
+        soundCheckButton = self._msgSoundCheckButtons[messageType]
+
+        num = 1 if fsCheckButton.get_active() else 0
+        num += 2 if soundCheckButton.get_active() else 0
+        num += 1
+
+        fsCheckButton.set_active((num&0x01)==0x01)
+        soundCheckButton.set_active((num&0x02)==0x02)
+
+        return True
+            
     def _buildAdvanced(self):
         """Build the page for the advanced settings."""
Index: src/mlx/i18n.py
===================================================================
--- src/mlx/i18n.py	(revision 131)
+++ src/mlx/i18n.py	(revision 132)
@@ -543,4 +543,7 @@
         self.add("prefs_tab_general", "_General")
         self.add("prefs_tab_general_tooltip", "General preferences")
+        self.add("prefs_tab_messages", "_Messages")
+        self.add("prefs_tab_message_tooltip",
+                 "Enable/disable message notifications in FS and/or by sound")
         self.add("prefs_tab_advanced", "_Advanced")
         self.add("prefs_tab_advanced_tooltip",
@@ -577,4 +580,24 @@
                  "The URL from which to download the updates. Change this "
                  "only if you know what you are doing!")
+
+        # A C G M O S
+        
+        self.add("prefs_msgs_fs", "Displayed in FS")
+        self.add("prefs_msgs_sound", "Sound alert")
+        self.add("prefs_msgs_type_loggerError", "Logger _Error Messages")
+        self.add("prefs_msgs_type_information",
+                 "_Information Messages\n(e.g. flight status)")
+        self.add("prefs_msgs_type_fault",
+                 "_Fault Messages\n(e.g. strobe light fault)")
+        self.add("prefs_msgs_type_nogo",
+                 "_NOGO Fault messages\n(e.g. MTOW NOGO)")
+        self.add("prefs_msgs_type_gateSystem",
+                 "Ga_te System Messages\n(e.g. available gates)")
+        self.add("prefs_msgs_type_environment",
+                 "Envi_ronment Messages\n(e.g. \"welcome to XY aiport\")")
+        self.add("prefs_msgs_type_help",
+                 "_Help Messages\n(e.g. \"don't forget to set VREF\")")
+        self.add("prefs_msgs_type_visibility",
+                 "_Visibility Messages")
 
 #------------------------------------------------------------------------------
@@ -1014,5 +1037,9 @@
         self.add("prefs_tab_general", "_Általános")
         self.add("prefs_tab_general_tooltip", "Általános beállítások")
-        self.add("prefs_tab_advanced", "_Haladó")
+        self.add("prefs_tab_messages", "_Üzenetek")
+        self.add("prefs_tab_message_tooltip",
+                 "A szimulátorba és/vagy hangjelzés általi üzenetküldés be- "
+                 "és kikapcsolása")
+        self.add("prefs_tab_advanced", "H_aladó")
         self.add("prefs_tab_advanced_tooltip",
                  "Haladó beállítások: óvatosan módosítsd őket!")
@@ -1049,4 +1076,24 @@
                  "változtasd meg, ha biztos vagy a dolgodban!")
 
+        # A Á H M O Ü
+
+        self.add("prefs_msgs_fs", "Szimulátorban\nmegjelenítés")
+        self.add("prefs_msgs_sound", "Hangjelzés")
+        self.add("prefs_msgs_type_loggerError", "_Logger hibaüzenetek")
+        self.add("prefs_msgs_type_information",
+                 "_Információs üzenetek\n(pl. a repülés fázisa)")
+        self.add("prefs_msgs_type_fault",
+                 "Hi_baüzenetek\n(pl. a villogó fény hiba)")
+        self.add("prefs_msgs_type_nogo",
+                 "_NOGO hibaüzenetek\n(pl. MTOW NOGO)")
+        self.add("prefs_msgs_type_gateSystem",
+                 "_Kapukezelő rendszer üzenetei\n(pl. a szabad kapuk listája)")
+        self.add("prefs_msgs_type_environment",
+                 "Kö_rnyezeti üzenetek\n(pl. \"welcome to XY aiport\")")
+        self.add("prefs_msgs_type_help",
+                 "_Segítő üzenetek\n(pl. \"don't forget to set VREF\")")
+        self.add("prefs_msgs_type_visibility",
+                 "Lá_tótávolság üzenetek")
+
 #------------------------------------------------------------------------------
 
