Index: src/mlx/flight.py
===================================================================
--- src/mlx/flight.py	(revision 71)
+++ src/mlx/flight.py	(revision 84)
@@ -31,8 +31,6 @@
         gui.resetFlightStatus()
 
-        self.cruiseAltitude = None
         self.flareTimeFromFS = False
         self.entranceExam = False
-        self.zfw = None
 
         self.options = Options()
@@ -44,8 +42,4 @@
         self._endCondition = threading.Condition()
 
-        self.v1 = None
-        self.vr = None
-        self.v2 = None
-
         self._flareStart = None
         self._flareStartFS = None
@@ -56,4 +50,29 @@
         return self._stage
 
+    @property
+    def zfw(self):
+        """Get the Zero-Fuel Weight of the flight."""
+        return self._gui.zfw
+
+    @property
+    def cruiseAltitude(self):
+        """Get the cruise altitude of the flight."""
+        return self._gui.cruiseAltitude
+
+    @property
+    def v1(self):
+        """Get the V1 speed of the flight."""
+        return self._gui.v1
+
+    @property
+    def vr(self):
+        """Get the Vr speed of the flight."""
+        return self._gui.vr
+
+    @property
+    def v2(self):
+        """Get the V2 speed of the flight."""
+        return self._gui.v2
+
     def setStage(self, timestamp, stage):
         """Set the flight stage.
@@ -62,6 +81,6 @@
         if stage!=self._stage:
             self._stage = stage
+            self._gui.setStage(stage)
             self.logger.stage(timestamp, stage)
-            self._gui.setStage(stage)
             if stage==const.STAGE_END:
                 with self._endCondition:
Index: src/mlx/gui/common.py
===================================================================
--- src/mlx/gui/common.py	(revision 76)
+++ src/mlx/gui/common.py	(revision 84)
@@ -78,2 +78,53 @@
 
 #------------------------------------------------------------------------------
+
+class IntegerEntry(gtk.Entry):
+    """An entry that allows only either an empty value, or an integer."""
+    def __init__(self, defaultValue = None):
+        """Construct the entry."""
+        gtk.Entry.__init__(self)
+
+        self._defaultValue = defaultValue
+        self._currentInteger = defaultValue
+        self._selfSetting = False
+        self._set_text()
+
+        self.connect("changed", self._handle_changed)
+
+    def get_int(self):
+        """Get the integer."""
+        return self._currentInteger
+
+    def set_int(self, value):
+        """Set the integer."""
+        if value!=self._currentInteger:
+            self._currentInteger = value
+            self.emit("integer-changed", self._currentInteger)
+        self._set_text()
+    
+    def _handle_changed(self, widget):
+        """Handle the changed signal."""
+        if self._selfSetting:
+            return
+        text = self.get_text()
+        if text=="":
+            self.set_int(self._defaultValue)
+        else:
+            try:
+                self.set_int(int(text))
+            except:
+                self._set_text()
+
+    def _set_text(self):
+        """Set the text value from the current integer."""
+        self._selfSetting = True
+        self.set_text("" if self._currentInteger is None
+                      else str(self._currentInteger))
+        self._selfSetting = False
+                
+#------------------------------------------------------------------------------
+
+gobject.signal_new("integer-changed", IntegerEntry, gobject.SIGNAL_RUN_FIRST,
+                   None, (object,))
+
+#------------------------------------------------------------------------------
Index: src/mlx/gui/flight.py
===================================================================
--- src/mlx/gui/flight.py	(revision 82)
+++ src/mlx/gui/flight.py	(revision 84)
@@ -684,11 +684,10 @@
         table.attach(label, 0, 1, 3, 4)
 
-        self._cargoWeight = gtk.Entry()
+        self._cargoWeight = IntegerEntry(defaultValue = 0)
         self._cargoWeight.set_width_chars(6)
         self._cargoWeight.set_alignment(1.0)
-        self._cargoWeight.connect("changed", self._cargoWeightChanged)
+        self._cargoWeight.connect("integer-changed", self._cargoWeightChanged)
         self._cargoWeight.set_tooltip_text("The weight of the cargo for your flight.")
         table.attach(self._cargoWeight, 1, 2, 3, 4)
-        self._cargoWeightValue = 0        
         label.set_mnemonic_widget(self._cargoWeight)
 
@@ -745,6 +744,5 @@
         self._numPassengers.set_text(str(bookedFlight.numPassengers))
         self._bagWeight.set_text(str(bookedFlight.bagWeight))
-        self._cargoWeightValue = bookedFlight.cargoWeight
-        self._cargoWeight.set_text(str(bookedFlight.cargoWeight))
+        self._cargoWeight.set_int(bookedFlight.cargoWeight)
         self._cargoWeight.set_sensitive(True)
         self._mailWeight.set_text(str(bookedFlight.mailWeight))
@@ -757,5 +755,5 @@
         self._zfwButton.set_sensitive(False)
 
-    def _calculateZFW(self):
+    def calculateZFW(self):
         """Calculate the ZFW value."""
         zfw = self._wizard.gui._flight.aircraft.dow
@@ -763,5 +761,5 @@
         zfw += (bookedFlight.numCrew + bookedFlight.numPassengers) * 82
         zfw += bookedFlight.bagWeight
-        zfw += self._cargoWeightValue
+        zfw += self._cargoWeight.get_int()
         zfw += bookedFlight.mailWeight
         return zfw
@@ -769,5 +767,5 @@
     def _updateCalculatedZFW(self):
         """Update the calculated ZFW"""
-        zfw = self._calculateZFW()
+        zfw = self.calculateZFW()
 
         markupBegin = "<b>"
@@ -779,14 +777,6 @@
         self._calculatedZFW.set_markup(markupBegin + str(zfw) + markupEnd)
 
-    def _cargoWeightChanged(self, entry):
+    def _cargoWeightChanged(self, entry, weight):
         """Called when the cargo weight has changed."""
-        text = self._cargoWeight.get_text()
-        if text=="":
-            self._cargoWeightValue = 0
-        else:
-            try:
-                self._cargoWeightValue = int(text)
-            except:
-                self._cargoWeight.set_text(str(self._cargoWeightValue))
         self._updateCalculatedZFW()
             
@@ -816,6 +806,4 @@
     def _forwardClicked(self, button):
         """Called when the forward button is clicked."""
-        if not self._finalized:
-            self._wizard._zfw = self._calculateZFW()
         self._wizard.nextPage()
 
@@ -1013,4 +1001,9 @@
         self._button.connect("clicked", self._forwardClicked)
 
+    @property
+    def cruiseLevel(self):
+        """Get the cruise level."""
+        return self._cruiseLevel.get_value_as_int()
+
     def activate(self):
         """Setup the route from the booked flight."""
@@ -1053,7 +1046,4 @@
             self._wizard.nextPage()
         else:
-            self._wizard._cruiseAltitude = self._cruiseLevel.get_value_as_int() * 100
-            self._wizard._route = self._getRoute()
-
             self._backButton.set_sensitive(False)
             self._button.set_sensitive(False)
@@ -1235,5 +1225,4 @@
             if not self._finalized:
                 self._wizard.gui.startMonitoring()
-                self.finalize()
                 self._finalized = True
 
@@ -1253,5 +1242,5 @@
                                   xscale = 0.0, yscale = 0.0)
 
-        table = gtk.Table(5, 3)
+        table = gtk.Table(5, 4)
         table.set_row_spacings(4)
         table.set_col_spacings(16)
@@ -1268,6 +1257,5 @@
         self._runway.set_width_chars(10)
         self._runway.set_tooltip_text("The runway the takeoff is performed from.")
-        self._runway.connect("changed", self._updateForwardButton)
-        table.attach(self._runway, 1, 2, 0, 1)
+        table.attach(self._runway, 1, 3, 0, 1)
         label.set_mnemonic_widget(self._runway)
         
@@ -1280,6 +1268,5 @@
         self._sid.set_width_chars(10)
         self._sid.set_tooltip_text("The name of the Standard Instrument Deparature procedure followed.")
-        self._sid.connect("changed", self._updateForwardButton)
-        table.attach(self._sid, 1, 2, 1, 2)
+        table.attach(self._sid, 1, 3, 1, 2)
         label.set_mnemonic_widget(self._sid)
         
@@ -1290,15 +1277,11 @@
         table.attach(label, 0, 1, 2, 3)
 
-        self._v1 = gtk.SpinButton()
-        self._v1.set_increments(step = 1, page = 10)
-        self._v1.set_range(min = 50, max = 300)
-        self._v1.set_value(100)
-        self._v1.set_numeric(True)
+        self._v1 = IntegerEntry()
+        self._v1.set_width_chars(1)
         self._v1.set_tooltip_markup("The takeoff decision speed in knots.")
-        self._v1.connect("changed", self._updateForwardButton)
-        table.attach(self._v1, 1, 2, 2, 3)
+        table.attach(self._v1, 2, 3, 2, 3)
         label.set_mnemonic_widget(self._v1)
         
-        table.attach(gtk.Label("knots"), 2, 3, 2, 3)
+        table.attach(gtk.Label("knots"), 3, 4, 2, 3)
         
         label = gtk.Label("V<sub>_r</sub>:")
@@ -1308,15 +1291,11 @@
         table.attach(label, 0, 1, 3, 4)
 
-        self._vr = gtk.SpinButton()
-        self._vr.set_increments(step = 1, page = 10)
-        self._vr.set_range(min = 50, max = 300)
-        self._vr.set_value(110)
-        self._vr.set_numeric(True)
+        self._vr = IntegerEntry()
+        self._vr.set_width_chars(1)
         self._vr.set_tooltip_markup("The takeoff rotation speed in knots.")
-        self._vr.connect("changed", self._updateForwardButton)
-        table.attach(self._vr, 1, 2, 3, 4)
+        table.attach(self._vr, 2, 3, 3, 4)
         label.set_mnemonic_widget(self._vr)
         
-        table.attach(gtk.Label("knots"), 2, 3, 3, 4)
+        table.attach(gtk.Label("knots"), 3, 4, 3, 4)
         
         label = gtk.Label("V<sub>_2</sub>:")
@@ -1326,15 +1305,11 @@
         table.attach(label, 0, 1, 4, 5)
 
-        self._v2 = gtk.SpinButton()
-        self._v2.set_increments(step = 1, page = 10)
-        self._v2.set_range(min = 50, max = 300)
-        self._v2.set_value(120)
-        self._v2.set_numeric(True)
+        self._v2 = IntegerEntry()
+        self._v2.set_width_chars(1)
         self._v2.set_tooltip_markup("The takeoff safety speed in knots.")
-        self._v2.connect("changed", self._updateForwardButton)
-        table.attach(self._v2, 1, 2, 4, 5)
+        table.attach(self._v2, 2, 3, 4, 5)
         label.set_mnemonic_widget(self._v2)
         
-        table.attach(gtk.Label("knots"), 2, 3, 4, 5)
+        table.attach(gtk.Label("knots"), 3, 4, 4, 5)
         
         button = self.addButton(gtk.STOCK_GO_BACK)
@@ -1345,4 +1320,19 @@
         self._button.set_use_stock(True)
         self._button.connect("clicked", self._forwardClicked)
+
+    @property
+    def v1(self):
+        """Get the v1 speed."""
+        return self._v1.get_int()
+
+    @property
+    def vr(self):
+        """Get the vr speed."""
+        return self._vr.get_int()
+
+    @property
+    def v2(self):
+        """Get the v2 speed."""
+        return self._v2.get_int()
 
     def activate(self):
@@ -1352,11 +1342,12 @@
         self._sid.set_text("")
         self._sid.set_sensitive(True)
+        self._v1.set_int(None)
         self._v1.set_sensitive(True)
         self._vr.set_sensitive(True)
         self._v2.set_sensitive(True)
-        self._updateForwardButton()
-        
-    def finalize(self):
-        """Finalize the page."""
+        self._button.set_sensitive(False)
+        
+    def freezeValues(self):
+        """Freeze the values on the page, and enable the forward button."""
         self._runway.set_sensitive(False)
         self._sid.set_sensitive(False)
@@ -1364,17 +1355,6 @@
         self._vr.set_sensitive(False)
         self._v2.set_sensitive(False)
-
-        flight = self._wizard.gui.flight
-        flight.v1 = self._v1.get_value_as_int()
-        flight.vr = self._vr.get_value_as_int()
-        flight.v2 = self._v2.get_value_as_int()
-
-    def _updateForwardButton(self, widget = None):
-        """Update the Forward buttons sensitivity."""
-        self._button.set_sensitive(self._runway.get_text()!="" and
-                                   self._sid.get_text()!="" and
-                                   self._v1.get_value_as_int()<=self._vr.get_value_as_int() and 
-                                   self._vr.get_value_as_int()<=self._v2.get_value_as_int())
-
+        self._button.set_sensitive(True)
+        
     def _backClicked(self, button):
         """Called when the Back button is pressed."""
@@ -1582,10 +1562,13 @@
         self._pages.append(GateSelectionPage(self))
         self._pages.append(ConnectPage(self))
-        self._pages.append(PayloadPage(self))
+        self._payloadPage = PayloadPage(self) 
+        self._pages.append(self._payloadPage)
         self._pages.append(TimePage(self))
-        self._pages.append(RoutePage(self))
+        self._routePage = RoutePage(self)
+        self._pages.append(self._routePage)
         self._pages.append(BriefingPage(self, True))
         self._pages.append(BriefingPage(self, False))
-        self._pages.append(TakeoffPage(self))
+        self._takeoffPage = TakeoffPage(self) 
+        self._pages.append(self._takeoffPage)
         self._pages.append(LandingPage(self))
         
@@ -1632,4 +1615,30 @@
             self.grabDefault()
 
+    @property
+    def zfw(self):
+        """Get the calculated ZFW value."""
+        return 0 if self._bookedFlight is None \
+               else self._payloadPage.calculateZFW()
+
+    @property
+    def cruiseAltitude(self):
+        """Get the cruise altitude."""
+        return self._routePage.cruiseLevel * 100
+
+    @property
+    def v1(self):
+        """Get the V1 speed."""
+        return None if self._bookedFlight is None else self._takeoffPage.v1
+
+    @property
+    def vr(self):
+        """Get the Vr speed."""
+        return None if self._bookedFlight is None else self._takeoffPage.vr
+
+    @property
+    def v2(self):
+        """Get the V2 speed."""
+        return None if self._bookedFlight is None else self._takeoffPage.v2
+
     def nextPage(self, finalize = True):
         """Go to the next page."""
@@ -1655,4 +1664,9 @@
         """Called when we have disconnected from the simulator."""
         self._initialize()
+
+    def setStage(self, stage):
+        """Set the flight stage to the given one."""
+        if stage==const.STAGE_TAKEOFF:
+            self._takeoffPage.freezeValues()
 
     def _initialize(self):
@@ -1665,7 +1679,4 @@
         self._bookedFlight = None
         self._departureGate = "-"
-        self._zfw = None
-        self._cruiseAltitude = None
-        self._route = None
         self._departureNOTAMs = None
         self._departureMETAR = None
Index: src/mlx/gui/gui.py
===================================================================
--- src/mlx/gui/gui.py	(revision 81)
+++ src/mlx/gui/gui.py	(revision 84)
@@ -108,4 +108,29 @@
         """Get the flight being performed."""
         return self._flight
+
+    @property
+    def zfw(self):
+        """Get Zero-Fuel Weight calculated for the current flight."""
+        return self._wizard.zfw
+        
+    @property
+    def cruiseAltitude(self):
+        """Get cruise altitude calculated for the current flight."""
+        return self._wizard.cruiseAltitude
+        
+    @property
+    def v1(self):
+        """Get the V1 speed calculated for the flight."""
+        return self._wizard.v1
+        
+    @property
+    def vr(self):
+        """Get the Vr speed calculated for the flight."""
+        return self._wizard.vr
+        
+    @property
+    def v2(self):
+        """Get the V2 speed calculated for the flight."""
+        return self._wizard.v2
         
     def run(self):
@@ -234,4 +259,5 @@
         self._statusbar.setStage(stage)
         self._statusIcon.setStage(stage)
+        self._wizard.setStage(stage)
 
     def setRating(self, rating):
