Index: .hgignore
===================================================================
--- .hgignore	(revision 758)
+++ .hgignore	(revision 442)
@@ -9,5 +9,2 @@
 src/mlx/gui/dcdata.py
 xplra.py
-chromedriver.exe
-debug.log
-moodlesetup.txt
Index: locale/en/mlx.po
===================================================================
--- locale/en/mlx.po	(revision 764)
+++ locale/en/mlx.po	(revision 744)
@@ -94,7 +94,4 @@
 msgstr "_Send..."
 
-msgid "button_register"
-msgstr "_Register"
-
 msgid "button_cancelFlight"
 msgstr "Cancel flight"
@@ -272,5 +269,5 @@
 msgid "login_remember_tooltip"
 msgstr ""
-"If checked, your password will be stored by the program, so that you "
+"If checked, your password will be stored, so that you "
 "should not have to enter it every time. Note, however, that "
 "the password is stored as text, and anybody who can access "
@@ -282,10 +279,4 @@
 msgid "login_entranceExam_tooltip"
 msgstr "Check this to log in to take your entrance exam."
-
-msgid "button_login_register"
-msgstr "R_egister..."
-
-msgid "button_login_register_tooltip"
-msgstr "Click here if you would like to register with Malév Virtual"
 
 msgid "button_offline"
@@ -2122,191 +2113,2 @@
 msgid "sendBugReport_error_sec"
 msgstr "There was some communication error, try again later."
-
-msgid "register_ask"
-msgstr "Would you like to register with MAVA?"
-
-msgid "register_ask_sec"
-msgstr ""
-"It seems, you have not run the program\n"
-"on this computer, or at least not logged in yet.\n"
-"\n"
-"If you would like to register, click the\n"
-"<b>Register</b> button below and fill the form."
-
-msgid "register_title"
-msgstr "Registration"
-
-msgid "register_help"
-msgstr ""
-"Enter the data below.\n"
-"Optional data items are in <i>italics</i>.\n"
-"One of VATSIM ID or IVAO ID is mandatory."
-
-msgid "register_name1"
-msgstr "First _name:"
-
-msgid "register_name1_tooltip"
-msgstr "Enter your real first name."
-
-msgid "register_name2"
-msgstr "Sur_name:"
-
-msgid "register_name2_tooltip"
-msgstr "Enter your real surname."
-
-msgid "register_nameorder"
-msgstr "western"
-
-msgid "register_year_of_birth"
-msgstr "_Year of birth:"
-
-msgid "register_year_of_birth_tooltip"
-msgstr "Enter the year in which you were born."
-
-msgid "register_email"
-msgstr "_E-mail:"
-
-msgid "register_email_tooltip"
-msgstr "Enter your e-mail address."
-
-msgid "register_email_public"
-msgstr "P_ublic"
-
-msgid "register_email_public_tooltip"
-msgstr ""
-"If checked, your e-mail address will be displayed in our forums and "
-"possibly other internal website areas, and thus it will be made "
-"available to other members of MAVA."
-
-msgid "register_vatsim_id"
-msgstr "_VATSIM CID:"
-
-msgid "register_vatsim_id_tooltip"
-msgstr ""
-"Enter your VATSIM CID, if you are registered with VATSIM. "
-"Note that either a VATSIM CID or an IVAO VID is required for the registration."
-
-msgid "register_ivao_id"
-msgstr "IV_AO VID:"
-
-msgid "register_ivao_id_tooltip"
-msgstr ""
-"Enter your IVAO VID, if you are registered with IVAO. "
-"Note that either a VATSIM CID or an IVAO VID is required for the registration."
-
-msgid "register_phone_num"
-msgstr "<i>Phone num_ber</i>:"
-
-msgid "register_phone_num_tooltip"
-msgstr "Enter your phone number, if we can reach you by phone."
-
-msgid "register_nationality"
-msgstr "<i>Na_tionality</i>:"
-
-msgid "register_nationality_tooltip"
-msgstr "Enter your nationality, if you would like to share that info with us."
-
-msgid "register_password"
-msgstr "Pa_ssword:"
-
-msgid "register_password_tooltip"
-msgstr "Enter the password you would like to use for logging in."
-
-msgid "register_password2"
-msgstr "Pass_word again:"
-
-msgid "register_password2_tooltip"
-msgstr "Enter the same password again."
-
-msgid "register_password_ok"
-msgstr "<span foreground=\"darkgreen\"><b>OK</b></span>"
-
-msgid "register_password_too_short"
-msgstr "<span foreground=\"orange\"><b>Too short</b></span>"
-
-msgid "register_password_mismatch"
-msgstr "<span foreground=\"red\"><b>Passwords differ</b></span>"
-
-msgid "register_busy"
-msgstr "Registering..."
-
-msgid "register_ok"
-msgstr "Registration successful."
-
-msgid "register_failed"
-msgstr "Registration failed!"
-
-msgid "register_info"
-msgstr ""
-"Congratulations! You are now a MAVA pilot\n"
-"in status STU (student).\n"
-"\n"
-"Your pilot ID is: <b>%s</b>.\n"
-"\n"
-"You will now be taken to the student page,\n"
-"where you can initiate the taking of the\n"
-"entrance exam or start your check flight.\n"
-"\n"
-"You can return to the page anytime later\n"
-"by starting the program, and logging in."
-
-msgid "register_nologin"
-msgstr ""
-"Congratulations! You are now a MAVA pilot\n"
-"in status STU (student).\n"
-"\n"
-"Your pilot ID is: <b>%s</b>.\n"
-"\n"
-"For some reason, we could not log you in\n"
-"(perhaps a server failure).\n"
-"\n"
-"You will now be taken to the login page,\n"
-"where you can try logging in again. You can,\n"
-"of course, start the program at any time\n"
-"later on and attempt logging in."
-
-msgid "register_email_already"
-msgstr "The given e-mail is already registered."
-
-msgid "register_invalid_data"
-msgstr ""
-"The program has sent invalid data to the server.\n"
-"This may be a program error. You may try to alter some\n"
-"data (e.g. accented characters), or send a bug report."
-
-msgid "register_error"
-msgstr ""
-"Some error, most likely in the server, has occured.\n"
-"Please, try again later."
-
-msgid "register_result_title"
-msgstr "Registration"
-
-msgid "student_title"
-msgstr "Student"
-
-msgid "student_help"
-msgstr ""
-"You can initiate the entrace exam\n"
-"and the check flight here."
-
-msgid "student_entry_exam_status"
-msgstr "Entry exam:"
-
-msgid "student_entry_exam_passed"
-msgstr "<span color=\"darkgreen\"><b>Passed</b></span>"
-
-msgid "student_entry_exam_not_passed"
-msgstr "<span color=\"orange\"><b>Not yet passed</b></span>"
-
-msgid "student_entry_exam"
-msgstr "Take the _entry exam"
-
-msgid "student_entry_exam_tooltip"
-msgstr ""
-"Click this button to go to MAVA's training website in your browser and take "
-"the theoretical entry exam. The website might ask you for login: you can "
-"use your MAVA pilot ID (PXXX) and password. "
-"If this button is greyed out, it means that you have already passed "
-"the exam earlier. Note, that its status is updated only a few minutes "
-"after passing the exam."
Index: locale/hu/mlx.po
===================================================================
--- locale/hu/mlx.po	(revision 764)
+++ locale/hu/mlx.po	(revision 744)
@@ -94,7 +94,4 @@
 msgstr "_Küldés..."
 
-msgid "button_register"
-msgstr "_Regisztráció"
-
 msgid "button_cancelFlight"
 msgstr "Járat megszakítása"
@@ -281,10 +278,4 @@
 msgid "login_entranceExam_tooltip"
 msgstr "Ha ezt bejelölöd, ellenörző repülésre jelentkezhetsz be."
