Index: src/mlx/gui/flight.py
===================================================================
--- src/mlx/gui/flight.py	(revision 117)
+++ src/mlx/gui/flight.py	(revision 118)
@@ -360,4 +360,5 @@
         scrolledWindow.add(self._flightList)
         scrolledWindow.set_size_request(400, -1)
+        # FIXME: these should be constants in common.py
         scrolledWindow.set_policy(gtk.PolicyType.AUTOMATIC if pygobject
                                   else gtk.POLICY_AUTOMATIC,
Index: src/mlx/gui/gates.py
===================================================================
--- src/mlx/gui/gates.py	(revision 118)
+++ src/mlx/gui/gates.py	(revision 118)
@@ -0,0 +1,175 @@
+# Module to display the status of the planes and the gates
+
+#----------------------------------------------------------------------------
+
+from mlx.gui.common import *
+
+from mlx.i18n import xstr
+import mlx.const as const
+
+#-------------------------------------------------------------------------------
+
+class FleetGateStatus(gtk.VBox):
+    """The tab to display the fleet and gate status."""
+    def __init__(self, gui):
+        """Construct the tab."""
+        super(FleetGateStatus, self).__init__()
+
+        self._gui = gui
+
+        mainAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
+                                      xscale = 1.0, yscale = 1.0)
+        mainAlignment.set_padding(padding_top = 4, padding_bottom = 4,
+                                  padding_left = 12, padding_right = 12)
+        self.add(mainAlignment)
+
+        self._mainBox = mainBox = gtk.VBox()
+        mainAlignment.add(mainBox)
+    
+        statusBox = gtk.HBox()
+        mainBox.pack_start(statusBox, True, True, 4)
+
+        self._fleetFrame = fleetFrame = gtk.Frame(label = xstr("gates_fleet_title"))
+        fleetLabel = fleetFrame.get_label_widget()
+        fleetLabel.set_use_underline(True)
+        statusBox.pack_start(fleetFrame, False, False, 4)
+
+        self._fleetStore = gtk.ListStore(str, str)
+        self._fleetList = gtk.TreeView(self._fleetStore)
+        self._fleetList.set_tooltip_markup(xstr("gates_planes_tooltip"))
+        fleetLabel.set_mnemonic_widget(self._fleetList)
+        column = gtk.TreeViewColumn(xstr("gates_tailno"), gtk.CellRendererText(),
+                                    text = 0)
+        column.set_expand(True)
+        column.set_sort_column_id(0)
+        self._fleetList.append_column(column)
+
+        column = gtk.TreeViewColumn(xstr("gates_planestatus"), gtk.CellRendererText(),
+                                    markup = 1)
+        column.set_expand(True)
+        column.set_sort_column_id(1)
+        self._fleetList.append_column(column)
+
+        scrolledWindow = gtk.ScrolledWindow()
+        scrolledWindow.add(self._fleetList)
+        scrolledWindow.set_size_request(200, -1)
+        # FIXME: these should be constants in common.py
+        scrolledWindow.set_policy(gtk.PolicyType.AUTOMATIC if pygobject
+                                  else gtk.POLICY_AUTOMATIC,
+                                  gtk.PolicyType.AUTOMATIC if pygobject
+                                  else gtk.POLICY_AUTOMATIC)
+        scrolledWindow.set_shadow_type(gtk.ShadowType.IN if pygobject
+                                       else gtk.SHADOW_IN)
+
+
+        alignment = gtk.Alignment(xalign = 0.5, yalign = 0.0,
+                                  xscale = 0.0, yscale = 1.0)
+        alignment.set_padding(padding_top = 4, padding_bottom = 4,
+                              padding_left = 4, padding_right = 4)
+        alignment.add(scrolledWindow)
+        fleetFrame.add(alignment)        
+        
+        self._gatesFrame = gatesFrame = gtk.Frame(label = xstr("gates_gates_title"))
+        statusBox.pack_start(gatesFrame, True, True, 4)        
+
+        table = gtk.Table(14, 4)
+        table.set_tooltip_markup(xstr("gates_gates_tooltip"))
+        alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
+                                  xscale = 1.0, yscale = 1.0)
+        alignment.set_padding(padding_top = 4, padding_bottom = 4,
+                              padding_left = 4, padding_right = 4)
+        alignment.add(table)
+        gatesFrame.add(alignment)
+        
+        self._gateLabels = {}
+        column = 0
+        row = 0
+        for gateNumber in const.lhbpGateNumbers:
+            label = gtk.Label()
+            label.set_markup("<b>" + gateNumber + "</b>")
+            table.attach(label, column, column + 1, row, row + 1)
+
+            self._gateLabels[gateNumber] = label
+            
+            if column==1 and row==12:
+                column = 2
+                row = 1
+            elif row==13:
+                column += 1
+                row = 0
+            else:
+                row += 1
+                
+        button = gtk.Button(xstr("gates_refresh"))
+        button.set_use_underline(True)
+        button.set_tooltip_text(xstr("gates_refresh_tooltip"))
+        button.connect("clicked", self._refreshClicked)
+
+        alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(button)
+        mainBox.pack_start(alignment, False, False, 4)
+
+        self._fleetFrame.set_sensitive(False)
+        self._gatesFrame.set_sensitive(False)
+        
+    def disable(self):
+        """Disable the widget."""
+        self._mainBox.set_sensitive(False)
+    
+    def enable(self):
+        """Enable the widget."""
+        self._mainBox.set_sensitive(True)
+
+    def _refreshClicked(self, button):
+        """Called when the Refresh data button is clicked."""
+        self._gui.beginBusy(xstr("fleet_busy"))
+        # FIXME: put this into the GUI, where it refreshes everything
+        self._gui.webHandler.getFleet(self._fleetCallback)
+
+    def _fleetCallback(self, returned, result):
+        """Callback for the fleet retrieval."""
+        gobject.idle_add(self._handleFleet, returned, result)
+
+    def _handleFleet(self, returned, result):
+        """Callback for the fleet retrieval."""
+        self._gui.endBusy()
+        if returned:
+            self._fleetStore.clear()
+            fleet = result.fleet
+            for plane in fleet:
+                conflicting = False
+                tailNumber = plane.tailNumber
+                if plane.status==const.PLANE_HOME:
+                    status = "LHBP - %s" % (plane.gateNumber,)
+                    conflicting = fleet.isGateConflicting(plane)
+                elif plane.status==const.PLANE_AWAY:
+                    status = xstr("gates_plane_away")
+                elif plane.status==const.PLANE_PARKING:
+                    status = xstr("gates_plane_parking")
+                else:
+                    status = xstr("gates_plane_unknown")
+
+                if conflicting:
+                    tailNumber = '<span foreground="red">' + tailNumber + '</span>'
+                    status = '<span foreground="red">' + status + '</span>'
+
+                self._fleetStore.append([tailNumber, status])
+            # FIXME: this should be a constant in common.py
+            self._fleetStore.set_sort_column_id(0,
+                                                gtk.SortType.ASCENDING if pygobject
+                                                else gtk.SORT_ASCENDING)
+
+            occupiedGateNumbers = fleet.getOccupiedGateNumbers()
+            for gateNumber in const.lhbpGateNumbers:
+                markup = gateNumber
+                if gateNumber in occupiedGateNumbers:
+                    markup = '<span foreground="orange">' + markup + '</span>'
+                markup = '<b>' + markup + '</b>'
+                self._gateLabels[gateNumber].set_markup(markup)
+            
+        self._fleetFrame.set_sensitive(True)
+        self._gatesFrame.set_sensitive(True)
+
+
+#----------------------------------------------------------------------------
Index: src/mlx/gui/gui.py
===================================================================
--- src/mlx/gui/gui.py	(revision 117)
+++ src/mlx/gui/gui.py	(revision 118)
@@ -9,4 +9,5 @@
 from mlx.gui.monitor import MonitorWindow
 from mlx.gui.weighthelp import WeightHelp
