Index: src/mlx/acft.py
===================================================================
--- src/mlx/acft.py	(revision 1137)
+++ src/mlx/acft.py	(revision 1154)
@@ -673,9 +673,7 @@
         if fleet is not None:
             gateList = ""
-            occupiedGateNumbers = fleet.getOccupiedGateNumbers()
-            for gate in gates.lhbpGates.gates:
-                if gate.isAvailable(gates.lhbpGates, occupiedGateNumbers):
-                    if gateList: gateList += ", "
-                    gateList += gate.number
+            for gate in fleet.iterAvailableLHBPGates(self.flight.bookedFlight.tailNumber):
+                if gateList: gateList += ", "
+                gateList += gate.number
             fs.sendMessage(const.MESSAGETYPE_GATE_SYSTEM,
                            "Free gates: " + gateList, 20)
Index: src/mlx/gates.py
===================================================================
--- src/mlx/gates.py	(revision 1151)
+++ src/mlx/gates.py	(revision 1154)
@@ -11,5 +11,6 @@
     """Information about a gate."""
     def __init__(self, number, terminal, type,
-                 availableFn = None, taxiThrough = False):
+                 availableFn = None, taxiThrough = False,
+                 maxSpan = 0.0, maxLength = 0.0):
         """Construct the gate with the given information.
 
@@ -21,27 +22,24 @@
         - a collection of the gates, and
         - a set of occupied gate numbers."""
-        self._number = number
-        self._terminal = terminal
-        self._type = type
+        self.number = number
+        self.terminal = terminal
+        self.type = type
         self._availableFn = availableFn
-        self._taxiThrough = taxiThrough
-
-    @property
-    def number(self):
-        """Get the number of the gate."""
-        return self._number
-
-    @property
-    def taxiThrough(self):
-        """Get if the gate is a taxi through one."""
-        return self._taxiThrough
-
-    def isAvailable(self, gates, occupiedGateNumbers):
-        """Determine if this gate is available given the set of gates and
-        occupied gate numbers."""
-        if self._number in occupiedGateNumbers:
+        self.taxiThrough = taxiThrough
+        self.maxSpan = maxSpan
+        self.maxLength = maxLength
+
+    def isAvailable(self, plane, gates, occupiedGateNumbers):
+        """Determine if this gate is available for the given plane and the
+        given the set of gates and occupied gate numbers."""
+        if self.number in occupiedGateNumbers:
             return False
-        return True if self._availableFn is None else \
-               self._availableFn(gates, occupiedGateNumbers)
+        if self._availableFn is None or \
+           self._availableFn(gates, occupiedGateNumbers):
+            return plane is None or \
+                (plane.wingSpan <= self.maxSpan and \
+                 plane.fuselageLength <= self.maxLength)
+        else:
+            return False
 
 #--------------------------------------------------------------------------------------
@@ -112,4 +110,30 @@
         self._numRowsInColumn = 0
         self._numColumns += 1
+
+    def merge(self, otherGates):
+        """Merge the information from the given gate list (retrieved from the
+        MAVA server) into this gate list."""
+        for otherGate in otherGates.gates:
+            gate = self.find(otherGate.number)
+            if gate is None:
+                print("Received data for gate %s, but it does not exist locally!" %
+                      (otherGate.number,))
+            else:
+                if gate.terminal != otherGate.terminal:
+                    print("The terminal for gate %s is received as: %s" %
+                          (gate.number, otherGate.terminal))
+                    gate.terminal = otherGate.terminal
+                if gate.type != otherGate.type:
+                    print("The type for gate %s is received as: %s" %
+                          (gate.number, otherGate.type))
+                    gate.type = otherGate.type
+
+                gate.maxSpan = otherGate.maxSpan
+                gate.maxLength = otherGate.maxLength
+
+        for gate in self.gates:
+            if gate.maxSpan==0.0 or gate.maxLength==0.0:
+                    print("Gate %s has no maximal dimensions from the database" %
+                          (gate.number,))
 
     def _addRow(self):
Index: src/mlx/gui/flight.py
===================================================================
--- src/mlx/gui/flight.py	(revision 1152)
+++ src/mlx/gui/flight.py	(revision 1154)
@@ -1500,8 +1500,6 @@
         self._listStore.clear()
         self._gateList.set_sensitive(True)
-        occupiedGateNumbers = self._wizard._fleet.getOccupiedGateNumbers()
-        for gate in lhbpGates.gates:
-            if gate.isAvailable(lhbpGates, occupiedGateNumbers):
-                self._listStore.append([gate.number])
+        for gate in self._wizard.iterAvailableLHBPGates():
+            self._listStore.append([gate.number])
 
     def finalize(self):
@@ -6023,8 +6021,6 @@
            self._wizard.bookedFlight.arrivalICAO=="LHBP" and \
            not self._wizard.entranceExam:
-            occupiedGateNumbers = self._wizard._fleet.getOccupiedGateNumbers()
-            for gate in lhbpGates.gates:
-                if gate.isAvailable(lhbpGates, occupiedGateNumbers):
-                    self._gatesModel.append([gate.number])
+            for gate in self._wizard.iterAvailableLHBPGates():
+                self._gatesModel.append([gate.number])
             self._gateLabel.set_sensitive(True)
             self._gate.set_sensitive(True)
@@ -6871,4 +6867,5 @@
             if result.loggedIn:
                 self._loginResult = result
+                self._mergeGates()
                 self.gui.loginSuccessful()
             else:
@@ -6960,4 +6957,9 @@
         self._simBriefingPage.finalizeCEF()
 
+    def iterAvailableLHBPGates(self):
+        """Iterate over the available gates at LHBP for the current flight's plane."""
+        for gate in self._fleet.iterAvailableLHBPGates(self._bookedFlight.tailNumber):
+            yield gate
+
     def _connectSimulator(self, simulatorType):
         """Connect to the simulator."""
@@ -6986,3 +6988,8 @@
         assert False
 
+    def _mergeGates(self):
+        """Merge the gate information retrieved during login into the
+        existing gate information for LHBP."""
+        lhbpGates.merge(self._loginResult.gates)
+
 #-----------------------------------------------------------------------------
Index: src/mlx/rpc.py
===================================================================
--- src/mlx/rpc.py	(revision 1153)
+++ src/mlx/rpc.py	(revision 1154)
@@ -1,4 +1,5 @@
 from . import const
 from . import rpccommon
+from . import gates
 
 from .common import MAVA_BASE_URL, fixUnpickled
@@ -630,4 +631,30 @@
 #---------------------------------------------------------------------------------------
 
+class Gate(gates.Gate, RPCObject):
+    """A gate."""
+    _instructions = {
+        "number": str,
+        "terminal": str,
+        "type": str,
+        "maxSpan": float,
+        "maxLength": float
+    }
+
+    def __init__(self, value):
+        """Construct the gate."""
+        RPCObject.__init__(self, value, instructions = Gate._instructions)
+
+#---------------------------------------------------------------------------------------
+
+class Gates(gates.Gates):
+    """The gates."""
+    def __init__(self, value):
+        """Construct the gates."""
+        super(Gates, self).__init__()
+        for gateValue in value:
+            self.add(Gate(gateValue))
+
+#---------------------------------------------------------------------------------------
+
 class Registration(object):
     """Data for registration."""
@@ -808,4 +835,11 @@
         return Fleet(value)
 
+    def getGates(self):
+        """Query and return the gate information."""
+        value = self._performCall(lambda sessionID:
+                                  self._server.getGates(sessionID))
+
+        return Gates(value)
+
     def updatePlane(self, tailNumber, status, gateNumber):
         """Update the state and position of the plane with the given tail
Index: src/mlx/rpccommon.py
===================================================================
--- src/mlx/rpccommon.py	(revision 919)
+++ src/mlx/rpccommon.py	(revision 1154)
@@ -4,4 +4,5 @@
 
 from . import const
+from .gates import lhbpGates
 
 #------------------------------------------------------------------------------
@@ -51,9 +52,14 @@
         """Check if the gate of the given plane conflicts with another plane's
         position."""
+        gate = lhbpGates.find(plane.gateNumber)
         for p in self._planes.values():
             if p.tailNumber!=plane.tailNumber and \
-               p.status==const.PLANE_HOME and \
-               p.gateNumber==plane.gateNumber:
-                return True
+               p.status==const.PLANE_HOME:
+                if p.gateNumber==plane.gateNumber:
+                    return True
+                if gate is not None and not gate.isAvailable(plane,
+                                                             lhbpGates,
+                                                             [p.gateNumber]):
+                    return True
 
         return False
@@ -66,4 +72,12 @@
                 gateNumbers.add(p.gateNumber)
         return gateNumbers
+
+    def iterAvailableLHBPGates(self, tailNumber):
+        """Iterate over the available gates at LHBP."""
+        occupiedGateNumbers = self.getOccupiedGateNumbers()
+        plane = self.__getitem__(tailNumber)
+        for gate in lhbpGates.gates:
+            if gate.isAvailable(plane, lhbpGates, occupiedGateNumbers):
+                yield gate
 
     def updatePlane(self, tailNumber, status, gateNumber = None):
Index: src/mlx/web.py
===================================================================
--- src/mlx/web.py	(revision 1114)
+++ src/mlx/web.py	(revision 1154)
@@ -476,4 +476,5 @@
             result.password = password
             result.fleet = client.getFleet()
+            result.gates = client.getGates()
             flights = client.getFlights()
             result.flights = flights[0]