-
-msgid "button_login_register"
-msgstr "_Regisztráció..."
-
-msgid "button_login_register_tooltip"
-msgstr "Kattints ide a Malév Virtualhoz való regisztrálás céljából."
 
 msgid "button_offline"
@@ -2136,193 +2127,2 @@
 msgid "sendBugReport_error_sec"
 msgstr "Valamilyen kommunikációs probléma adódott, próbáld újra később."
-
-msgid "register_ask"
-msgstr "Szeretnél regisztrálni?"
-
-msgid "register_ask_sec"
-msgstr ""
-"Úgy tűnik, nem futtattad még a programot ezen a\n"
-"számítógépen, vagy legalábbis nem jelentkeztél még be.\n"
-"\n"
-"Ha szeretnél regisztrálni, kattints a <b>Regisztráció</b>\n"
-"gombra, majd töltsd ki a megjelenő űrlapot."
-
-msgid "register_title"
-msgstr "Regisztráció"
-
-msgid "register_help"
-msgstr ""
-"Töltsd ki a lenti űrlapot.\n"
-"A <i>dőlt</i> betűs adatokat nem kötelező megadnod.\n"
-"Vagy VATSIM vagy IVAO azonosítót meg kell adni."
-
-msgid "register_name1"
-msgstr "_Vezetéknév:"
-
-msgid "register_name1_tooltip"
-msgstr "Írd be a valódi vezetéknevedet"
-
-msgid "register_name2"
-msgstr "Keresz_tnév:"
-
-msgid "register_name2_tooltip"
-msgstr "Írd be a valódi keresztnevedet"
-
-msgid "register_nameorder"
-msgstr "eastern"
-
-msgid "register_year_of_birth"
-msgstr "S_zületés éve:"
-
-msgid "register_year_of_birth_tooltip"
-msgstr "Írd be az évnek a számát, amelyben születtél.."
-
-msgid "register_email"
-msgstr "E-m_ail:"
-
-msgid "register_email_tooltip"
-msgstr "Írd be az e-mail címedet."
-
-msgid "register_email_public"
-msgstr "P_ublikus"
-
-msgid "register_email_public_tooltip"
-msgstr ""
-"Ha ezt bejelölöd, az e-mail címed megjelenhet a fórumunkban és "
-"egyéb belső weboldalakon is, így azt a MAVA többi tagja "
-"láthatja."
-
-msgid "register_vatsim_id"
-msgstr "VATSIM _CID:"
-
-msgid "register_vatsim_id_tooltip"
-msgstr ""
-"Ha rendelkezel VATSIM regisztrációval, írd be ide az azonosítódat. "
-"A regisztrációhoz vagy VATSIM vagy IVAO azonosító szükséges."
-
-msgid "register_ivao_id"
-msgstr "IVA_O VID:"
-
-msgid "register_ivao_id_tooltip"
-msgstr ""
-"Ha rendelkezel IVAO regisztrációval, írd be ide az azonosítódat. "
-"A regisztrációhoz vagy VATSIM vagy IVAO azonosító szükséges."
-
-msgid "register_phone_num"
-msgstr "<i>Tele_fonszám</i>:"
-
-msgid "register_phone_num_tooltip"
-msgstr "Ha telefonon is kereshetünk, írd be a számodat."
-
-msgid "register_nationality"
-msgstr "<i>Nemzetisé_g</i>:"
-
-msgid "register_nationality_tooltip"
-msgstr "Írd be a nemzetiségedet, ha meg kívánod azt velünk osztani."
-
-msgid "register_password"
-msgstr "Je_lszó:"
-
-msgid "register_password_tooltip"
-msgstr "Írd be a jelszót, amivel be szeretnél majd jelentkezni."
-
-msgid "register_password2"
-msgstr "Jelszó új_ra:"
-
-msgid "register_password2_tooltip"
-msgstr "Írd be ugyanazt a jelszót megint."
-
-msgid "register_password_ok"
-msgstr "<span foreground=\"darkgreen\"><b>Rendben</b></span>"
-
-msgid "register_password_too_short"
-msgstr "<span foreground=\"orange\"><b>Túl rövid</b></span>"
-
-msgid "register_password_mismatch"
-msgstr "<span foreground=\"red\"><b>A két jelszó különbözik</b></span>"
-
-msgid "register_busy"
-msgstr "Regisztráció..."
-
-msgid "register_ok"
-msgstr "A regisztráció sikerült."
-
-msgid "register_failed"
-msgstr "A regisztráció nem sikerült!"
-
-msgid "register_info"
-msgstr ""
-"Gratulálunk! Ezennel a MAVA pilótája lettél\n"
-"STU (student - tanuló) státuszban.\n"
-"\n"
-"Pilóta azonosítód: <b>%s</b>.\n"
-"\n"
-"Most a tanulók oldala fog megjelenni,\n"
-"ahol kezdeményezheted a belépő teszt\n"
-"kitöltését vagy elindíthatod az ellenőrző\n"
-"repülést.\n"
-"\n"
-"A tanulók oldalára bármikor visszatérhetsz\n"
-"ha elindítod a programot és bejelentkezel."
-
-msgid "register_nologin"
-msgstr ""
-"Gratulálunk! Ezennel a MAVA pilótája lettél\n"
-"STU (student - tanuló) státuszban.\n"
-"\n"
-"Pilóta azonosítód: <b>%s</b>.\n"
-"\n"
-"Valamilyen oknál fogva a bejelentkezés viszont\n"
-"nem sikerült (talán szerverhiba).\n"
-"\n"
-"A bejelentkező oldal fog megjelenni,\n"
-"ahol megpróbálhatsz belépni. Természetesen\n"
-"a programot bármikor futtathatod és\n"
-"megpróbálhatod a belépést."
-
-msgid "register_email_already"
-msgstr "A megadott e-mail címmel már regisztráltak."
-
-msgid "register_invalid_data"
-msgstr ""
-"A program érvényelen adatokat küldött a szervernek.\n"
-"Ez programhiba lehet. Megpróbálhatsz megváltoztatni\n"
-"bizonyos adatokat (pl. az ékezetes karaktereket),\n"
-"vagy küldhetsz hibajelentést."
-
-msgid "register_error"
-msgstr ""
-"Valamilyen, valószínűleg szerverhiba történt.\n"
-"Kérlek, próbáld meg később."
-
-msgid "register_result_title"
-msgstr "Regisztráció"
-
-msgid "student_title"
-msgstr "Tanuló"
-
-msgid "student_help"
-msgstr ""
-"Itt intézheted a felvételi elméleti vizsgát\n"
-"és az ellenőrző repülést."
-
-msgid "student_entry_exam_status"
-msgstr "Elméleti vizsga:"
-
-msgid "student_entry_exam_passed"
-msgstr "<span color=\"darkgreen\"><b>Sikeres</b></span>"
-
-msgid "student_entry_exam_not_passed"
-msgstr "<span color=\"orange\"><b>Még nem tetted le</b></span>"
-
-msgid "student_entry_exam"
-msgstr "_Elméleti vizsga"
-
-msgid "student_entry_exam_tooltip"
-msgstr ""
-"Erre a gombra kattintva a MAVA oktatási weboldalára kerülsz "
-"böngésződben és kitöltheted az elméleti vizsga tesztjét. "
-"A weboldalon szükség lehet bejelentkezned: ebben az esetben "
-"használd a MAVA pilóta azonosítódat (PXXX) és jelszavadat. "
-"Ha a gomb inaktív, a vizsgát korábban már sikeresen teljesítetted. "
-"A gomb állapota csak néhány perccel a vizsga teljesítése után frissül."
Index: src/mlx/const.py
===================================================================
--- src/mlx/const.py	(revision 737)
+++ src/mlx/const.py	(revision 748)
@@ -11,5 +11,5 @@
 
 ## The version of the program