+from mlx.gui.gates import FleetGateStatus
 
 import mlx.const as const
@@ -101,4 +102,10 @@
         self._notebook.append_page(logWidget, label)
 
+        self._fleetGateStatus = FleetGateStatus(self)
+        label = gtk.Label(xstr("tab_gates"))
+        label.set_use_underline(True)
+        label.set_tooltip_text(xstr("tab_gates_tooltip"))
+        self._notebook.append_page(self._fleetGateStatus, label)
+        
         (self._debugLogWidget, self._debugLogView) = self._buildLogWidget()
         self._debugLogWidget.show_all()
Index: src/mlx/i18n.py
===================================================================
--- src/mlx/i18n.py	(revision 117)
+++ src/mlx/i18n.py	(revision 118)
@@ -145,4 +145,5 @@
                  "The log of your flight that will be sent to the MAVA website")
         self.add("tab_gates", "_Gates")        
+        self.add("tab_gates_tooltip", "The status of the MAVA fleet and the gates at LHBP")        
         self.add("tab_debug_log", "_Debug log")
         self.add("tab_debug_log_tooltip", "Log with debugging information.")
@@ -506,4 +507,25 @@
         self.add("weighthelp_mlw", "MLW:")
         self.add("weighthelp_busy", "Querying weight data...")