-VERSION="0.38"
+VERSION="0.37.1"
 
 #-------------------------------------------------------------------------------
Index: src/mlx/fs.py
===================================================================
--- src/mlx/fs.py	(revision 765)
+++ src/mlx/fs.py	(revision 666)
@@ -212,6 +212,5 @@
     - n1[]: the N1 values of the turbine engines (array of floats
     of as many items as the number of engines, present only for aircraft with
-    turbines, for other aircraft it is None). If the aircraft has turbines, but
-    the N1 values cannot be read reliably, the array contains Nones.
+    turbines, for other aircraft it is None)
     - rpm[]: the RPM values of the piston engines (array of floats
     of as many items as the number of engines, present only for aircraft with
Index: src/mlx/fsuipc.py
===================================================================
--- src/mlx/fsuipc.py	(revision 766)
+++ src/mlx/fsuipc.py	(revision 749)
@@ -1387,4 +1387,7 @@
         state.gearsDown = data[self._monidx_noseGear]==16383
 
+        if state.gearControlDown!=state.gearsDown:
+            print "gearControl:", data[self._monidx_gearControl], ", noseGear:", data[self._monidx_noseGear]
+
         state.spoilersArmed = data[self._monidx_spoilersArmed]!=0
 
@@ -1846,7 +1849,4 @@
         state.gearsDown = state.gearControlDown
 
-        # Th N1 values cannot be read either
-        state.n1 = [None, None]
-
         return state
 
Index: src/mlx/gui/flight.py
===================================================================
--- src/mlx/gui/flight.py	(revision 764)
+++ src/mlx/gui/flight.py	(revision 739)
@@ -11,5 +11,5 @@
 import mlx.util as util
 from mlx.pirep import PIREP
-from mlx.i18n import xstr, getLanguage
+from mlx.i18n import xstr
 from mlx.sound import startSound
 import mlx.web as web
@@ -20,6 +20,4 @@
 import tempfile
 import threading
-import re
-import webbrowser
 
 #-----------------------------------------------------------------------------
@@ -63,5 +61,5 @@
 class Page(gtk.Alignment):
     """A page in the flight wizard."""
-    def __init__(self, wizard, id, title, help, completedHelp = None):
+    def __init__(self, wizard, title, help, completedHelp = None):
         """Construct the page."""
         super(Page, self).__init__(xalign = 0.0, yalign = 0.0,
@@ -141,6 +139,4 @@
 
         self._wizard = wizard
-        self._id = id
-        self._nextPageID = None
 
         self._cancelFlightButton = None
@@ -148,19 +144,4 @@
         self._completed = False
         self._fromPage = None
-
-    @property
-    def id(self):
-        """Get the identifier of the page."""
-        return self._id
-
-    @property
-    def nextPageID(self):
-        """Get the identifier of the next page, if set."""
-        return self._nextPageID
-
-    @nextPageID.setter
-    def nextPageID(self, nextPageID):
-        """Set the identifier of the next page."""
-        self._nextPageID = nextPageID
 
     def setMainWidget(self, widget):
@@ -296,11 +277,11 @@
     def __init__(self, wizard):
         """Construct the login page."""
-        super(LoginPage, self).__init__(wizard, "login",
-                                        xstr("login"), xstr("loginHelp"))
+        super(LoginPage, self).__init__(wizard, xstr("login"),
+                                        xstr("loginHelp"))
 
         alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
                                   xscale = 0.0, yscale = 0.0)
 
-        table = gtk.Table(3, 2)
+        table = gtk.Table(4, 2)
         table.set_row_spacings(4)
         table.set_col_spacings(32)
@@ -340,7 +321,9 @@
         table.attach(self._rememberButton, 1, 2, 2, 3, ypadding = 8)
 
-        self.addButton(xstr("button_login_register"),
-                       clicked = self._registerClicked,
-                       tooltip = xstr("button_login_register_tooltip"))
+        self._entranceExam = gtk.CheckButton(xstr("login_entranceExam"))
+        self._entranceExam.set_use_underline(True)
+        self._entranceExam.set_tooltip_text(xstr("login_entranceExam_tooltip"))
+        self._entranceExam.connect("toggled", self._setControls)
+        table.attach(self._entranceExam, 1, 2, 3, 4, ypadding = 12)
 
         self.addButton(xstr("button_offline"),
@@ -352,4 +335,10 @@
         self._loginButton.set_tooltip_text(xstr("login_button_tooltip"))
 
+
+    @property
+    def entranceExam(self):
+        """Get whether an entrance exam is being performed."""
+        return self._entranceExam.get_active() and \
+               self._pilotID.get_text()!=""
 
     @property
@@ -390,10 +379,10 @@
         pilotID = self._pilotID.get_text()
         password = self._password.get_text()
-        self._rememberButton.set_sensitive(password!="")
-        self._loginButton.set_sensitive(pilotID!="" and password!="")
-
-    def _registerClicked(self, button):
-        """Called when the Register button was clicked."""
-        self._wizard.jumpPage("register")
+        entranceExam = self._entranceExam.get_active()
+        self._password.set_sensitive(not entranceExam)
+        self._rememberButton.set_sensitive(password!="" and not entranceExam)
+        self._entranceExam.set_sensitive(pilotID!="")
+        self._loginButton.set_sensitive(pilotID!="" and
+                                        (password!="" or entranceExam))
 
     def _offlineClicked(self, button):
@@ -407,5 +396,6 @@
         self._wizard.login(self._handleLoginResult,
                            self._pilotID.get_text(),
-                           self._password.get_text())
+                           self._password.get_text(),
+                           self.entranceExam)
 
     def _handleLoginResult(self, returned, result):
@@ -423,8 +413,5 @@
 
             config.save()
-            if result.rank=="STU":
-                self._wizard.jumpPage("student")
-            else:
-                self._wizard.nextPage()
+            self._wizard.nextPage()
 
 #-----------------------------------------------------------------------------
@@ -436,6 +423,5 @@
         help = xstr("flightsel_help")
         completedHelp = xstr("flightsel_chelp")
-        super(FlightSelectionPage, self).__init__(wizard, "flightsel",
-                                                  xstr("flightsel_title"),
+        super(FlightSelectionPage, self).__init__(wizard, xstr("flightsel_title"),
                                                   help, completedHelp = completedHelp)
 
@@ -617,5 +603,5 @@
         """Called when the forward button was clicked."""
         if self._completed:
-            self._wizard.jumpPage(self._nextID, finalize = False)
+            self._wizard.jumpPage(self._nextDistance, finalize = False)
         else:
             self._flightSelected()
@@ -672,30 +658,30 @@
                                          const.PLANE_AWAY)
         else:
-            self._nextID = "connect"
-            self._wizard.jumpPage("connect")
+            self._nextDistance = 2
+            self._wizard.jumpPage(2)
 
     def _fleetRetrieved(self, fleet):
         """Called when the fleet has been retrieved."""
         if fleet is None:
-            self._nextID = "connect"
-            self._wizard.jumpPage("connect")
+            self._nextDistance = 2
+            self._wizard.jumpPage(2)
         else:
             plane = fleet[self._wizard._bookedFlight.tailNumber]
             if plane is None:
-                self._nextID = "connect"
-                self._wizard.jumpPage("connect")
+                self._nextDistance = 2
+                self._wizard.jumpPage(2)
             elif plane.gateNumber is not None and \
                  not fleet.isGateConflicting(plane):
                 self._wizard._departureGate = plane.gateNumber
-                self._nextID = "connect"
-                self._wizard.jumpPage("connect")
+                self._nextDistance = 2
+                self._wizard.jumpPage(2)
             else:
-                self._nextID = "gatesel"
-                self._wizard.jumpPage("gatesel")
+                self._nextDistance = 1
+                self._wizard.nextPage()
 
     def _planeUpdated(self, success):
         """Callback for the plane updating."""
-        self._nextID = "connect"
-        self._wizard.jumpPage("connect")
+        self._nextDistance = 2
+        self._wizard.jumpPage(2)
 
     def _getSaveDialog(self):
@@ -800,6 +786,5 @@
     def __init__(self, wizard):
         """Construct the gate selection page."""
-        super(GateSelectionPage, self).__init__(wizard, "gatesel",
-                                                xstr("gatesel_title"),
+        super(GateSelectionPage, self).__init__(wizard, xstr("gatesel_title"),
                                                 xstr("gatesel_help"))
 
@@ -864,5 +849,5 @@
             self._gateSelected()
         else:
-            self._wizard.jumpPage("connect")
+            self._wizard.nextPage()
 
     def _rowActivated(self, flightList, path, column):
@@ -886,5 +871,5 @@
         """Callback for the plane updating call."""
         if success is None or success:
-            self._wizard.jumpPage("connect")
+            self._wizard.nextPage()
         else:
             dialog = gtk.MessageDialog(parent = self._wizard.gui.mainWindow,
@@ -902,554 +887,7 @@
         """Called when the fleet has been retrieved."""
         if fleet is None:
-            self._wizard.jumpPage("connect")
+            self._wizard.nextPage()
         else:
             self.activate()
-
-#-----------------------------------------------------------------------------
-
-class RegisterPage(Page):
-    """A page to enter the registration data."""
-
-    # The minimal year of birth
-    _minYearOfBirth = 1900
-
-    # The maximal year of birth
-    _maxYearOfBirth = datetime.date.today().year
-
-    # The regular expression to check the e-mail address with
-    _emailAddressRE = re.compile("[^@]+@[^@]+\.[^@]+")
-
-    def __init__(self, wizard):
-        """Construct the registration page."""
-        super(RegisterPage, self).__init__(wizard, "register",
-                                           xstr("register_title"),
-                                           xstr("register_help"))
-
-        alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-
-        table = gtk.Table(12, 3)
-        table.set_row_spacings(4)
-        table.set_col_spacings(32)
-        alignment.add(table)
-        self.setMainWidget(alignment)
-
-        row = 0
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_name1"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        self._name1 = gtk.Entry()
-        self._name1.connect("changed", self._updateButtons)
-        self._name1.set_tooltip_text(xstr("register_name1_tooltip"))
-        self._name1.set_width_chars(15)
-        table.attach(self._name1, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._name1)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_name2"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        self._name2 = gtk.Entry()
-        self._name2.connect("changed", self._updateButtons)
-        self._name2.set_tooltip_text(xstr("register_name2_tooltip"))
-        self._name2.set_width_chars(15)
-        table.attach(self._name2, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._name2)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_year_of_birth"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
-                                  xscale = 0.0, yscale = 0.0)
-
-        self._yearOfBirth = gtk.SpinButton()
-        self._yearOfBirth.set_increments(step = 1, page = 10)
-        self._yearOfBirth.set_range(min = RegisterPage._minYearOfBirth,
-                                    max = RegisterPage._maxYearOfBirth)
-        self._yearOfBirth.set_numeric(True)
-        self._yearOfBirth.set_tooltip_text(xstr("register_year_of_birth_tooltip"))
-        self._yearOfBirth.set_width_chars(5)
-        self._yearOfBirth.connect("changed", self._updateButtons)
-        self._yearOfBirth.connect("value-changed", self._updateButtons)
-        alignment.add(self._yearOfBirth)
-        table.attach(alignment, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._yearOfBirth)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_email"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        self._emailAddress = gtk.Entry()
-        self._emailAddress.connect("changed", self._updateButtons)
-        self._emailAddress.set_tooltip_text(xstr("register_email_tooltip"))
-        table.attach(self._emailAddress, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._emailAddress)
-
-        self._emailAddressPublic = gtk.CheckButton(xstr("register_email_public"))
-        self._emailAddressPublic.set_use_underline(True)
-        self._emailAddressPublic.set_tooltip_text(xstr("register_email_public_tooltip"))
-        table.attach(self._emailAddressPublic, 2, 3, row, row+1)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_vatsim_id"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
-                                  xscale = 0.0, yscale = 0.0)
-        self._vatsimID = IntegerEntry()
-        self._vatsimID.connect("changed", self._updateButtons)
-        self._vatsimID.set_tooltip_text(xstr("register_vatsim_id_tooltip"))
-        self._vatsimID.set_width_chars(7)
-        alignment.add(self._vatsimID)
-        table.attach(alignment, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._vatsimID)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_ivao_id"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
-                                  xscale = 0.0, yscale = 0.0)
-        self._ivaoID = IntegerEntry()
-        self._ivaoID.connect("changed", self._updateButtons)
-        self._ivaoID.set_tooltip_text(xstr("register_ivao_id_tooltip"))
-        self._ivaoID.set_width_chars(7)
-        alignment.add(self._ivaoID)
-        table.attach(alignment, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._ivaoID)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_phone_num"))
-        label.set_use_underline(True)
-        label.set_use_markup(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        self._phoneNumber = gtk.Entry()
-        self._phoneNumber.set_tooltip_text(xstr("register_phone_num_tooltip"))
-        table.attach(self._phoneNumber, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._phoneNumber)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_nationality"))
-        label.set_use_underline(True)
-        label.set_use_markup(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-
-        self._nationality = gtk.Entry()
-        self._nationality.set_tooltip_text(xstr("register_nationality_tooltip"))
-        table.attach(self._nationality, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._nationality)
-
-        placeholder = gtk.Label()
-        placeholder.set_text(xstr("register_password_mismatch"))
-        placeholder.set_use_markup(True)
-        placeholder.set_child_visible(False)
-        placeholder.hide()
-        table.attach(placeholder, 2, 3, row, row+1)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_password"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        self._password = gtk.Entry()
-        self._password.set_visibility(False)
-        self._password.connect("changed", self._updateButtons)
-        self._password.set_tooltip_text(xstr("register_password_tooltip"))
-        table.attach(self._password, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._password)
-
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        self._passwordStatus = gtk.Label()
-        alignment.add(self._passwordStatus)
-        table.attach(alignment, 2, 3, row, row+1)
-
-        row += 1
-
-        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                       xscale = 0.0, yscale = 0.0)
-        label = gtk.Label(xstr("register_password2"))
-        label.set_use_underline(True)
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row+1)
-
-        self._password2 = gtk.Entry()
-        self._password2.set_visibility(False)
-        self._password2.connect("changed", self._updateButtons)
-        self._password2.set_tooltip_text(xstr("register_password2_tooltip"))
-        table.attach(self._password2, 1, 2, row, row+1)
-        label.set_mnemonic_widget(self._password2)
-
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        self._password2Status = gtk.Label()
-        alignment.add(self._password2Status)
-        table.attach(alignment, 2, 3, row, row+1)
-
-        row += 1
-
-        self._rememberButton = gtk.CheckButton(xstr("remember_password"))
-        self._rememberButton.set_use_underline(True)
-        self._rememberButton.set_tooltip_text(xstr("login_remember_tooltip"))
-        table.attach(self._rememberButton, 1, 2, row, row+1)
-
-        cancelButton = \
-          self.addButton(xstr("button_cancel"))
-        cancelButton.connect("clicked", self._cancelClicked)
-
-        self._registerButton = \
-          self.addButton(xstr("button_register"), default = True,
-                              tooltip = xstr("button_register_tooltip"))
-        self._registerButton.connect("clicked", self._registerClicked)
-
-        self._updateButtons()
-
-    @property
-    def name1(self):
-        """Get the first name component entered."""
-        return self._name1.get_text()
-
-    @property
-    def name2(self):
-        """Get the second name component entered."""
-        return self._name2.get_text()
-
-    @property
-    def yearOfBirth(self):
-        """Get the year of birth."""
-        yearOfBirthText = self._yearOfBirth.get_text()
-        return int(yearOfBirthText) if yearOfBirthText else 0
-
-    @property
-    def emailAddress(self):
-        """Get the e-mail address."""
-        return self._emailAddress.get_text()
-
-    @property
-    def emailAddressPublic(self):
-        """Get the whether the e-mail address is public."""
-        return self._emailAddressPublic.get_active()
-
-    @property
-    def vatsimID(self):
-        """Get the VATSIM ID."""
-        return self._vatsimID.get_int()
-
-    @property
-    def ivaoID(self):
-        """Get the IVAO ID."""
-        return self._ivaoID.get_int()
-
-    @property
-    def phoneNumber(self):
-        """Get the phone number."""
-        return self._phoneNumber.get_text()
-
-    @property
-    def nationality(self):
-        """Get the nationality."""
-        return self._nationality.get_text()
-
-    @property
-    def password(self):
-        """Get the password."""
-        return self._password.get_text()
-
-    @property
-    def rememberPassword(self):
-        """Get whether the password should be remembered."""
-        return self._rememberButton.get_active()
-
-    def activate(self):
-        """Setup the route from the booked flight."""
-        self._yearOfBirth.set_value(0)
-        self._yearOfBirth.set_text("")
-        self._updateButtons()
-
-    def _updateButtons(self, widget = None):
-        """Update the sensitive state of the buttons"""
-        yearOfBirth = self.yearOfBirth
-
-        emailAddress = self.emailAddress
-        emailAddressMatch = RegisterPage._emailAddressRE.match(emailAddress)
-
-        vatsimID = self.vatsimID
-        ivaoID = self.ivaoID
-
-        password = self.password
-        password2 = self._password2.get_text()
-        if not password:
-            self._passwordStatus.set_text("")
-        elif len(password)<5:
-            self._passwordStatus.set_text(xstr("register_password_too_short"))
-        else:
-            self._passwordStatus.set_text(xstr("register_password_ok"))
-        self._passwordStatus.set_use_markup(True)
-
-        if len(password)<5 or not password2:
-            self._password2Status.set_text("")
-        elif password!=password2:
-            self._password2Status.set_text(xstr("register_password_mismatch"))
-        else:
-            self._password2Status.set_text(xstr("register_password_ok"))
-        self._password2Status.set_use_markup(True)
-
-        sensitive = \
-            len(self.name1)>0 and len(self.name2)>0 and \
-            yearOfBirth>=RegisterPage._minYearOfBirth and \
-            yearOfBirth<=RegisterPage._maxYearOfBirth and \
-            emailAddressMatch is not None and \
-            (vatsimID>=800000 or ivaoID>=100000) and \
-            len(password)>=5 and password==password2
-
-        self._registerButton.set_sensitive(sensitive)
-
-    def _cancelClicked(self, button):
-        """Called when the Cancel button is clicked."""
-        self.goBack()
-
-    def _registerClicked(self, button):
-        """Called when the Register button is clicked."""
-        nameOrder = xstr("register_nameorder")
-
-        if nameOrder=="eastern":
-            surName = self.name1
-            firstName = self.name2
-        else:
-            surName = self.name2
-            firstName = self.name1
-
-        nationality = self.nationality.lower()
-
-        if getLanguage().lower()=="hu" or nationality.find("hung")!=-1 or \
-           nationality.find("magyar")!=-1:
-            requestedNameOrder = "eastern"
-        else:
-            requestedNameOrder = "western"
-
-        registrationData = web.Registration(surName, firstName,
-                                            requestedNameOrder,
-                                            self.yearOfBirth,
-                                            self.emailAddress,
-                                            self.emailAddressPublic,
-                                            self.vatsimID, self.ivaoID,
-                                            self.phoneNumber, self.nationality,
-                                            self.password)
-        print "Registering with data:"
-        print "  name:", self.name1, self.name2, registrationData.firstName, registrationData.surName, requestedNameOrder
-        print "  yearOfBirth:", self.yearOfBirth, registrationData.yearOfBirth
-        print "  emailAddress:", self.emailAddress, registrationData.emailAddress
-        print "  emailAddressPublic:", self.emailAddressPublic, registrationData.emailAddressPublic
-        print "  vatsimID:", self.vatsimID, registrationData.vatsimID
-        print "  ivaoID:", self.ivaoID, registrationData.ivaoID
-        print "  phoneNumber:", self.phoneNumber, registrationData.phoneNumber
-        print "  nationality:", self.nationality, registrationData.nationality
-
-        gui = self._wizard.gui
-        gui.beginBusy(xstr("register_busy"))
-        gui.webHandler.register(self._registerResultCallback, registrationData)
-
-    def _registerResultCallback(self, returned, result):
-        """Called when the registration result is available."""
-        gobject.idle_add(self._handleRegisterResult, returned, result)
-
-    def _handleRegisterResult(self, returned, result):
-        """Handle the registration result."""
-        gui = self._wizard.gui
-
-        gui.endBusy()
-
-        print "Registration result:"
-        print "  returned:", returned
-        if returned:
-            print "  registered:", result.registered
-            if result.registered:
-                print "  pilotID", result.pilotID
-                print "  loggedIn", result.loggedIn
-            print "  emailAlreadyRegistered:", result.emailAlreadyRegistered
-            print "  invalidData:", result.invalidData
-
-        registrationOK = returned and result.registered
-
-        message = xstr("register_ok") if registrationOK \
-                  else xstr("register_failed")
-        secondaryMessage = None
-        if registrationOK:
-            if result.loggedIn:
-                secondaryMessage = xstr("register_info") % (result.pilotID,)
-            else:
-                secondaryMessage = xstr("register_nologin") % (result.pilotID,)
-            messageType = MESSAGETYPE_INFO
-
-            config = gui.config
-            config.pilotID = result.pilotID
-            config.rememberPassword = self.rememberPassword
-            if config.rememberPassword:
-                config.password = self.password
-            else:
-                config.password = ""
-
-            config.save()
-        elif returned and result.emailAlreadyRegistered:
-            secondaryMessage = xstr("register_email_already")
-            messageType = MESSAGETYPE_ERROR
-        elif returned and result.invalidData:
-            secondaryMessage = xstr("register_invalid_data")
-            messageType = MESSAGETYPE_ERROR
-        else:
-            secondaryMessage = xstr("register_error")
-            messageType = MESSAGETYPE_ERROR
-
-        dialog = gtk.MessageDialog(parent = gui.mainWindow,
-                                   type = messageType,
-                                   message_format = message)
-        dialog.set_title(WINDOW_TITLE_BASE + " - " +
-                         xstr("register_result_title"))
-        dialog.format_secondary_markup(secondaryMessage)
-
-        dialog.add_button(xstr("button_ok"), 0)
-
-        dialog.run()
-        dialog.hide()
-
-        if registrationOK:
-            if result.loggedIn:
-                self._wizard.nextPage()
-            else:
-                self._wizard.jumpPage("login")
-
-#-----------------------------------------------------------------------------
-
-class StudentPage(Page):
-    """A page displayed to students after logging in."""
-    _entryExamStatusQueryInterval = 60*1000
-
-    def __init__(self, wizard):
-        """Construct the student page."""
-        super(StudentPage, self).__init__(wizard, "student",
-                                          xstr("student_title"),
-                                          xstr("student_help"))
-
-        alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
-                                  xscale = 0.5, yscale = 0.0)
-
-        table = gtk.Table(2, 2)
-        table.set_row_spacings(4)
-        table.set_col_spacings(32)
-        table.set_homogeneous(False)
-        alignment.add(table)
-        self.setMainWidget(alignment)
-
-        row = 0
-
-        labelAlignment = gtk.Alignment(xalign=0.0, yalign = 0.5,
-                                       xscale=0.0, yscale = 0.0)
-        label = gtk.Label(xstr("student_entry_exam_status"))
-        labelAlignment.add(label)
-        table.attach(labelAlignment, 0, 1, row, row + 1, xoptions = 0)
-
-        alignment = gtk.Alignment(xalign=0.0, yalign = 0.5,
-                                  xscale=1.0, yscale = 0.0)
-        self._entryExamStatus = gtk.Label()
-        self._entryExamStatus.set_use_markup(True)
-        self._entryExamStatus.set_alignment(0.0, 0.5)
-        alignment.add(self._entryExamStatus)
-        table.attach(alignment, 1, 2, row, row + 1)
-
-        row += 1
-
-        buttonAlignment = gtk.Alignment(xalign=0.0, xscale=1.0)
-        button = self._entryExamButton = gtk.Button(xstr("student_entry_exam"))
-        button.set_use_underline(True)
-        button.connect("clicked", self._entryExamClicked)
-        button.set_tooltip_text(xstr("student_entry_exam_tooltip"))
-
-        buttonAlignment.add(button)
-        table.attach(buttonAlignment, 0, 2, row, row + 1,
-                     ypadding = 4)
-
-    def activate(self):
-        """Activate the student page."""
-        loginResult = self._wizard.loginResult
-        self._entryExamLink = loginResult.entryExamLink
-
-        self._updateEntryExamStatus(loginResult.entryExamPassed)
-
-        self._getEntryExamStatus()
-
-    def _entryExamClicked(self, button):
-        """Called when the entry exam button is clicked."""
-        webbrowser.open(self._entryExamLink)
-
-    def _getEntryExamStatus(self):
-        """Initiate the query of the entry exam status after the interval."""
-        gobject.timeout_add(StudentPage._entryExamStatusQueryInterval,
-                            lambda: self._wizard.gui.webHandler. \
-                            getEntryExamStatus(self._entryExamStatusCallback))
-
-    def _entryExamStatusCallback(self, returned, result):
-        """Called when the entry exam status is available."""
-        gobject.idle_add(self._handleEntryExamStatus, returned, result)
-
-    def _handleEntryExamStatus(self, returned, result):
-        """Called when the entry exam status is availabe."""
-        print "_handleEntryExamStatus", returned, result
-        if returned:
-            self._entryExamLink = result.entryExamLink
-            self._updateEntryExamStatus(result.entryExamPassed)
-            self._getEntryExamStatus()
-
-    def _updateEntryExamStatus(self, passed):
-        """Update the entry exam status display and button."""
-        self._entryExamStatus.set_text(xstr("student_entry_exam_passed")
-                                       if passed else
-                                       xstr("student_entry_exam_not_passed"))
-        self._entryExamStatus.set_use_markup(True)
-        self._entryExamButton.set_sensitive(not passed)
 
 #-----------------------------------------------------------------------------