+
+        self.add("gates_fleet_title", "Fl_eet")
+        self.add("gates_gates_title", "LHBP gates")
+        self.add("gates_tailno", "Tail nr.")
+        self.add("gates_planestatus", "Status")
+        self.add("gates_refresh", "_Refresh data")
+        self.add("gates_refresh_tooltip",
+                 "Click this button to refresh the status data above")
+        self.add("gates_planes_tooltip",
+                 "This table lists all the planes in the MAVA fleet and their "
+                 "last known location. If a plane is conflicting with another "
+                 "because of occupying the same gate its data is displayed in "
+                 "<b><span foreground=\"red\">red</span></b>.")
+        self.add("gates_gates_tooltip",
+                 "The numbers of the gates occupied by MAVA planes are "
+                 "displayed in "
+                 '<b><span foreground="orange">yellow</span></b>, '
+                 "while available gates in black.")
+        self.add("gates_plane_away", "AWAY")
+        self.add("gates_plane_parking", "PARKING")
+        self.add("gates_plane_unknown", "UNKNOWN")
                  
 #------------------------------------------------------------------------------
@@ -537,8 +559,9 @@
         self.add("tab_log_tooltip",
                  "A járat naplója, amit majd el lehet küldeni a MAVA szerverére")
+        self.add("tab_gates", "_Kapuk")        
+        self.add("tab_gates_tooltip", "A MAVA flotta és LHBP kapuinak állapota")        
         self.add("tab_debug_log", "_Debug napló")
         self.add("tab_debug_log_tooltip",
                  "Hibakereséshez használható információkat tartalmazó napló.")
-        self.add("tab_gates", "_Kapuk")        
 
         self.add("conn_failed", "Nem tudtam kapcsolódni a szimulátorhoz.")
@@ -906,4 +929,26 @@
         self.add("weighthelp_busy", "A tömegadatok lekérdezése...")
 
+        self.add("gates_fleet_title", "_Flotta")
+        self.add("gates_gates_title", "LHBP kapuk")
+        self.add("gates_tailno", "Lajstromjel")
+        self.add("gates_planestatus", "Állapot")
+        self.add("gates_refresh", "_Adatok frissítése")
+        self.add("gates_refresh_tooltip",
+                 "Kattints erre a gombra a fenti adatok frissítéséhez")
+        self.add("gates_planes_tooltip",
+                 "Ez a táblázat tartalmazza a MAVA flottája összes "
+                 "repülőgépének lajstromjelét és utolsó ismert helyét. "
+                 "Ha egy repülőgép olyan kapun áll, amelyet másik gép is "
+                 "elfoglal, akkor annak a repülőgépnek az adatai "
+                 "<b><span foreground=\"red\">piros</span></b> "
+                 "színnel jelennek meg.")
+        self.add("gates_gates_tooltip",
+                 "A MAVA repülőgépei által elfoglalt kapuk száma "
+                 '<b><span foreground="orange">sárga</span></b> színnel,'
+                 "a többié feketén jelenik meg.")
+        self.add("gates_plane_away", "TÁVOL")
+        self.add("gates_plane_parking", "PARKOL")
+        self.add("gates_plane_unknown", "ISMERETLEN")
+                 
 #------------------------------------------------------------------------------
 
Index: src/mlx/web.py
===================================================================
--- src/mlx/web.py	(revision 106)
+++ src/mlx/web.py	(revision 118)
@@ -159,5 +159,5 @@
             plane = Plane(line)
             if plane.tailNumber is not None:
-                self._planes[plane.tailNumber] = plane        
+                self._planes[plane.tailNumber] = plane
 
     def isGateConflicting(self, plane):
@@ -179,4 +179,9 @@
                 gateNumbers.add(p.gateNumber)
         return gateNumbers
+
+    def __iter__(self):
+        """Get an iterator over the planes."""
+        for plane in self._planes.itervalues():
+            yield plane
         
     def __getitem__(self, tailNumber):