@@ -1463,6 +901,5 @@
                "Then press the Connect button to connect to the simulator."
         completedHelp = "The basic data of your flight can be read below."
-        super(ConnectPage, self).__init__(wizard, "connect",
-                                          xstr("connect_title"),
+        super(ConnectPage, self).__init__(wizard, xstr("connect_title"),
                                           xstr("connect_help"),
                                           completedHelp = xstr("connect_chelp"))
@@ -1647,6 +1084,5 @@
     def __init__(self, wizard):
         """Construct the page."""
-        super(PayloadPage, self).__init__(wizard, "payload",
-                                          xstr("payload_title"),
+        super(PayloadPage, self).__init__(wizard, xstr("payload_title"),
                                           xstr("payload_help"),
                                           completedHelp = xstr("payload_chelp"))
@@ -1875,6 +1311,5 @@
     current time from the flight simulator."""
     def __init__(self, wizard):
-        super(TimePage, self).__init__(wizard, "time",
-                                       xstr("time_title"),
+        super(TimePage, self).__init__(wizard, xstr("time_title"),
                                        xstr("time_help"),
                                        completedHelp = xstr("time_chelp"))
@@ -1997,6 +1432,5 @@
     def __init__(self, wizard):
         """Construct the page."""
-        super(RoutePage, self).__init__(wizard, "route",
-                                        xstr("route_title"),
+        super(RoutePage, self).__init__(wizard, xstr("route_title"),
                                         xstr("route_help"),
                                         completedHelp = xstr("route_chelp"))
@@ -2166,8 +1600,8 @@
         if self._wizard.gui.config.useSimBrief and \
            self._wizard.usingSimBrief is not False:
-            self._wizard.jumpPage("simbrief_setup")
+            self._wizard.nextPage()
         else:
             self._wizard.usingSimBrief = False
-            self._wizard.jumpPage("fuel")
+            self._wizard.jumpPage(3)
 
 #-----------------------------------------------------------------------------
@@ -2328,5 +1762,5 @@
         """Construct the setup page."""
 
-        super(SimBriefSetupPage, self).__init__(wizard, "simbrief_setup",
+        super(SimBriefSetupPage, self).__init__(wizard,
                                                 xstr("simbrief_setup_title"),
                                                 xstr("simbrief_setup_help"),
@@ -2647,5 +2081,5 @@
 
                 self._wizard.usingSimBrief = False
-                self._wizard.jumpPage("fuel", fromPageShift = 1)
+                self._wizard.jumpPage(2, fromPageShift = 1)
 
     def _getPlan(self):
@@ -2732,5 +2166,5 @@
         """Construct the setup page."""
 
-        super(SimBriefingPage, self).__init__(wizard, "simbrief_result",
+        super(SimBriefingPage, self).__init__(wizard,
                                               xstr("simbrief_result_title"), "")
 
@@ -2988,6 +2422,5 @@
     def __init__(self, wizard):
         """Construct the page."""
-        super(FuelPage, self).__init__(wizard, "fuel",
-                                       xstr("fuel_title"),
+        super(FuelPage, self).__init__(wizard, xstr("fuel_title"),
                                        xstr("fuel_help_pre") +
                                        xstr("fuel_help_post"),
@@ -3041,7 +2474,7 @@
             self._pump()
         elif self._wizard.usingSimBrief:
-            self._wizard.jumpPage("takeoff")
+            self._wizard.jumpPage(3)
         else:
-            self._wizard.jumpPage("briefing1")
+            self._wizard.nextPage()
 
     def _setupTanks(self, tankData):
@@ -3089,5 +2522,5 @@
             if self._wizard.usingSimBrief:
                 self._wizard.gui.startMonitoring()
-                self._wizard.jumpPage("takeoff")
+                self._wizard.jumpPage(3)
             else:
                 bookedFlight = self._wizard._bookedFlight
@@ -3158,13 +2591,9 @@
         self._departure = departure
 
-        number = 1 if departure else 2
-
-        title = xstr("briefing_title") % (number,
+        title = xstr("briefing_title") % (1 if departure else 2,
                                           xstr("briefing_departure")
                                           if departure
                                           else xstr("briefing_arrival"))
-        super(BriefingPage, self).__init__(wizard,
-                                           "briefing%d" % (number,),
-                                           title, xstr("briefing_help"),
+        super(BriefingPage, self).__init__(wizard, title, xstr("briefing_help"),
                                            completedHelp = xstr("briefing_chelp"))
 
@@ -3353,6 +2782,5 @@
     def __init__(self, wizard):
         """Construct the takeoff page."""
-        super(TakeoffPage, self).__init__(wizard, "takeoff",
-                                          xstr("takeoff_title"),
+        super(TakeoffPage, self).__init__(wizard, xstr("takeoff_title"),
                                           xstr("takeoff_help"),
                                           completedHelp = xstr("takeoff_chelp"))
@@ -3842,6 +3270,5 @@
     def __init__(self, wizard):
         """Construct the page."""
-        super(CruisePage, self).__init__(wizard, "cruise",
-                                         xstr("cruise_title"),
+        super(CruisePage, self).__init__(wizard, xstr("cruise_title"),
                                          xstr("cruise_help"))
 
@@ -3957,6 +3384,5 @@
     def __init__(self, wizard):
         """Construct the landing page."""
-        super(LandingPage, self).__init__(wizard, "landing",
-                                          xstr("landing_title"),
+        super(LandingPage, self).__init__(wizard, xstr("landing_title"),
                                           xstr("landing_help"),
                                           completedHelp = xstr("landing_chelp"))
@@ -4272,6 +3698,5 @@
         """Construct the finish page."""
         help = xstr("finish_help") + xstr("finish_help_goodtime")
-        super(FinishPage, self).__init__(wizard, "finish",
-                                         xstr("finish_title"), help)
+        super(FinishPage, self).__init__(wizard, xstr("finish_title"), help)
 
         alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
@@ -4831,6 +4256,4 @@
         self._pages.append(FlightSelectionPage(self))
         self._pages.append(GateSelectionPage(self))
-        self._pages.append(RegisterPage(self))
-        self._pages.append(StudentPage(self))
         self._pages.append(ConnectPage(self))
         self._payloadPage = PayloadPage(self)
@@ -4905,5 +4328,5 @@
     def entranceExam(self):
         """Get whether an entrance exam is about to be taken."""
-        return self._loginResult is not None and self._loginResult.rank=="STU"
+        return self._loginPage.entranceExam
 
     @property
@@ -5128,14 +4551,9 @@
     def nextPage(self, finalize = True):
         """Go to the next page."""
-        nextPageID = self._pages[self._currentPage].nextPageID
-        self.jumpPage(1 if nextPageID is None else nextPageID, finalize)
-
-    def jumpPage(self, countOrID, finalize = True, fromPageShift = None):
+        self.jumpPage(1, finalize)
+
+    def jumpPage(self, count, finalize = True, fromPageShift = None):
         """Go to the page which is 'count' pages after the current one."""
-        if isinstance(countOrID, str):
-            targetIndex = self._getIndexOf(countOrID)
-        else:
-            targetIndex = self._currentPage + countOrID
-        self.setCurrentPage(targetIndex,
+        self.setCurrentPage(self._currentPage + count,
                             finalize = finalize, fromPageShift = fromPageShift)
 
@@ -5198,5 +4616,5 @@
         #self.setCurrentPage(10)
 
-    def login(self, callback, pilotID, password):
+    def login(self, callback, pilotID, password, entranceExam):
         """Called when the login button was clicked."""
         self._loginCallback = callback
@@ -5206,4 +4624,5 @@
             pilotID = loginResult.pilotID
             password = loginResult.password
+            entranceExam = loginResult.entranceExam
             busyMessage = xstr("reload_busy")
         else:
@@ -5214,5 +4633,6 @@
 
         self.gui.webHandler.login(self._loginResultCallback,
-                                  pilotID, password)
+                                  pilotID, password,
+                                  entranceExam = entranceExam)
 
     def reloadFlights(self, callback):
@@ -5367,13 +4787,3 @@
                 self._arrivalBriefingPage.setMETAR(metar)
 
-    def _getIndexOf(self, pageID):
-        """Get the index for the given page ID.
-
-        It is an assertion failure if the ID is not found."""
-        for index in range(0, len(self._pages)):
-            page = self._pages[index]
-            if page.id==pageID:
-                return index
-        assert False
-
 #-----------------------------------------------------------------------------
Index: src/mlx/gui/gui.py
===================================================================
--- src/mlx/gui/gui.py	(revision 755)
+++ src/mlx/gui/gui.py	(revision 746)
@@ -447,6 +447,4 @@
                                     self._mainWindow)
             self._updater.start()
-        else:
-            self.updateDone()
 
         cef.initialize(self._programDirectory, self._cefInitialized)
@@ -459,8 +457,4 @@
 
         self._disconnect()
-
-    def updateDone(self):
-        """Called when the update is done (and there is no need to restart)."""
-        gobject.idle_add(self._updateDone)
 
     def connected(self, fsType, descriptor):
@@ -1700,24 +1694,2 @@
             self._credentialsAvailable = True
             self._credentialsCondition.notify()
-
-    def _updateDone(self):
-        """Called when the update is done.
-
-        It checks if we already know the PID, and if not, asks the user whether
-        to register."""
-        if not self.config.pilotID and not self.config.password:
-            dialog = gtk.MessageDialog(parent = self._mainWindow,
-                                       type = MESSAGETYPE_QUESTION,
-                                       message_format = xstr("register_ask"))
-
-            dialog.set_title(WINDOW_TITLE_BASE)
-            dialog.format_secondary_markup(xstr("register_ask_sec"))
-
-            dialog.add_button(xstr("button_cancel"), 0)
-            dialog.add_button(xstr("button_register"), 1)
-            dialog.set_default_response(1)
-
-            result = dialog.run()
-            dialog.hide()
-            if result == 1:
-                self._wizard.jumpPage("register")
Index: src/mlx/gui/monitor.py
===================================================================
--- src/mlx/gui/monitor.py	(revision 765)
+++ src/mlx/gui/monitor.py	(revision 680)
@@ -378,8 +378,5 @@
                 for n1 in aircraftState.n1:
                     if n1Str: n1Str += ", "
-                    if n1 is None:
-                        n1Str += "?"
-                    else:
-                        n1Str += "%.0f" % (n1,)
+                    n1Str += "%.0f" % (n1,)
             elif aircraftState.rpm is not None:
                 n1Str = ""
Index: src/mlx/gui/update.py
===================================================================
--- src/mlx/gui/update.py	(revision 755)
+++ src/mlx/gui/update.py	(revision 300)
@@ -124,5 +124,4 @@
         if not self._waitAfterFinish:
             gobject.idle_add(self._progressWindow.hide)
-            self._gui.updateDone()
 
     def downloadingManifest(self):
@@ -287,6 +286,4 @@
         if self._restart:
             self._gui.restart()
-        else:
-            self._gui.updateDone()
 
 #-------------------------------------------------------------------------------
Index: src/mlx/rpc.py
===================================================================
--- src/mlx/rpc.py	(revision 764)
+++ src/mlx/rpc.py	(revision 745)
@@ -125,25 +125,4 @@
 #---------------------------------------------------------------------------------------
 
-class Registration(object):
-    """Data for registration."""
-    def __init__(self, surName, firstName, nameOrder,
-                 yearOfBirth, emailAddress, emailAddressPublic,
-                 vatsimID, ivaoID, phoneNumber, nationality, password):
-        """Construct the registration data."""
-        self.surName = surName
-        self.firstName = firstName
-        self.nameOrder = nameOrder
-        self.yearOfBirth = yearOfBirth
-        self.emailAddress = emailAddress
-        self.emailAddressPublic = 1 if emailAddressPublic is True else \
-          0 if emailAddressPublic is False else emailAddressPublic
-        self.vatsimID = "" if vatsimID is None else vatsimID
-        self.ivaoID = "" if ivaoID is None else ivaoID
-        self.phoneNumber = phoneNumber
-        self.nationality = nationality
-        self.password = password
-
-#---------------------------------------------------------------------------------------
-
 class RPCException(Exception):
     """An exception thrown by RPC operations."""
@@ -176,7 +155,4 @@
     RESULT_DATABASE_ERROR = 3
 
-    # Result code: invalid data
-    RESULT_INVALID_DATA = 4
-
     # Result code: the flight does not exist
     RESULT_FLIGHT_NOT_EXISTS = 101
@@ -184,7 +160,4 @@
     # Result code: the flight has already been reported.
     RESULT_FLIGHT_ALREADY_REPORTED = 102
-
-    # Result code: a user with the given e-mail address already exists
-    RESULT_EMAIL_ALREADY_REGISTERED = 103
 
     def __init__(self, getCredentialsFn):
@@ -216,15 +189,4 @@
         self._sessionID = None
 
-    def register(self, registrationData):
-        """Register with the given data.
-
-        Returns a tuple of:
-        - the error code,
-        - the PID if there is no error."""
-        reply = Reply(self._server.register(registrationData))
-
-        return (reply.result,
-                reply.value["pid"] if reply.result==Client.RESULT_OK else None)
-
     def login(self):
         """Login using the given previously set credentials.
@@ -232,5 +194,5 @@
         The session ID is stored in the object and used for later calls.
 
-        Returns the name of the pilot on success, or None on error."""
+        Returns a boolean indicating if login has succeeded."""
         self._sessionID = None
 
@@ -239,5 +201,5 @@
             self._loginCount += 1
             self._sessionID = reply.value["sessionID"]
-            return (reply.value["name"], reply.value["rank"])
+            return reply.value["name"]
         else:
             return None
@@ -256,11 +218,4 @@
 
         return flights
-
-    def getEntryExamStatus(self):
-        """Get the status of the exams needed for joining MAVA."""
-        value = self._performCall(lambda sessionID:
-                                  self._server.getEntryExamStatus(sessionID))
-        return (value["entryExamPassed"], value["entryExamLink"],
-                value["checkFlightStatus"])
 
     def getFleet(self):
Index: src/mlx/web.py
===================================================================
--- src/mlx/web.py	(revision 764)
+++ src/mlx/web.py	(revision 746)
@@ -2,5 +2,4 @@
 import const
 import util
-from rpc import Registration
 import rpc
 import rpccommon
@@ -624,40 +623,9 @@
 #------------------------------------------------------------------------------
 
-class Register(RPCRequest):
-    """A registration request."""
-    def __init__(self, client, callback, registrationData):
-        """Construct the request."""
-        super(Register, self).__init__(client, callback)
-        self._registrationData = registrationData
-
-    def run(self):
-        """Perform the registration."""
-
-        registrationData = self._registrationData
-
-        (resultCode, pilotID) = self._client.register(registrationData)
-        result = Result()
-        result.registered = resultCode==rpc.Client.RESULT_OK
-        if result.registered:
-            result.pilotID = pilotID
-
-            self._client.setCredentials(pilotID, registrationData.password)
-            loginResult = self._client.login()
-            result.loggedIn = loginResult is not None
-
-        result.invalidData = \
-          resultCode==rpc.Client.RESULT_INVALID_DATA
-        result.emailAlreadyRegistered = \
-          resultCode==rpc.Client.RESULT_EMAIL_ALREADY_REGISTERED
-
-        return result
-
-#------------------------------------------------------------------------------
-
 class Login(Request):
     """A login request."""
     iso88592decoder = codecs.getdecoder("iso-8859-2")
 
-    def __init__(self, callback, pilotID, password):
+    def __init__(self, callback, pilotID, password, entranceExam):
         """Construct the login request with the given pilot ID and
         password."""
@@ -666,4 +634,5 @@
         self._pilotID = pilotID
         self._password = password
+        self._entranceExam = entranceExam
 
     def run(self):
@@ -677,29 +646,43 @@
         password = md5.hexdigest()
 
-        url = MAVA_BASE_URL + "/leker2.php?pid=%s&psw=%s" %  (pilotID, password)
+        if self._entranceExam:
+            url = MAVA_BASE_URL + "/ellenorzo/getflightplan.php?pid=%s" % \
+                  (pilotID,)
+        else:
+            url = MAVA_BASE_URL + "/leker2.php?pid=%s&psw=%s" % \
+                  (pilotID, password)
 
         result = Result()
+        result.entranceExam = self._entranceExam
 
         f = urllib2.urlopen(url, timeout = 10.0)
 
         status = readline(f)
-        result.loggedIn = status == ".OK."
+        if self._entranceExam:
+            result.loggedIn = status != "#NOEXAM"
+        else:
+            result.loggedIn = status == ".OK."
 
         if result.loggedIn:
             result.pilotID = self._pilotID
             result.password = self._password
-            result.rank = "FO"
             result.flights = []
-
-            result.pilotName = self.iso88592decoder(readline(f))[0]
-            result.exams = readline(f)
-
-            while True:
-                line = readline(f)
-                if not line or line == "#ENDPIREP": break
-
-                flight = BookedFlight(line)
-                flight.readFromWeb(f)
-                result.flights.append(flight)
+            # FIXME: this may not be the correct behaviour
+            # for an entrance exam, but the website returns
+            # an error
+            if self._entranceExam:
+                result.pilotName = result.pilotID
+                result.exams = ""
+            else:
+                result.pilotName = self.iso88592decoder(readline(f))[0]
+                result.exams = readline(f)
+
+                while True:
+                    line = readline(f)
+                    if not line or line == "#ENDPIREP": break
+
+                    flight = BookedFlight(line)
+                    flight.readFromWeb(f)
+                    result.flights.append(flight)
 
             result.flights.sort(cmp = lambda flight1, flight2:
@@ -715,5 +698,5 @@
 class LoginRPC(RPCRequest):
     """An RPC-based login request."""
-    def __init__(self, client, callback, pilotID, password):
+    def __init__(self, client, callback, pilotID, password, entranceExam):
         """Construct the login request with the given pilot ID and
         password."""
@@ -722,43 +705,20 @@
         self._pilotID = pilotID
         self._password = password
+        self._entranceExam = entranceExam
 
     def run(self):
         """Perform the login request."""
         result = Result()
+        # FIXME: handle the entrance exam case
+        result.entranceExam = self._entranceExam
 
         self._client.setCredentials(self._pilotID, self._password)
-        loginResult = self._client.login()
-        result.loggedIn = loginResult is not None
+        pilotName = self._client.login()
+        result.loggedIn = pilotName is not None
         if result.loggedIn:
             result.pilotID = self._pilotID
-            result.pilotName = loginResult[0]
-            result.rank = loginResult[1]
+            result.pilotName = pilotName
             result.password = self._password
             result.flights = self._client.getFlights()
-            if result.rank=="STU":
-                reply = self._client.getEntryExamStatus()
-                result.entryExamPassed = reply[0]
-                result.entryExamLink = reply[1]
-                result.checkFlightStatus = reply[2]
-
-        return result
-
-#------------------------------------------------------------------------------
-
-class GetEntryExamStatus(RPCRequest):
-    """A request to get the entry exam status."""
-    def __init__(self, client, callback):
-        """Construct the request."""
-        super(GetEntryExamStatus, self).__init__(client, callback)
-
-    def run(self):
-        """Perform the query."""
-        result = Result()
-
-        reply = self._client.getEntryExamStatus()
-
-        result.entryExamPassed = reply[0]
-        result.entryExamLink = reply[1]
-        result.checkFlightStatus = reply[2]
 
         return result
@@ -1174,19 +1134,12 @@
             self._rpcClient.setCredentials(config.pilotID, config.password)
 
-    def register(self, callback, registrationData):
-        """Enqueue a registration request."""
-        self._addRequest(Register(self._rpcClient, callback, registrationData))
-
-    def login(self, callback, pilotID, password):
+    def login(self, callback, pilotID, password, entranceExam = False):
         """Enqueue a login request."""
         request = \
-          LoginRPC(self._rpcClient, callback, pilotID, password) \
-          if self._config.useRPC else Login(callback, pilotID, password)
+          LoginRPC(self._rpcClient, callback, pilotID, password, entranceExam) \
+          if self._config.useRPC and not entranceExam \
+          else Login(callback, pilotID, password, entranceExam)
 
         self._addRequest(request)
-
-    def getEntryExamStatus(self, callback):
-        """Get the entry exam status."""
-        self._addRequest(GetEntryExamStatus(self._rpcClient, callback))
 
     def getFleet(self, callback):
