Index: MLXMANIFEST
===================================================================
--- MLXMANIFEST	(revision 900)
+++ MLXMANIFEST	(revision 890)
@@ -4,9 +4,9 @@
 library/fnmatch.pyc	3414	4d50000f78e903598af06ef1c5cfb3ef
 library/multiprocessing/managers.pyc	36290	ca35d24d87467303c5e94a0de51e9593
-library/gtk/_gtk.pyc	549	ccdd4be123a0909d44052f30869b38d8
+library/gtk/_gtk.pyc	549	fe4816d7315373754a9c2a78c1cb910d
 library/encodings/cp858.pyc	7591	02054a0b8e91b9758826eb70cddf096f
 library/encodings/cp1254.pyc	2678	17ff2ac86f90886d5c73ed789f0499f3
 library/encodings/unicode_internal.pyc	2022	1e902113491e0c334b44deb0c8940e01
-library/lxml/etree.pyc	555	8f2c530f47011cee9a5f642ef3df8d71
+library/lxml/etree.pyc	555	4cedd864ad5b158d44762634ecc002c9
 library/encodings/gbk.pyc	1622	71c1e7fe25116114241829a60e57c5f4
 sounds/speed.mp3	26331	3d64da0eea9f48fa73be82d385354bf6
@@ -17,5 +17,5 @@
 doc/manual/hu/pirepViewer.png	26835	267e4325e550ed14ed22f86a2c7e8e9d
 doc/manual/hu/prefsGeneral.png	25601	a33faad4d576b080ae0c040f5a1a5404
-library/mlx/gui/statusbar.pyc	4812	490a882b53429fa18f317e146f0c70c0
+library/mlx/gui/statusbar.pyc	4812	b6448dd0f6077bc70527ee0c39c330e1
 doc/manual/hu/mainWindow.png	29545	489097bf9f0d72ba0cb2661c0dfe881b
 library/lxml.etree.pyd	2977792	d9f46391d4eeb719304a07b1ddaa72d9
@@ -32,5 +32,5 @@
 library/WINHTTP.dll	354304	d29f2889baa10e19ad9ff70c8d5ecf50
 locales/ca.pak	7484	6490335e2837ffefb296ff1fabb50372
-library/mlx/gui/timetable.pyc	27480	92ebb8630c797b4235b54ecf205ed344
+library/mlx/gui/timetable.pyc	27480	9ef0c7c9b50df08d7c1bc75d14dac825
 library/encodings/cp720.pyc	2736	a0f8bdcf6477a00166d2a38b1ba3ce7c
 library/xml/sax/_exceptions.pyc	5829	9f1abe12a091b6808b131a0b4e179b5a
@@ -41,5 +41,5 @@
 library/encodings/big5hkscs.pyc	1670	0ff54e70f21b5e4a359d3779367cba85
 library/encodings/utf_8.pyc	1806	4b8dee0284ea2f55c4142fcde7463524
-locale/hu/LC_MESSAGES/mlx.mo	90718	d3f06c29211edf37a14045d9345e4d0b
+locale/hu/LC_MESSAGES/mlx.mo	90385	b4cc05ef2d0e7afff8adea144d3533c3
 library/encodings/mac_roman.pyc	2716	4b4745eccfcb77860b70b374ac07fbcc
 library/py_compile.pyc	6292	425da7ee065aa158fd274946204a4a77
@@ -52,10 +52,10 @@
 library/share/locale/hu/LC_MESSAGES/gdk-pixbuf.mo	21895	a932ead453f04de30e348c1689a4d896
 locales/fil.pak	7790	38cdea149d120d8e9a8a0b0a90ac5dfd
-library/mlx/gui/dcdata.pyc	19919	a37ad72d994b8a523da07130970c2f0b
+library/mlx/gui/dcdata.pyc	19919	9ea5897e2b27e087ff36f16c77a09487
 library/encodings/iso8859_5.pyc	2679	58a290e94b0266ef8ff4ee52da00e257
 library/encodings/iso2022_kr.pyc	1683	ef9549932514d2deda6c4676e5e5f1db
 library/libglib-2.0-0.dll	1242929	18e88b04da123bf05b07ff60a4e96654
 library/base64.pyc	10528	39abec9c60dc011d3c763f443f9b1a11
-library/mlx/gui/bugreport.pyc	4602	a32ca4d644f316b3d120ae3dc2597eba
+library/mlx/gui/bugreport.pyc	4602	99c9fc4da49ca115a5bd140a8405b87d
 doc/manual/en/flightSelection.png	32104	68b94da285951d84fd15ec40d809751a
 library/multiprocessing/pool.pyc	19766	3a4d776f05a59e31df0218fcf52b9a6d
@@ -100,8 +100,8 @@
 library/encodings/koi8_r.pyc	2700	fff1b35002b9e938b7ea6fd0fbe824ae
 sounds/737taxi.mp3	157362	846c403e5cb660be53c8b6da16b68234
-library/mlx/const.pyc	7781	ca412d026807bd7532a49e6f40d63833
+library/mlx/const.pyc	7504	d661c08870a0056cb2b4bab198de8c34
 python27.dll	2206720	f8f39495ed4a813e8f3049a4b9f5cff4
 locales/th.pak	13637	7262d0f5e1877212a45a1ef1ccc4c777
-library/mlx/gui/cef.pyc	13567	4e4065185decfc2a23900a45b112a896
+library/mlx/gui/cef.pyc	13567	b11c3bd18b59392a8a828d8ae904d2d1
 library/encodings/punycode.pyc	7570	335ff94e207934ae64e6f5fc07a5cacc
 library/encodings/shift_jisx0213.pyc	1710	1ec0383aafb1dcadb5f9b6afff16eb7f
@@ -118,5 +118,5 @@
 library/email/header.pyc	13339	f741f4c3543a278fec30f4d9bdd0f859
 library/share/locale/hu/LC_MESSAGES/atk10.mo	8465	e3f3466da367215aad971d7b0394229d
-library/select.pyc	543	49de99d20755a51a448c47694aabf924
+library/select.pyc	543	64632c3b8962883ab952e483a722d0f9
 library/encodings/uu_codec.pyc	4646	5282a5fcb676851224d2924aa3e48a9e
 library/ConfigParser.pyc	23857	1d17020dd0000ce0f73de812effa152f
@@ -129,6 +129,6 @@
 icudt.dll	9956864	5434e18b933e03f274d8da59fda4c676
 doc/manual/hu/simbriefSetup.png	32497	b287886107be21b6695897085b218fd4
-library/mlx/soundsched.pyc	9185	4211730170fddb82b5683ce1849234ee
-library/mlx/logger.pyc	13109	a70c061d36cf6b4e540f5610133466d3
+library/mlx/soundsched.pyc	9185	5d9c36cbf8971ad0e91adff5f9c4ab54
+library/mlx/logger.pyc	13109	78ca8e8f2b0b51e228a32fcca6f50fb7
 library/email/charset.pyc	13200	771aee9802116e673d08b44bc0450f99
 library/xplra.pyc	32012	50a1d9f19c0cc88783d264909ad1c678
@@ -158,13 +158,13 @@
 doc/manual/hu/flightSelection.png	32828	68562091faef606b1247e5d3a40c488e
 library/win32pipe.pyd	24064	de374eded459293b2a7eb8ed8fb38eaa
-library/win32pipe.pyc	552	70f5476d7ed103cb22b901a81e2d62fc
+library/win32pipe.pyc	552	481d263642893856d1c992f484f380aa
 doc/manual/hu/cruise.png	27925	f7045d9150a756f487e3ae3d08b4c1a5
 library/encodings/iso2022_jp_2004.pyc	1723	66376e788f3819e781897268c1100986
 library/cefpython3.cefpython_py27.pyd	968192	58161b73feae974f560d2c9f416adf3b
 library/encodings/cp866.pyc	8103	f36418dcf93b17b3ced63bd544f44159
-library/gio/_gio.pyc	549	63dbf557dc3df483aa6a0bae37a2d472
+library/gio/_gio.pyc	549	ce68d42eef1532c1ec170b997a7fdebd
 library/encodings/cp437.pyc	7874	63f1278c0a66129c6fb4f504d6b61b66
 doc/manual/hu/prefsSounds.png	22667	452c396c2bda9684bf052c98fd7870d1
-library/mlx/gates.pyc	7002	20aca1eaf3de122eda51883b5b518f6f
+library/mlx/gates.pyc	7002	5c82c4c4dd0918bf385497549f14767f
 library/mimetools.pyc	7837	c9accd6ef795bf71c90630be0161cadc
 doc/manual/en/pirepLoaded.png	9887	e27a7c87e134944787e29874c455380d
@@ -175,8 +175,8 @@
 doc/manual/hu/acarsTab.png	305091	489953210460410f2ec9d281b7ad6868
 library/encodings/utf_32_be.pyc	1747	3e8c9ef8145de502320202b1688fd2ee
-library/cefpython3/cefpython_py27.pyc	600	542ae3754fe3029d9fffe5ac7f9bd374
+library/cefpython3/cefpython_py27.pyc	600	22895e1b76e628cfe1126552651999d4
 library/encodings/mac_romanian.pyc	2756	a3b2a0892236bc80c8efe8940e33339e
 library/multiprocessing/connection.pyc	13385	c86567e4a002e8beca2301d1110b887c
-library/_ctypes.pyc	546	21922d74db381df8923d751a6ccef8eb
+library/_ctypes.pyc	546	ea964009a19c93c9b7e6d5a0952d740b
 Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest	1856	a1328f4f5ae0580ce72b0717893c9072
 library/encodings/iso8859_2.pyc	2678	da65f42e1be5bec97161e8c1cc4f0fb7
@@ -191,20 +191,20 @@
 library/quopri.pyc	6352	87c42d94f753dd4c8a761cfa79453bb8
 library/htmlentitydefs.pyc	6347	814dc784fdb3d998dccee4c3f4c0394f
-library/mlx/gui/monitor.pyc	13015	adcdde553f6ef5956faa6856489c6b0b
+library/mlx/gui/monitor.pyc	13015	506dbdd642eea450bb2cd7bb0c397caa
 library/encodings/latin_1.pyc	2111	52427573ccbfd06220b67d5a9dd1376e
-library/mlx/update.pyc	17632	e27fbb1e86d28e99f493c83ae1dae57d
+library/mlx/update.pyc	17632	a3cb8734519c01a74e628f78c1eac5ce
 library/bdb.pyc	17708	9a8fdcaa65f595c842689247847879d9
 library/unittest/case.pyc	37758	1d2235e74c246b562c5c00ddf73c621a
 library/subprocess.pyc	38648	c9f749db06dfc9fb32079de51d6efd01
-library/mlx/acft.pyc	43831	4bb1ff76aca2130bed92b093a1749116
+library/mlx/acft.pyc	42418	ab4080e74ed57c8608a662d38dd9f5c2
 library/gobject._gobject.pyd	113152	3d05dd191361f83aa247b62c700fa04e
 doc/manual/hu/checklistEditor.png	27863	8c750892a52dc10ca654a9d0b2765358
 library/bisect.pyc	2971	ad8ce3e265b404ed3971b842106f8179
-library/mlx/gui/acars.pyc	1054	6467ef4c361a74b4c2a289cba55761c3
+library/mlx/gui/acars.pyc	1054	f1ac7c30434908114c49343eca6dfd32
 library/gtk/_lazyutils.pyc	2772	93f9aa41ad4223106d99340cd539a566
-library/mlx/mlx.pyc	3027	062ba9eaf26e78de62ed20f4ab91cc79
+library/mlx/mlx.pyc	3027	6acdd392d3f3095bac42108db71a7f63
 library/encodings/cp864.pyc	7999	ca90afae086cb6b8f69b8419cc3cd1cb
 library/pyexpat.pyd	152576	5a82e9ec95005aca6130751e5b961cc3
-library/pyexpat.pyc	546	331b065065412d197efb50068f1b11b0
+library/pyexpat.pyc	546	c0175ad3bb5cd86249bf1cef3e3a560f
 library/unittest/loader.pyc	10884	591a785be23fba35582ce33bdd3d7acd
 library/ftplib.pyc	32043	5a1925388a0874e459aed6891f4cf0c1
@@ -214,5 +214,5 @@
 library/unittest/suite.pyc	9838	bf2c79bd4a6b6032f1ea53fa4908748f
 library/encodings/mac_arabic.pyc	7824	820deef79b02e1f7e52eb18e9be655bf
-library/mlx/gui/prefs.pyc	27921	2d3de746b632866251dccb5b1eb63f23
+library/mlx/gui/prefs.pyc	28139	1e2b4ccb44bc09700582f3e3cd2e44fa
 library/encodings/tis_620.pyc	2748	5969b4db4f967b11ae7992cdfbf5890e
 library/encodings/cp855.pyc	8071	0a4259ba854c24186f2ce61d85883b4a
@@ -224,5 +224,5 @@
 sounds/ding.wav	80856	18e639792d3767436ac6955eb60e4f54
 doc/manual/en/simbriefResult.png	32136	c55b3f649ca19cbbef738feaee26d639
-library/mlx/checks.pyc	62721	3af0d317e94f7220e1ea224d43cfa4d8
+library/mlx/checks.pyc	62721	18a21eeaf1e699d8928877ea074e04fa
 doc/manual/en/student.png	27531	5cc3fbe19909e31ecf82b764d17a6766
 doc/manual/en/pirepViewer.png	25098	7c545e70b995ac0f9fcae93fe5d0e899
@@ -230,5 +230,5 @@
 library/gobject/constants.pyc	1957	2e9cdc605e7c449ef4fc23f56128acec
 doc/manual/hu/calloutsEditor.png	16026	fede870894a85e5d21ca16a026aa6a98
-library/mlx/xplane.pyc	67548	6ede9cf8fe1651636b499142797b4f6e
+library/mlx/xplane.pyc	67128	8e7c7ec2b3b222768fe77c418db1002e
 library/ssl.pyc	13785	d90c880699ecbedb3182f556b9733868
 library/tempfile.pyc	18526	e2cc2d63c29e15f20ee9325e790643a3
@@ -256,6 +256,6 @@
 locales/pt-PT.pak	7270	731a9c54bd2331f411a5a2976d1f3622
 library/encodings/iso8859_10.pyc	2693	5e6cc8f721486ddbc1c99da285e13191
-library/mlx/config.pyc	32932	2c787fa0d592ff65e6e890e45e7f4731
-library/atk.pyc	534	ce47437fcb9187bb74723200c98838fa
+library/mlx/config.pyc	33266	a7d9c1089d89b2eae06344b4eb62b515
+library/atk.pyc	534	696d668cfdc42d4ddb0973dec25e43af
 library/gio._gio.pyd	263168	acb8c95fdc391079bebdf7d8685b0dbc
 library/encodings/cp861.pyc	7868	c97a8970ce4d9f40cbafbea6576fbdca
@@ -269,5 +269,5 @@
 library/zlib1.dll	100352	d90dad5eea33a178bac56fff2847d4c2
 locales/en-GB.pak	6364	2a92f4fc905c2743129ccbcdf80d443a
-library/mlx/gui/delaycodes.pyc	13323	67bd0762b1242b4dae043546155187c2
+library/mlx/gui/delaycodes.pyc	13323	5d2e3c3064fdfc49404973b22a629130
 library/encodings/raw_unicode_escape.pyc	2048	8138045029da04bf45204ab756d1bcd4
 sounds/TOD.mp3	174707	92176d53d948fbfebd08c011b063179a
@@ -284,8 +284,8 @@
 locales/pt-BR.pak	7211	d0542b9b325ea58be590d021aeb7333d
 library/libexpat-1.dll	143096	701659d3689bf4a8265b669b7d774255
-library/mlx/gui/info.pyc	7374	7431efd8a70bb0b8f485f8ec758576a5
+library/mlx/gui/info.pyc	7374	a4e2d54b4f7acf65b29ff20393e5d2c8
 library/encodings/iso8859_6.pyc	2723	c8f9aa14a6a2ebf05d977317114bc65d
 library/libpango-1.0-0.dll	333729	5a14efd93ee27cfe960220fe4a904911
-library/mlx/gui/gui.pyc	64705	83d22920b5e0b2433d399ba0c91e09f9
+library/mlx/gui/gui.pyc	64506	1ef86c765984abf3a3ef6f4f39a12b36
 library/stat.pyc	2503	d3b6dc7a54e705219f04d0be75a212de
 locales/ru.pak	10392	1b66f03dd656a2433ce643d0259fca6f
@@ -293,5 +293,5 @@
 locales/sr.pak	10790	fd63b700458a187aca8dde86c160a059
 doc/manual/hu/registration.png	31260	877f209cc012ce6b3335368276babcc6
-library/gobject/_gobject.pyc	573	5692421648da2f24e72d0dd23cddd9c2
+library/gobject/_gobject.pyc	573	9c208b5682178410d144235e4e0dc566
 libcef.dll	38585344	4dfb8a77f35c41bdbe8469877d4af853
 library/encodings/utf_7.pyc	1747	2beeb059236527197d6c640396476ce8
@@ -306,14 +306,14 @@
 doc/manual/hu/monitorWindow.png	21499	c8296e51e14588ac5b037b4832161dfc
 library/pangocairo.pyd	17920	5fc69a7d29a6d3127710c64de440daa4
-library/pangocairo.pyc	555	c9b1bfcfc52d98e171d8aef36d276bb1
+library/pangocairo.pyc	555	28af83fc19cded4fc98ec58484387a76
 library/zipfile.pyc	37345	568c6ee7e0404625f47248340afb4524
 locales/it.pak	7188	10ae10d8bfcffbfa1160574134e14edb
 doc/manual/en/acarsTab.png	198944	3ec162b7e6b077ab62d673c335929fb3
-library/mlx/rpccommon.pyc	3956	e6db84bdf8a987dc7c35294673ecfb1d
+library/mlx/rpccommon.pyc	3956	5ff33f58a6bee5a753dde2421cf938b2
 doc/manual/hu/helpTab.png	29126	88f236f84b1b520c60653f4665fd10e2
 library/sre.pyc	499	92bb633daa0bab6550ec0e3677673b5b
 library/tokenize.pyc	13565	354d02cd79df187a28c1851a1e3bad96
 library/win32con.pyc	140797	84d2d064066cfbcc219230f7e9c6e0b0
-library/mlx/gui/flight.pyc	183734	9e63c9c96171c2df91ce7e36f98da1e9
+library/mlx/gui/flight.pyc	182603	683c1e711e9614a6bdb7e6fcb840989e
 library/xmlrpclib.pyc	40724	d4f819f9199ea21236a74c967e335c43
 library/lib/gtk-2.0/2.10.0/engines/libwimp.dll	97984	a5bbbe46e1363aba9020a76f2d58e9d6
@@ -328,26 +328,26 @@
 locales/fi.pak	7098	70c7e2fb26c7abf09cb0f9972fb6c93a
 doc/manual/en/monitorWindow.png	20886	42e08d10c758e21209c4c021f391dee7
-library/_hashlib.pyc	549	9a5d5dc1c1e02eddb61723be3c81d39b
+library/_hashlib.pyc	549	1165d901defce2ba71812217e87d6f91
 library/copy.pyc	11674	30d1745c5e38ab170f8a0486fbebf305
 locales/et.pak	6856	18a0a857e46c28b7f1cd8ff639a24aec
 library/unittest/result.pyc	7444	aefbb3cc79c0ff17787ce84faed7f5e8
-library/mlx/gui/__init__.pyc	107	3494fc6a671a7b8a9dc72ea93948ae52
-library/mlx/pirep.pyc	11862	77ce612c43f8356f164f2d6dbba54071
+library/mlx/gui/__init__.pyc	107	22f268cac1c5be2f3a058810b6caead3
+library/mlx/pirep.pyc	11862	8590e401f3d6a84091913b6e4d390318
 library/json/scanner.pyc	2169	e19ee185b7c79ab5cc433b39fcd33faa
 library/traceback.pyc	11223	50ace5c2c6c040a923082442da94cd78
-library/mlx/flight.pyc	21771	942d1b3cc815f1775d7829e7d5986d6d
+library/mlx/flight.pyc	21369	025c6f2183b19adb20e604a1cda0366b
 library/urllib2.pyc	43566	7eb57ea0dcd1086d1d9073a5cefb0903
 library/encodings/mac_farsi.pyc	2659	df751a61510129a25f7a43ae3aace4f7
 library/encodings/iso2022_jp_3.pyc	1699	ee1c3aa11bbe19eeb4deafa238563133
 library/cefpython3/__init__.pyc	556	38a652a0209e49e323bee4dd54a018af
-library/mlx/common.pyc	444	6befa042b541293b90ca3b7caf281e6d
+library/mlx/common.pyc	444	81a72ceff029e4be88de252226d0f2b4
 doc/manual/en/simbriefSetup.png	30414	9788762f9a23ffd71a66cbd90a23f13b
 library/ctypes/__init__.pyc	18846	2bd183962453ae93d6887b303d3fd338
-library/mlx/acars.pyc	2352	91494421b7612bb60560eecc985d5aab
+library/mlx/acars.pyc	2352	9396f366c1d2958204ceadf4e5b4eb7a
 library/encodings/cp865.pyc	7868	7d40a7ba053ac23339218be8799e5397
 locales/bn.pak	14431	f402d363b8a07649b6787b745434daf7
 sounds/taps.mp3	16614	d4a019c7e9342ae329aee6932d6a43c3
 library/markupbase.pyc	9010	b33ff430e9b1adba3d540b5394ff289a
-library/cairo/_cairo.pyc	561	01892a78d8cdbfcfc71fb98ea17f8f08
+library/cairo/_cairo.pyc	561	5f0ebf0e8ff791c32ffb875ada20d672
 locales/te.pak	16110	c3af85e60b78273a93970cf8805ded04
 library/lxml/cssselect.pyc	3861	2e693f0c25ab04b1d130646cddd4e081
@@ -359,5 +359,5 @@
 library/winerror.pyc	112982	4986a8f2df094dddedd12c9fddf4966d
 library/encodings/cp775.pyc	7888	25bf7dd514dff294aa02d5119399b2b7
-library/mlx/fsuipc.pyc	75964	d5345164190acf18b2bb8a291415ff55
+library/mlx/fsuipc.pyc	75964	7ccb88cac4ea838538647400b3b2a0ae
 library/xml/sax/__init__.pyc	3579	c78222ad1fd4f3dbdea06666fe74e84e
 doc/manual/en/connect.png	29728	191520526caf0fa58efcd97d597c9247
@@ -365,5 +365,5 @@
 library/libgdk-win32-2.0-0.dll	931390	a2b46daac3d4140efdf86429f7aea476
 doc/manual/hu/pendingFlights.png	20945	2ce8d177aea079b21582704e38c68371
-library/mlx/gui/common.pyc	20998	c4a79324478fadd4754707e1cca0b38a
+library/mlx/gui/common.pyc	20876	45e8cc2a1c41ba7091e7845fc51fbd0a
 library/dummy_threading.pyc	1265	5ab5c897721aeb346b5bccb84066c5bd
 doc/manual/hu/index.html	67085	0008be8482043be070db2c2c4f2c3046
@@ -379,10 +379,10 @@
 library/encodings/iso8859_16.pyc	2695	85e819a29dec2b601ce978dcd5a040fc
 sounds/cpt_takeoff.mp3	8255	254edcf79b8b3752d1a7c191c57f615a
-library/bz2.pyc	534	3fc098070fd71f141def09bf7e420ab1
+library/bz2.pyc	534	7b01882aa537ced5392bfd6a05c92bee
 library/email/utils.pyc	8840	a7be428df6fddee6121cfce55382d1f8
 doc/manual/en/prefsGeneral.png	25633	a5ef76b874f4ad5384b519a11bdf9c47
 library/encodings/iso2022_jp_2.pyc	1699	4b917caa926e5779176612409c66be39
 library/_ssl.pyd	720896	90826a140137efd0d806038828e16f8e
-library/pango.pyc	540	21cec340f978ffee00f37a02d495d61b
+library/pango.pyc	540	1c0e90e57415e1e74c0b496cce34a7f5
 doc/manual/en/flightBooking.png	37170	266bd9c93de3a1449b51854a05b98366
 library/glib/__init__.pyc	187	d44c8c2772b263a36726ac0dcfc04b42
@@ -390,5 +390,5 @@
 library/libgobject-2.0-0.dll	341594	356d697647a480562c4e2e921b13f8ed
 doc/manual/hu/acceptedFlights.png	43527	6c52b86433a227efed500f27769aef97
-mlxupdate.exe	19456	1d7bb33aea239a041e1ae6a9ea67445a
+mlxupdate.exe	19456	9b19d587509c61dcc52b91a871d0f675
 library/email/errors.pyc	3229	cdb78ab237e195ad69f059128bc03b1d
 library/linecache.pyc	3091	666e6f81b0ea9a7637f8068493f738d5
@@ -401,5 +401,5 @@
 library/getopt.pyc	6454	8f8cd6763f5339988d157d153c910bf5
 library/encodings/cp857.pyc	7611	1b46c8959ac097b73e1c680d464cdc32
-library/_ssl.pyc	537	d4812f8f7f922f63cdc1340e179b7f84
+library/_ssl.pyc	537	244c691a5e5f65839b6a8dcba79e2e88
 library/os2emxpath.pyc	4312	0c35794eeb4739ebb4eb28b9a1daf0ca
 library/pprint.pyc	9852	6b4724e14285c257116655b1d4ba6db1
@@ -411,9 +411,9 @@
 library/ntpath.pyc	11407	533c9331a1b72cc80dd3f88145ba4466
 library/json/__init__.pyc	12974	d7e08774d4fee83dd2a6d3868855a800
-library/mlx/gui/checklist.pyc	12279	555775aaed42b3d0687e1b0f501a9f61
+library/mlx/gui/checklist.pyc	12279	0d648433bc36dd90e70dbd27c094733a
 locales/de.pak	7420	18ba99b07536017ed8b87cb4f77aee1c
 library/encodings/cp1252.pyc	2676	b4c43cc72650c911cf3654dbaf565df9
 library/unicodedata.pyd	688128	c856c31a03dc892e4f2aee93d0bfee44
-library/unicodedata.pyc	558	f8c55c5d1ca43879e328efe26742ccec
+library/unicodedata.pyc	558	1d02ca413783825aeb8e6b3976f0add4
 library/multiprocessing/sharedctypes.pyc	8069	0b5a57d8a8a1562a9d562edabd5065c1
 library/encodings/cp1256.pyc	2675	c1bf26ed9c9b5ee0eec495138993cffb
@@ -422,11 +422,11 @@
 logo.png	69816	4a7517b22cfd75cc9c15e3fc1b7ebeec
 library/libpangoft2-1.0-0.dll	815421	1dbfead06e26edb81f0849490210e3ff
-library/mlx/util.pyc	5026	e28805b72a8df264fd03df201653c221
+library/mlx/util.pyc	5026	ee65b78fc430008ce301eee1155d85b1
 doc/manual/hu/student.png	28297	1e72329a3a463d4c50f1b9d91c3aeacc
 library/_LWPCookieJar.pyc	5440	3782ae675165b232a3f78608ac2dbccd
 library/libfontconfig-1.dll	279059	dd583bedc5efe7bbd21a8ef107dec88d
 library/_strptime.pyc	14347	ad17a449b54061177a080e3a21507a39
-library/mlx/singleton.pyc	9184	9eec2ed5b230e043afc56592fb13a684
-library/mlx/airports.pyc	4350	c91293cee62158e0b57827f7da2b0b3a
+library/mlx/singleton.pyc	9184	3b71000d428959ab355db2658cea9557
+library/mlx/airports.pyc	4350	95dddcb84b0fb7dc4342c69a45ab20b6
 library/Queue.pyc	8848	4a5b98abcb80aaf94e6de1eb41ec66fa
 sounds/notify.wav	119384	108025b17f67e61946df5d7fbf713cdb
@@ -443,6 +443,6 @@
 doc/manual/en/flightBookingRegular.png	10987	46a0cd0f77d8f4c286196752c6cf1b37
 library/encodings/palmos.pyc	2876	9284ad53dcfd82dfae0a79923b1cf91d
-library/mlx/web.pyc	50085	0d3f05478f11de55def73551a5803590
-library/mlx/gui/gates.pyc	5635	ea478376f306ce9d6d0ed2e759407c00
+library/mlx/web.pyc	49987	6f9d6f859938b4e4f3e5c4004e6e5194
+library/mlx/gui/gates.pyc	5635	541e695d5acf90721e523c5513fe7d0d
 library/gobject/propertyhelper.pyc	8878	cc3598dab17d31ff46a6dee669ccb5ed
 library/intl.dll	152489	eb2d4c4d4a527bc88a69a16cc99afcf5
@@ -465,24 +465,24 @@
 library/multiprocessing/heap.pyc	6104	71b50576901ea09d8e4666a9a80724d3
 library/encodings/unicode_escape.pyc	1996	32990583f1caf874e556087da7b92971
-library/_multiprocessing.pyc	573	85faa60bc8d8b3d69345f10292e39005
+library/_multiprocessing.pyc	573	75d775fe0fe2d2285eb0f31de28bacc4
 doc/manual/hu/logTab.png	28908	25b9aceb760189c177a5562c0cfa2a04
-library/win32event.pyc	555	9d23ca715afe49593db8c754a663114d
-library/win32file.pyc	552	c3ed345f1e6540e4f2a5991b293595ed
+library/win32event.pyc	555	d92a7808ed1848a5f745893510cb9249
+library/win32file.pyc	552	3b5fe9c088871cf707f54153c8680507
 library/_multiprocessing.pyd	28672	edd174951a2233941c8d2064c0f69a68
 library/encodings/shift_jis_2004.pyc	1710	f8bb22a8b02dba2b66b7f77122c98fd6
 library/encodings/cp856.pyc	2701	8b6649490089bedd87e9b8c56985f6b3
 locales/hu.pak	7647	7a37ba9f9113e4f7e9de5b5b9643a48c
-library/mlx/gui/weighthelp.pyc	14211	e3f70a4883c77f65d41a06b3b04500e2
+library/mlx/gui/weighthelp.pyc	13179	09924037c8e067c96c1e7acd88671ed1
 library/encodings/cp850.pyc	7621	20d776af743fa7acf090fbd575eea143
 library/gio/__init__.pyc	809	bc9332556e93183a58be5c10cba18557
 doc/manual/hu/debugLogTab.png	32687	9280a72a7c4d4dc5d93a133410505402
 library/weakref.pyc	13028	5d1c14275f47e8cf6d40bc6877fde976
-library/mlx/fs.pyc	11967	10fe7e01a3569b609698be97ab21dd5b
+library/mlx/fs.pyc	11967	1ee8179acadd281b9e9141fa241192bd
 locales/he.pak	8198	2486731ee9bedc244d41143a2741775f
 library/nturl2path.pyc	1755	7835082f2dd6806f99cc25bed13ff7dc
 library/email/message.pyc	27764	493826f529d17f5a21080a4c98b49369
-library/mlx/gui/pirep.pyc	41544	e7917f01c2960e4e75f9c2100c2c099b
+library/mlx/gui/pirep.pyc	41544	35d195acdae021797e1630406d501a43
 library/mimetypes.pyc	17806	927ce6a7079707aaee925e855ed23454
-library/mlx/gui/faultexplain.pyc	10129	fe284c4445ac283cdbce34e81522e8ca
+library/mlx/gui/faultexplain.pyc	10129	f21b2f7b30d736b986b96356587c4810
 sounds/F70taxi.mp3	154854	51332dc691d3519355f61ed06c959d8d
 doc/manual/hu/statusIcon1.png	6920	614cde237a5b4e2678ed15d9cd01088e
@@ -500,5 +500,5 @@
 library/libgdk_pixbuf-2.0-0.dll	285194	e4c64b0e7e4c6606f3973a16c0c1ee84
 library/encodings/big5.pyc	1630	a21b45d3e487bf09f40a08448040c97d
-library/mlx/gui/update.pyc	11482	e53b2ce9e7650dc6ba852436d111b318
+library/mlx/gui/update.pyc	11482	0253f16c44bb29de314f25c9a5f57e64
 library/encodings/cp1250.pyc	2676	c92e287a2aa6a1c924df287d826aa3b7
 doc/manual/en/gatesTab.png	31516	7078e7c5adff9ee39816d2c3855d8523
@@ -508,12 +508,12 @@
 locales/vi.pak	7990	f0d8ddd9bdabaef79a9c92f3fd021f25
 library/encodings/cp862.pyc	8003	261df6dd1a6e5ad90a83dfc739a25e0a
-library/mlx/gui/statusicon.pyc	5616	03e079307c1f83f36284e1b32887b28e
+library/mlx/gui/statusicon.pyc	5616	72e7f1f435bced8727eecc708d69de12
 library/lxml/__init__.pyc	708	4e6d5e156fb2fe6a8103dd02a1037634
 library/encodings/cp863.pyc	7868	fc7ff06dab536b93c68fcb8e7bac713f
-library/mlx/gui/flightlist.pyc	27053	31a0362eefea63d7c0d561b2630e1db2
+library/mlx/gui/flightlist.pyc	27053	b046e01f173832414d29324cf463731e
 library/codecs.pyc	34722	339dc90c17d548887dbcf1bbbcae5d5b
 doc/manual/hu/gateSelection.png	31891	937dc56457188df05056c0f9f3a53975
 library/cmd.pyc	13512	808f813d5e354b7073a1356e44c7b554
-library/mlx/rpc.pyc	25576	d1676892ee7b5ba7eb78fabc6a0d95ad
+library/mlx/rpc.pyc	24596	1c6827ff7711034037cc8755f8dca8af
 locales/ko.pak	7278	41ecc83d5eef5887c7c288b3b570c7b4
 library/jsonrpclib/history.pyc	1662	2e0e6d5c26e2794085d62feb524e4542
@@ -536,17 +536,17 @@
 library/_socket.pyd	38400	5d273be76603399e88cf57f2605004bf
 library/plistlib.pyc	18067	d8d36573e80bfdde7c73e47828f6e710
-library/_socket.pyc	546	c1e4db0a21a801b9b80f832160a478f0
+library/_socket.pyc	546	e20437226441ba8d2569ed7e3a281b50
 library/encodings/hex_codec.pyc	3520	a8b8d5b7c8810379c7007bcbc253951c
-library/mlx/sound.pyc	12511	0140b1775a6b22439d9b493788a4a2ff
-library/glib/_glib.pyc	555	99e673a25af3353b819a0075fb815ad5
-library/win32api.pyc	549	f4736268be4f2daada705d764dafc4f7
+library/mlx/sound.pyc	12511	1cb833d4bb47c63572bef0fc1e0a675d
+library/glib/_glib.pyc	555	964f3f75bc28dfdca564030e97b8ea1a
+library/win32api.pyc	549	7feab59155c5af902ecbe162cdd768b5
 library/encodings/iso8859_13.pyc	2696	f901ae0bbcfbb78f0c1783e89b2e2dc5
 doc/manual/en/index.html	59898	7a24695cf320678b5995a390ad369d4c
-library/mlx/gui/callouts.pyc	16060	7a3055f313e693779e9d2df22bb7568a
+library/mlx/gui/callouts.pyc	16060	2e120c6e554d8d68459a52791e374789
 library/encodings/iso8859_15.pyc	2693	b892f358bbc25ae9d3824be158aabe28
 doc/manual/en/flightBookingVIP.png	11944	49f18078475994d8268bcf7dadc725dd
 doc/manual/hu/prefsMessages.png	22980	6e60ec51305e95e5d057c0dd82b69460
 library/xml/parsers/__init__.pyc	294	83f6a77ed8cd962b3c75c4779dc557ac
-locale/en/LC_MESSAGES/mlx.mo	84747	68a4b4efba3da4c128ad05027d9d2d8a
+locale/en/LC_MESSAGES/mlx.mo	84371	5900f6fe7e5fdb4fabfa99a2c751c9d1
 library/_abcoll.pyc	19891	a5c1881934f1533c22b22b9317ac1d68
 library/encodings/iso8859_11.pyc	2787	a31e6d0d34e35259d7183cc9437eacca
@@ -555,6 +555,6 @@
 locales/da.pak	6631	1bf496bcde38f3f2899cd0fab6986959
 library/encodings/mac_latin2.pyc	4717	564dbaf5c296a147203eb821dc2466ba
-library/mlx/__init__.pyc	103	877b8715b7e58440a0e8f212cab6035e
-library/mlx/i18n.pyc	1972	fe45816e49cf5e380bc39942a9dfa875
+library/mlx/__init__.pyc	103	029f80bd80f880e6ca70ef4ba46f7d06
+library/mlx/i18n.pyc	1972	141a57905a2597e5ced25866d032d3a4
 library/xml/sax/saxutils.pyc	12382	32ed045b3b520234ebea6a508a6569fe
 locales/sw.pak	7078	5406f21a67934bbf0e6c633d2ca573f9
@@ -562,5 +562,5 @@
 doc/manual/hu/gatesTab.png	32840	316fb040e358c79b2a846b1eed4651c6
 library/webbrowser.pyc	18138	c85009edebad6d278fe786fec10ebbbe
-library/mlx/pyuipc_sim.pyc	57371	956c32d114beb4e05f81a39929ed7e8d
+library/mlx/pyuipc_sim.pyc	57371	aa5ce6859748277fc6268bda9c88c115
 library/encodings/cp875.pyc	2636	c72faa5d1cb6105ae81c971448fea479
 library/dis.pyc	6068	3934ab23d64f3da393305b19df0f1fd0
@@ -575,5 +575,5 @@
 locales/sk.pak	7622	dfdff6206e5a79aef8b46d0d9c2a8367
 library/select.pyd	11776	d90bf525f9f6c9c3aa6532fa6e569b4f
-library/pyuipc.pyc	543	bd02fb3882060c583980f63884e6f82e
+library/pyuipc.pyc	543	9cfd3ec36a463e39df7baa62f6b971e8
 library/locale.pyc	48754	a51d20267132acc6bc66ac6252cf870f
 doc/manual/en/logTab.png	28120	b92cf63420e59e0c48da4f0b3baae040
@@ -585,5 +585,5 @@
 library/distutils/errors.pyc	5885	fbeaddf5d59ea781ec63197dd950aa89
 library/logging/__init__.pyc	54813	7bcdf2e8da474f5e94d8e499f6fc3ed4
-runmlx.exe	64000	3d56abfb42aab80561691e290df1fcbd
+runmlx.exe	64000	010b7fa1b6da6f77072342815123917e
 locales/zh-CN.pak	6386	36e1df83611aef6fbfeeafd067dd4241
 locales/hi.pak	13321	4b6b27ab4421c94685fc09051a2339f8
@@ -603,3 +603,3 @@
 library/unittest/main.pyc	7701	82258a486f5133466c9cf10323814fbf
 library/encodings/iso2022_jp_ext.pyc	1715	97eda1c1468f65445951b0bf23a89570
-library/mlx/watchdog.pyc	3957	4b6c34d79e730066e8af7cf71689f9ad
+library/mlx/watchdog.pyc	3957	8dd7d882e0716f1c6c9054e5009bcc1e
Index: dcdatagen.py
===================================================================
--- dcdatagen.py	(revision 599)
+++ dcdatagen.py	(revision 919)
@@ -764,12 +764,12 @@
     numLines = len(lines)
     if numLines==0:
-        print >> file, "msgstr \"\""
+        print("msgstr \"\"", file=file)
     elif numLines==1:
-        print >> file, "msgstr \"%s\"" % (lines[0])
+        print("msgstr \"%s\"" % (lines[0]), file=file)
     else:
-        print >> file, "msgstr \"\""
+        print("msgstr \"\"", file=file)
         for i in range(0, numLines):
-            print >> file, "\"%s%s\"" % (lines[i], "" if i==(numLines-1) else "\\n")
-    print >> file
+            print("\"%s%s\"" % (lines[i], "" if i==(numLines-1) else "\\n"), file=file)
+    print(file=file)
 
 #-------------------------------------------------------------------------------
@@ -789,8 +789,8 @@
             poFile = open(poPath, "wt")
             poFiles.append(poFile)
-            print >> poFile, "msgid \"\""
-            print >> poFile, "msgstr \"\""
-            print >> poFile, "\"Content-Type: text/plain; charset=utf-8\\n\""
-            print >> poFile, "\"Content-Transfer-Encoding: 8bit\\n\""
+            print("msgid \"\"", file=poFile)
+            print("msgstr \"\"", file=poFile)
+            print("\"Content-Type: text/plain; charset=utf-8\\n\"", file=poFile)
+            print("\"Content-Transfer-Encoding: 8bit\\n\"", file=poFile)
 
         (baseData, headings, headingFlags, rows) = table
@@ -801,5 +801,5 @@
             for j in range(0, numLanguages):
                 poFile = poFiles[j]
-                print >> poFile, "msgid \"%sheading%d\"" % (poPrefix, i)
+                print("msgid \"%sheading%d\"" % (poPrefix, i), file=poFile)
                 generateMsgStr(poFile, heading[j])
 
@@ -810,5 +810,5 @@
                 for i in range(0, numLanguages):
                     poFile = poFiles[i]
-                    print >> poFile, "msgid \"%srow%d\"" % (poPrefix, rowIndex)
+                    print("msgid \"%srow%d\"" % (poPrefix, rowIndex), file=poFile)
                     generateMsgStr(poFile, columns[i])
             elif type==DELAYCODE:
@@ -819,20 +819,20 @@
                             if column[i]:
                                 poFile = poFiles[i]
-                                print >> poFile, "msgid \"%srow%d_col%d\"" % \
-                                  (poPrefix, rowIndex, columnIndex)
+                                print("msgid \"%srow%d_col%d\"" % \
+                                  (poPrefix, rowIndex, columnIndex), file=poFile)
                                 generateMsgStr(poFile, column[i])
                     columnIndex += 1
             rowIndex += 1
 
-        print >> dcdata, "import mlx.const as const"
-        print >> dcdata, "from mlx.i18n import xstr"
-        print >> dcdata
-        print >> dcdata, "CAPTION = 1"
-        print >> dcdata, "DELAYCODE = 2"
-        print >> dcdata
+        print("import mlx.const as const", file=dcdata)
+        print("from mlx.i18n import xstr", file=dcdata)
+        print(file=dcdata)
+        print("CAPTION = 1", file=dcdata)
+        print("DELAYCODE = 2", file=dcdata)
+        print(file=dcdata)
 
         tableMask = 1
         for i in range(0, len(tablePrefixes)):
-            print >> dcdata, "_%s_code2meaning = {" % (tablePrefixes[i],)
+            print("_%s_code2meaning = {" % (tablePrefixes[i],), file=dcdata)
 
             columnIndexes = []
@@ -850,25 +850,25 @@
 
                 if type==DELAYCODE:
-                    print >> dcdata, "    \"%s\": \"%s\"," % \
-                      (str(columns[codeIndex]).strip(), columns[meaningIndex][0].replace("\n", ""))
-
-            print >> dcdata, "}"
-            print >> dcdata
+                    print("    \"%s\": \"%s\"," % \
+                      (str(columns[codeIndex]).strip(), columns[meaningIndex][0].replace("\n", "")), file=dcdata)
+
+            print("}", file=dcdata)
+            print(file=dcdata)
 
             tableMask <<= 1
 
-        print >> dcdata, "def _extract(table, row):"
-        print >> dcdata, "    code = row[0].strip()"
-        print >> dcdata, "    meaning = table[code] if code in table else None"
-        print >> dcdata, "    return code + ((\" (\" + meaning + \")\") if meaning else \"\")"
-        print >> dcdata
+        print("def _extract(table, row):", file=dcdata)
+        print("    code = row[0].strip()", file=dcdata)
+        print("    meaning = table[code] if code in table else None", file=dcdata)
+        print("    return code + ((\" (\" + meaning + \")\") if meaning else \"\")", file=dcdata)
+        print(file=dcdata)
 
         tableMask = 1
         for i in range(0, len(tablePrefixes)):
 
-            print >> dcdata, "_%s_data = (" % (tablePrefixes[i],)
-            print >> dcdata, "    lambda row: _extract(_%s_code2meaning, row)," % \
-              (tablePrefixes[i],)
-            print >> dcdata, "    [",
+            print("_%s_data = (" % (tablePrefixes[i],), file=dcdata)
+            print("    lambda row: _extract(_%s_code2meaning, row)," % \
+              (tablePrefixes[i],), file=dcdata)
+            print("    [", end=' ', file=dcdata)
 
             columnIndexes = []
@@ -876,11 +876,11 @@
                 if ( (headingFlags[j]&tableMask)==tableMask ):
                     if columnIndexes:
-                        print >> dcdata, ",",
-                    print >> dcdata, "xstr(\"%sheading%d\")" % (poPrefix, j),
+                        print(",", end=' ', file=dcdata)
+                    print("xstr(\"%sheading%d\")" % (poPrefix, j), end=' ', file=dcdata)
                     columnIndexes.append(j)
 
-            print >> dcdata, "],"
-
-            print >> dcdata, "    ["
+            print("],", file=dcdata)
+
+            print("    [", file=dcdata)
 
             rowIndex = 0
@@ -891,43 +891,43 @@
 
                 if type==CAPTION:
-                    print >> dcdata, "        (CAPTION, xstr(\"%srow%d\"))," % \
-                      (poPrefix, rowIndex)
+                    print("        (CAPTION, xstr(\"%srow%d\"))," % \
+                      (poPrefix, rowIndex), file=dcdata)
                 elif type==DELAYCODE:
-                    print >> dcdata, "        (DELAYCODE, ["
+                    print("        (DELAYCODE, [", file=dcdata)
                     for j in columnIndexes:
                         column = columns[j]
                         if j!=columnIndexes[0]:
-                            print >> dcdata, ","
+                            print(",", file=dcdata)
                         if isinstance(column, list):
                             if column[0]:
-                                print >> dcdata, "            xstr(\"%srow%d_col%d\")"  % \
-                                (poPrefix, rowIndex, j),
+                                print("            xstr(\"%srow%d_col%d\")"  % \
+                                (poPrefix, rowIndex, j), end=' ', file=dcdata)
                             else:
-                                print >> dcdata, "            \"\"",
+                                print("            \"\"", end=' ', file=dcdata)
                         else:
-                            print >> dcdata, "            \"%s\""  % \
-                              (column,),
-                    print >> dcdata, "] ),"
+                            print("            \"%s\""  % \
+                              (column,), end=' ', file=dcdata)
+                    print("] ),", file=dcdata)
                 rowIndex += 1
 
-            print >> dcdata, "    ]"
-
-            print >> dcdata, ")"
-            print >> dcdata
+            print("    ]", file=dcdata)
+
+            print(")", file=dcdata)
+            print(file=dcdata)
 
             tableMask <<= 1
 
-        print >> dcdata, "def getTable(aircraftType):"
+        print("def getTable(aircraftType):", file=dcdata)
         first = True
         for i in range(0, len(tablePrefixes)):
             tablePrefix = tablePrefixes[i]
             for typeSuffix in typeGroups[i]:
-                print >> dcdata, "    %s aircraftType==const.AIRCRAFT_%s:" % \
-                  ("if" if first else "elif", typeSuffix)
-                print >> dcdata, "        return _%s_data" % (tablePrefix,)
+                print("    %s aircraftType==const.AIRCRAFT_%s:" % \
+                  ("if" if first else "elif", typeSuffix), file=dcdata)
+                print("        return _%s_data" % (tablePrefix,), file=dcdata)
                 first = False
 
-        print >> dcdata, "    else:"
-        print >> dcdata, "        return None"
+        print("    else:", file=dcdata)
+        print("        return None", file=dcdata)
     finally:
         for poFile in poFiles:
Index: diffdist.py
===================================================================
--- diffdist.py	(revision 310)
+++ diffdist.py	(revision 919)
@@ -18,5 +18,5 @@
 def usage():
     """Print a usage message."""
-    print "Usage: %s <old dist dir> <new dist dir>" % (sys.argv[0],)
+    print("Usage: %s <old dist dir> <new dist dir>" % (sys.argv[0],))
 
 #--------------------------------------------------------------------------
@@ -62,11 +62,11 @@
 
                 if numDiffs<=4:
-                    print "File %s is considered to be the same in both versions with %d changes" % \
-                          (path, numDiffs)
+                    print("File %s is considered to be the same in both versions with %d changes" % \
+                          (path, numDiffs))
                     finalManifest.addFile(path, oldSize, oldSum)
                     copyOld = True
 
         if not copyOld:
-            print ">>> File %s is being copied" % (path,)
+            print(">>> File %s is being copied" % (path,))
             tarFile.add(os.path.join(newDirectory, path), arcname = path)
             
@@ -74,5 +74,5 @@
     with os.fdopen(fd, "wt") as f:
         finalManifest.writeInto(f)
-    os.chmod(path, 0644)
+    os.chmod(path, 0o644)
     tarFile.add(path, arcname = manifestName)
     tarFile.close()
@@ -80,10 +80,10 @@
     os.remove(path)
 
-    print
-    print "%s created" % (tarName,)
+    print()
+    print("%s created" % (tarName,))
     if removed:
-        print
-        print "Files to remove:"
-        print
+        print()
+        print("Files to remove:")
+        print()
         for path in removed:
-            print "  ", path
+            print("  ", path)
Index: docker/context/setup.sh
===================================================================
--- docker/context/setup.sh	(revision 918)
+++ docker/context/setup.sh	(revision 916)
@@ -26,5 +26,5 @@
 
 echo "exit" | wine cmd
-wine msiexec /i python-2.7.15.msi
+wine msiexec /i python-2.7.2.msi
 wine msiexec /i cefpython3-31.2.py2.7-win32.msi
 wine msiexec /i pygtk-all-in-one-2.24.1.win32-py2.7.msi
@@ -41,4 +41,9 @@
 tar xzf Python27.extra.tar.gz -C "${cpythondir}"
 
+touch -d "2015-02-22 14:50:07" "${cpythondir}/Lib/site-packages/win32/lib/win32con.py"
+touch -d "2015-02-22 14:50:07" "${cpythondir}/Lib/site-packages/win32/lib/winerror.py"
+
+cp python27.dll WINHTTP.dll "${cwinsysdir}"
+
 echo
 echo "Removing extra packages..."
Index: locale/en/mlx.po
===================================================================
--- locale/en/mlx.po	(revision 899)
+++ locale/en/mlx.po	(revision 869)
@@ -70,7 +70,4 @@
 msgstr "British Aerospace 146-200"
 
-msgid "aircraft_il62"
-msgstr "Ilyushin Il-62"
-
 msgid "aircraft_family_b737ng"
 msgstr "Boeing 737NG"
@@ -105,7 +102,4 @@
 msgid "aircraft_family_b462"
 msgstr "British Aerospace 146-200"
-
-msgid "aircraft_family_il62"
-msgstr "Ilyushin Il-62"
 
 msgid "file_filter_all"
@@ -642,15 +636,9 @@
 "You can also query the ZFW reported by the simulator."
 
-msgid "payload_cockpit_crew"
-msgstr "Cockpit c_rew:"
-
-msgid "payload_cockpit_crew_tooltip"
-msgstr "The number of the cockpit crew members on your flight."
-
-msgid "payload_cabin_crew"
-msgstr "Cabin cr_ew:"
-
-msgid "payload_cabin_crew_tooltip"
-msgstr "The number of the cabin crew members on your flight."
+msgid "payload_crew"
+msgstr "C_rew:"
+
+msgid "payload_crew_tooltip"
+msgstr "The number of the crew members on your flight."
 
 msgid "payload_pax"
@@ -1506,9 +1494,6 @@
 "<b><span foreground=\"orange\">yellow</span></b>."
 
-msgid "weighthelp_cockpit_crew"
-msgstr "Cockpit crew (%s):"
-
-msgid "weighthelp_cabin_crew"
-msgstr "Cabin crew (%s):"
+msgid "weighthelp_crew"
+msgstr "Crew (%s):"
 
 msgid "weighthelp_pax"
Index: locale/hu/mlx.po
===================================================================
--- locale/hu/mlx.po	(revision 899)
+++ locale/hu/mlx.po	(revision 870)
@@ -70,7 +70,4 @@
 msgstr "British Aerospace 146-200"
 
-msgid "aircraft_il62"
-msgstr "Iljusin Il-62"
-
 msgid "aircraft_family_b737ng"
 msgstr "Boeing 737NG"
@@ -105,7 +102,4 @@
 msgid "aircraft_family_b462"
 msgstr "British Aerospace 146-200"
-
-msgid "aircraft_family_il62"
-msgstr "Iljusin Il-62"
 
 msgid "file_filter_all"
@@ -646,15 +640,9 @@
 "Azt is ellenőrizheted, hogy a szimulátor milyen ZFW-t jelent."
 
-msgid "payload_cockpit_crew"
-msgstr "_Pilóták:"
-
-msgid "payload_cockpit_crew_tooltip"
-msgstr "A pilóták létszáma."
-
-msgid "payload_cabin_crew"
-msgstr "_Utaskísérők:"
-
-msgid "payload_cabin_crew_tooltip"
-msgstr "A légiutaskísérők létszáma."
+msgid "payload_crew"
+msgstr "_Legénység:"
+
+msgid "payload_crew_tooltip"
+msgstr "A legénység létszáma."
 
 msgid "payload_pax"
@@ -1509,9 +1497,6 @@
 "<b><span foreground=\"orange\">sárga</span></b> színben olvasható."
 
-msgid "weighthelp_cockpit_crew"
-msgstr "Pilóták (%s):"
-
-msgid "weighthelp_cabin_crew"
-msgstr "Utaskísérők (%s):"
+msgid "weighthelp_crew"
+msgstr "Legénység (%s):"
 
 msgid "weighthelp_pax"
Index: setup.py
===================================================================
--- setup.py	(revision 916)
+++ setup.py	(revision 919)
@@ -99,8 +99,8 @@
                               ]))
 
-    print data_files
+    print(data_files)
 
     with open("mlx-common.nsh", "wt") as f:
-            print >>f, '!define MLX_VERSION "%s"' % (mlx.const.VERSION)
+            print('!define MLX_VERSION "%s"' % (mlx.const.VERSION), file=f)
             f.close()
 else:
@@ -145,4 +145,4 @@
     mlx.update.buildManifest(os.path.join(scriptdir, "dist"))
     with open(os.path.join(scriptdir, "dist", "Uninstall.conf"), "wt") as f:
-        print >> f, "StartMenuFolder=MAVA Logger X"
-        print >> f, "LinkName=MAVA Logger X"
+        print("StartMenuFolder=MAVA Logger X", file=f)
+        print("LinkName=MAVA Logger X", file=f)
Index: src/mlx/acars.py
===================================================================
--- src/mlx/acars.py	(revision 743)
+++ src/mlx/acars.py	(revision 919)
@@ -1,4 +1,4 @@
 
-import const
+from . import const
 
 #------------------------------------------------------------------------------
Index: src/mlx/acft.py
===================================================================
--- src/mlx/acft.py	(revision 917)
+++ src/mlx/acft.py	(revision 919)
@@ -1,9 +1,9 @@
 
-import const
-import gates
-import checks
-import fs
-from i18n import xstr
-import util
+from . import const
+from . import gates
+from . import checks
+from . import fs
+from .i18n import xstr
+from . import util
 
 import sys
@@ -97,7 +97,4 @@
 class Aircraft(object):
     """Base class for aircraft."""
-    dowCockpit = 2
-    dowCabin = 3
-
     @staticmethod
     def create(flight, bookedFlight):
@@ -128,7 +125,5 @@
         self._landingAntiIceLineID = None
 
-        self.cockpitCrewWeight = 85.0
-        self.cabinCrewWeight = 75.0
-        self.humanWeight = 84.0
+        self.humanWeight = 82.0
 
         self.initialClimbSpeedAltitude = 1500
@@ -313,5 +308,5 @@
               ("-" if value is None else "enabled" if value else "disabled",)
         elif dt!=DERATE_NONE:
-            print "mlx.acft.getDerateLine: invalid derate type: " + dt
+            print("mlx.acft.getDerateLine: invalid derate type: " + dt)
 
         return None
@@ -348,5 +343,5 @@
                                   self._aircraftState, aircraftState)
                 except:
-                    print >> sys.stderr, "Checker", checker, "failed"
+                    print("Checker", checker, "failed", file=sys.stderr)
                     traceback.print_exc()
 
@@ -356,5 +351,5 @@
             self._minVS = min(self._minVS, aircraftState.vs)
         except:
-            print >> sys.stderr, "Failed to handle the state"
+            print("Failed to handle the state", file=sys.stderr)
             traceback.print_exc()
         finally:
@@ -408,5 +403,5 @@
                     self._logQNH(aircraftState)
             elif newStage==const.STAGE_GOAROUND:
-                from logger import Logger
+                from .logger import Logger
                 self._flight.handleFault("goaround",
                                          aircraftState.timestamp,
@@ -834,8 +829,7 @@
 class B734(Boeing737CL):
     """Boeing 737-400 aircraft."""
-    dow = 35100
-
     def __init__(self, flight):
         super(B734, self).__init__(flight)
+        self.dow = 35100
         self.mtow = 62822
         self.mlw = 54885
@@ -1249,32 +1243,4 @@
         """Get the derate type for this type."""
         return DERATE_B462
-
-#---------------------------------------------------------------------------------------
-
-class IL62(Aircraft):
-    """Ilyushin IL-62 aircraft.
-
-    The aircraft type-specific values in the aircraft state have the following
-    structure:
-    - fuel: left, centre, right
-    - n1: left outer, left inner, right inner, right outer
-    - reverser: empty (the plane has no reversers)"""
-    dow = 69500
-
-    def __init__(self, flight):
-        super(B462, self).__init__(flight)
-        self.mtow = 165000
-        self.mlw = 165000
-        self.mzfw = 165000
-        self.gearSpeedLimit = 210
-        self.flapSpeedLimits = { 18 : 217,
-                                 24 : 180,
-                                 30 : 170,
-                                 33 : 150 }
-
-    @property
-    def derateType(self):
-        """Get the derate type for this type."""
-        return DERATE_NONE
 
 #---------------------------------------------------------------------------------------
@@ -1305,6 +1271,5 @@
              const.AIRCRAFT_T154  : T154,
              const.AIRCRAFT_YK40  : YK40,
-             const.AIRCRAFT_B462  : B462,
-             const.AIRCRAFT_IL62  : IL62 }
+             const.AIRCRAFT_B462  : B462 }
 
 #---------------------------------------------------------------------------------------
@@ -1316,62 +1281,50 @@
 #---------------------------------------------------------------------------------------
 
-def setupTypes(aircraftTypes):
-    """Setup the values in the given types using the info retrieved
-    from the server."""
-    for aircraftTypeInfo in aircraftTypes:
-        clazz = getClass(aircraftTypeInfo.aircraftType)
-
-        clazz.dow = aircraftTypeInfo.dow
-        clazz.dowCockpit = aircraftTypeInfo.dowCockpit
-        clazz.dowCabin = aircraftTypeInfo.dowCabin
-
-#---------------------------------------------------------------------------------------
-
 if __name__ == "__main__":
     value = SmoothedValue()
 
-    print "Adding 1, 12.0"
+    print("Adding 1, 12.0")
     value.add(1, 12.0)
-    print value.get()
-
-    print "Adding 1, 15.0"
+    print(value.get())
+
+    print("Adding 1, 15.0")
     value.add(1, 15.0)
-    print value.get()
-
-    print "Adding 2, 18.0"
+    print(value.get())
+
+    print("Adding 2, 18.0")
     value.add(2, 18.0)
-    print value.get()
-
-    print "Adding 2, 20.0"
+    print(value.get())
+
+    print("Adding 2, 20.0")
     value.add(2, 20.0)
-    print value.get()
-
-    print "Adding 5, 22.0"
+    print(value.get())
+
+    print("Adding 5, 22.0")
     value.add(5, 22.0)
-    print value.get()
-
-    print "Adding 5, 25.0"
+    print(value.get())
+
+    print("Adding 5, 25.0")
     value.add(5, 25.0)
-    print value.get()
-
-    print "Adding 5, 29.0"
+    print(value.get())
+
+    print("Adding 5, 29.0")
     value.add(5, 29.0)
-    print value.get()
-
-    print "Adding 5, 21.0"
+    print(value.get())
+
+    print("Adding 5, 21.0")
     value.add(5, 21.0)
-    print value.get()
-
-    print "Adding 5, 26.0"
+    print(value.get())
+
+    print("Adding 5, 26.0")
     value.add(5, 26.0)
-    print value.get()
-
-    print "Adding 2, 30.0"
+    print(value.get())
+
+    print("Adding 2, 30.0")
     value.add(2, 30.0)
-    print value.get()
-
-    print "Adding 2, 55.0"
+    print(value.get())
+
+    print("Adding 2, 55.0")
     value.add(2, 55.0)
-    print value.get()
-
-#---------------------------------------------------------------------------------------
+    print(value.get())
+
+#---------------------------------------------------------------------------------------
Index: src/mlx/airports.py
===================================================================
--- src/mlx/airports.py	(revision 325)
+++ src/mlx/airports.py	(revision 919)
@@ -88,11 +88,11 @@
 
 if __name__ == "__main__":
-    for (town, airport) in airportNames.itervalues():
-        print town, airport
-    print getWelcomeMessage("LIRF")
-    print getWelcomeMessage("LHDC")
-    print getWelcomeMessage("LIRN")
-    print getWelcomeMessage("LHBP")
-    print getWelcomeMessage("EDDF")
+    for (town, airport) in airportNames.values():
+        print(town, airport)
+    print(getWelcomeMessage("LIRF"))
+    print(getWelcomeMessage("LHDC"))
+    print(getWelcomeMessage("LIRN"))
+    print(getWelcomeMessage("LHBP"))
+    print(getWelcomeMessage("EDDF"))
 
 #-----------------------------------------------------------------------------
Index: src/mlx/checks.py
===================================================================
--- src/mlx/checks.py	(revision 917)
+++ src/mlx/checks.py	(revision 919)
@@ -1,8 +1,8 @@
 
-import fs
-import const
-import util
-from acars import ACARS
-from sound import startSound
+from . import fs
+from . import const
+from . import util
+from .acars import ACARS
+from .sound import startSound
 
 import time
@@ -129,9 +129,9 @@
         """Callback for ACARS sending."""
         if returned:
-            print "Sent online ACARS"
+            print("Sent online ACARS")
             self._lastSent = time.time() if self._lastSent is None \
                              else self._lastSent + ACARSSender.INTERVAL
         else:
-            print "Failed to send the ACARS"
+            print("Failed to send the ACARS")
         self._sending = False
 
@@ -517,6 +517,6 @@
     def getMessage(logName, frequency, obs):
         """Get the message for the given NAV radio setting."""
-        message = u"%-5s %s" % (logName + ":", frequency)
-        if obs is not None: message += u" (%03d\u00b0)" % (obs,)
+        message = "%-5s %s" % (logName + ":", frequency)
+        if obs is not None: message += " (%03d\u00b0)" % (obs,)
         return message
 
@@ -747,7 +747,7 @@
         message = what
         if value is None:
-            message += u" cannot be detected, will not log"
+            message += " cannot be detected, will not log"
         else:
-            message += u": " + format % (value,)
+            message += ": " + format % (value,)
         logger.message(timestamp, message)
 
@@ -767,6 +767,6 @@
     def _logAPHeading(logger, timestamp, state):
         """Log the AP heading."""
-        APLogger._logNumeric(logger, timestamp, u"AP heading",
-                             u"%03.0f\u00b0", state.apHeading)
+        APLogger._logNumeric(logger, timestamp, "AP heading",
+                             "%03.0f\u00b0", state.apHeading)
 
     @staticmethod
@@ -779,6 +779,6 @@
     def _logAPAltitude(logger, timestamp, state):
         """Log the AP heading."""
-        APLogger._logNumeric(logger, timestamp, u"AP altitude",
-                             u"%.0f ft", state.apAltitude)
+        APLogger._logNumeric(logger, timestamp, "AP altitude",
+                             "%.0f ft", state.apAltitude)
 
     def __init__(self):
@@ -1415,5 +1415,5 @@
 class PayloadChecker(SimpleFaultChecker):
     """Check if the payload matches the specification."""
-    TOLERANCE=50
+    TOLERANCE=550
 
     @staticmethod
Index: src/mlx/common.py
===================================================================
--- src/mlx/common.py	(revision 908)
+++ src/mlx/common.py	(revision 919)
@@ -18,6 +18,5 @@
 #---------------------------------------------------------------------------------------
 
-#MAVA_BASE_URL = os.environ.get("MAVA_BASE_URL", "http://virtualairlines.hu")
-MAVA_BASE_URL = os.environ.get("MAVA_BASE_URL", "http://oldmava.mavasystems.hu")
+MAVA_BASE_URL = os.environ.get("MAVA_BASE_URL", "http://virtualairlines.hu")
 
 #-------------------------------------------------------------------------------
@@ -25,9 +24,9 @@
 # Due to CEF, PyGTK is the default
 if "FORCE_PYGOBJECT" not in os.environ:
-    print "Using PyGTK"
+    print("Using PyGTK")
     pygobject = False
     import gobject
 else:
-    print "Using PyGObject"
+    print("Using PyGObject")
     pygobject = True
 
Index: src/mlx/config.py
===================================================================
--- src/mlx/config.py	(revision 897)
+++ src/mlx/config.py	(revision 919)
@@ -1,11 +1,11 @@
 # -*- encoding: utf-8 -*-
 
-import const
-from util import secondaryInstallation, utf2unicode
+from . import const
+from .util import secondaryInstallation, utf2unicode
 
 import os
 import sys
 import traceback
-import ConfigParser
+import configparser
 
 ## @package mlx.config
@@ -163,5 +163,5 @@
         baseName = "callouts." + const.icaoCodes[aircraftType] + "."
         index = 0
-        for (altitude, path) in self._mapping.iteritems():
+        for (altitude, path) in self._mapping.items():
             option = baseName + str(index)
             config.set(ApproachCallouts.SECTION, option,
@@ -171,9 +171,9 @@
     def getAltitudes(self, descending = True):
         """Get the altitudes in decreasing order by default."""
-        altitudes = self._mapping.keys()
+        altitudes = list(self._mapping.keys())
         altitudes.sort(reverse = descending)
         return altitudes
 
-    def __nonzero__(self):
+    def __bool__(self):
         """Return if there is anything in the mapping."""
         return not not self._mapping
@@ -674,4 +674,11 @@
         return self._useRPC
 
+    @useRPC.setter
+    def useRPC(self, useRPC):
+        """Set whether RPC calls should be used."""
+        if useRPC!=self._useRPC:
+            self._useRPC = useRPC
+            self._modified = True
+
     def getChecklist(self, aircraftType):
         """Get the checklist for the given aircraft type."""
@@ -697,5 +704,5 @@
         """Load the configuration from its default location."""
         try:
-            config = ConfigParser.RawConfigParser()
+            config = configparser.RawConfigParser()
             config.read(configPath)
         except:
@@ -781,4 +788,5 @@
                                     Config.DEFAULT_UPDATE_URL +
                                     ("/exp" if secondaryInstallation else ""))
+        self._useRPC = self._getBoolean(config, "general", "useRPC", True)
 
         for aircraftType in const.aircraftTypes:
@@ -798,5 +806,5 @@
             return
 
-        config = ConfigParser.RawConfigParser()
+        config = configparser.RawConfigParser()
 
         config.add_section("login")
@@ -873,4 +881,7 @@
         config.set("update", "url", self._updateURL)
 
+        config.set("general", "useRPC",
+                   "yes" if self._useRPC else "no")
+
         config.add_section(Checklist.SECTION)
         config.add_section(ApproachCallouts.SECTION)
@@ -881,15 +892,15 @@
         try:
             fd = os.open(configPath, os.O_CREAT|os.O_TRUNC|os.O_WRONLY,
-                         0600)
+                         0o600)
             with os.fdopen(fd, "wt") as f:
                 config.write(f)
             self._modified = False
 
-            print "Configuration saved:"
+            print("Configuration saved:")
             self.log()
 
-        except Exception, e:
-            print >> sys.stderr, "Failed to update config: " + \
-                                 utf2unicode(str(e))
+        except Exception as e:
+            print("Failed to update config: " + \
+                                 utf2unicode(str(e)), file=sys.stderr)
 
     def _getBoolean(self, config, section, option, default):
@@ -934,5 +945,5 @@
         import locale
         if self._language:
-            print "Setting up locale for", self._language
+            print("Setting up locale for", self._language)
             os.environ["LANGUAGE"] = self._language
             langAndEncoding = self._language + "." + locale.getpreferredencoding()
@@ -967,61 +978,62 @@
     def log(self):
         """Log the configuration by printing the values"""
-        print "  pilot ID:", self._pilotID
-        print "  rememberPassword:", self._rememberPassword
-
-        print "  language:", self._language
-
-        print "  hideMinimizedWindow:", self._hideMinimizedWindow
-        print "  quitOnClose:", self._quitOnClose
-
-        print "  onlineGateSystem:", self._onlineGateSystem
-        print "  onlineACARS:", self._onlineACARS
-
-        print "  flareTimeFromFS:", self._flareTimeFromFS
-        print "  syncFSTime:", self._syncFSTime
-        print "  usingFS2Crew:", self._usingFS2Crew
-
-        print "  iasSmoothingLength:", self._iasSmoothingLength
-        print "  vsSmoothingLength:", self._vsSmoothingLength
-
-        print "  useSimBrief:", self._useSimBrief
-        print "  simBriefUserName:", self._simBriefUserName
-        print "  rememberSimBriefPassword:", self._rememberSimBriefPassword
-
-        print "  pirepDirectory:", self._pirepDirectory
-        print "  pirepAutoSave:", self._pirepAutoSave
-
-        print "  defaultMSFS:", self._defaultMSFS
-
-        print "  enableSounds:", self._enableSounds
-
-        print "  pilotControlsSounds:", self._pilotControlsSounds
-        print "  pilotHotkey:", str(self._pilotHotkey)
-
-        print "  enableApproachCallouts:", self._enableApproachCallouts
-        print "  speedbrakeAtTD:", self._speedbrakeAtTD
-
-        print "  enableChecklists:", self._enableChecklists
-        print "  checklistHotkey:", str(self._checklistHotkey)
-
-        print "  autoUpdate:", self._autoUpdate
-        print "  updateURL:", self._updateURL
-
-        print "  messageTypeLevels:"
-        for (type, level) in self._messageTypeLevels.iteritems():
-            print "    %s: %s" % (const.messageType2string(type),
-                                  const.messageLevel2string(level))
-
-        print "  checklists:"
-        for (type, checklist) in self._checklists.iteritems():
-            print "    %s:" % (const.icaoCodes[type],)
+        print("  pilot ID:", self._pilotID)
+        print("  rememberPassword:", self._rememberPassword)
+
+        print("  language:", self._language)
+
+        print("  hideMinimizedWindow:", self._hideMinimizedWindow)
+        print("  quitOnClose:", self._quitOnClose)
+
+        print("  onlineGateSystem:", self._onlineGateSystem)
+        print("  onlineACARS:", self._onlineACARS)
+
+        print("  flareTimeFromFS:", self._flareTimeFromFS)
+        print("  syncFSTime:", self._syncFSTime)
+        print("  usingFS2Crew:", self._usingFS2Crew)
+
+        print("  iasSmoothingLength:", self._iasSmoothingLength)
+        print("  vsSmoothingLength:", self._vsSmoothingLength)
+
+        print("  useSimBrief:", self._useSimBrief)
+        print("  simBriefUserName:", self._simBriefUserName)
+        print("  rememberSimBriefPassword:", self._rememberSimBriefPassword)
+
+        print("  pirepDirectory:", self._pirepDirectory)
+        print("  pirepAutoSave:", self._pirepAutoSave)
+
+        print("  defaultMSFS:", self._defaultMSFS)
+
+        print("  enableSounds:", self._enableSounds)
+
+        print("  pilotControlsSounds:", self._pilotControlsSounds)
+        print("  pilotHotkey:", str(self._pilotHotkey))
+
+        print("  enableApproachCallouts:", self._enableApproachCallouts)
+        print("  speedbrakeAtTD:", self._speedbrakeAtTD)
+
+        print("  enableChecklists:", self._enableChecklists)
+        print("  checklistHotkey:", str(self._checklistHotkey))
+
+        print("  autoUpdate:", self._autoUpdate)
+        print("  updateURL:", self._updateURL)
+        print("  useRPC:", self._useRPC)
+
+        print("  messageTypeLevels:")
+        for (type, level) in self._messageTypeLevels.items():
+            print("    %s: %s" % (const.messageType2string(type),
+                                  const.messageLevel2string(level)))
+
+        print("  checklists:")
+        for (type, checklist) in self._checklists.items():
+            print("    %s:" % (const.icaoCodes[type],))
             for path in checklist:
-                print "      " + path
-
-        print "  approachCallouts:"
-        for (type, approachCallouts) in self._approachCallouts.iteritems():
-            print "    %s:" % (const.icaoCodes[type],)
+                print("      " + path)
+
+        print("  approachCallouts:")
+        for (type, approachCallouts) in self._approachCallouts.items():
+            print("    %s:" % (const.icaoCodes[type],))
             for (altitude, path) in approachCallouts:
-                print "      %d: %s" % (altitude, path)
+                print("      %d: %s" % (altitude, path))
 
 #-------------------------------------------------------------------------------
Index: src/mlx/const.py
===================================================================
--- src/mlx/const.py	(revision 917)
+++ src/mlx/const.py	(revision 919)
@@ -12,5 +12,5 @@
 
 ## The version of the program
-VERSION="0.40.1"
+VERSION="0.39.6"
 
 #-------------------------------------------------------------------------------
@@ -108,7 +108,4 @@
 ## Aircraft type: British Aerospace BAe-146
 AIRCRAFT_B462 = 17
-
-## Aircraft type: British Aerospace BAe-146
-AIRCRAFT_IL62 = 19
 
 #-------------------------------------------------------------------------------
@@ -125,5 +122,5 @@
                  AIRCRAFT_T154, AIRCRAFT_T134,
                  AIRCRAFT_YK40, AIRCRAFT_DC3,
-                 AIRCRAFT_B462, AIRCRAFT_IL62]
+                 AIRCRAFT_B462]
 
 #-------------------------------------------------------------------------------
@@ -161,7 +158,4 @@
 ## Aircraft type family: British Aerospace BAe-146
 AIRCRAFT_FAMILY_B462 = 11
-
-## Aircraft type family: Ilyushin IL-62
-AIRCRAFT_FAMILY_IL62 = 12
 
 #-------------------------------------------------------------------------------
@@ -191,7 +185,5 @@
     AIRCRAFT_FAMILY_YK40: [AIRCRAFT_YK40],
 
-    AIRCRAFT_FAMILY_B462: [AIRCRAFT_B462],
-
-    AIRCRAFT_FAMILY_IL62: [AIRCRAFT_IL62]
+    AIRCRAFT_FAMILY_B462: [AIRCRAFT_B462]
 
     }
@@ -201,5 +193,5 @@
 def aircraftType2Family(aircraftType):
     """Get the family for the given aircraft type."""
-    for (family, types) in aircraftFamily2Types.iteritems():
+    for (family, types) in aircraftFamily2Types.items():
         if aircraftType in types:
             return family
@@ -227,28 +219,5 @@
               AIRCRAFT_T154  : "T154",
               AIRCRAFT_YK40  : "YK40",
-              AIRCRAFT_B462  : "B462",
-              AIRCRAFT_IL62  : "IL62" }
-
-#-------------------------------------------------------------------------------
-
-## A mapping from ICAO codes to the corresponding aircraft types
-icao2Type = { "B736" : AIRCRAFT_B736,
-              "B737" : AIRCRAFT_B737,
-              "B738" : AIRCRAFT_B738,
-              "B732" : AIRCRAFT_B732,
-              "B733" : AIRCRAFT_B733,
-              "B734" : AIRCRAFT_B734,
-              "B735" : AIRCRAFT_B735,
-              "DH8D" : AIRCRAFT_DH8D,
-              "B762" : AIRCRAFT_B762,
-              "B763" : AIRCRAFT_B763,
-              "CRJ2" : AIRCRAFT_CRJ2,
-              "F70"  : AIRCRAFT_F70,
-              "DC3"  : AIRCRAFT_DC3,
-              "T134" : AIRCRAFT_T134,
-              "T154" : AIRCRAFT_T154,
-              "YK40" : AIRCRAFT_YK40,
-              "B462" : AIRCRAFT_B462,
-              "IL62" : AIRCRAFT_IL62 }
+              AIRCRAFT_B462  : "B462" }
 
 #-------------------------------------------------------------------------------
@@ -455,5 +424,5 @@
 def string2messageLevel(str):
     """Get the message level for the given string."""
-    for (value, s) in _messageLevelStrings.iteritems():
+    for (value, s) in _messageLevelStrings.items():
         if str==s:
             return value
Index: src/mlx/flight.py
===================================================================
--- src/mlx/flight.py	(revision 899)
+++ src/mlx/flight.py	(revision 919)
@@ -1,8 +1,8 @@
 
-from soundsched import SoundScheduler, ChecklistScheduler
-from checks import SpeedChecker
-
-import const
-import util
+from .soundsched import SoundScheduler, ChecklistScheduler
+from .checks import SpeedChecker
+
+from . import const
+from . import util
 import time
 
@@ -152,17 +152,7 @@
 
     @property
-    def numCockpitCrew(self):
-        """Get the number of cockpit crew members on the flight."""
-        return self._gui.numCockpitCrew
-
-    @property
-    def numCabinCrew(self):
-        """Get the number of cabon crew members on the flight."""
-        return self._gui.numCabinCrew
-
-    @property
     def numCrew(self):
         """Get the number of crew members on the flight."""
-        return self.numCockpitCrew + self.numCabinCrew
+        return self._gui.numCrew
 
     @property
Index: src/mlx/fs.py
===================================================================
--- src/mlx/fs.py	(revision 909)
+++ src/mlx/fs.py	(revision 919)
@@ -1,10 +1,10 @@
 
-import const
-from sound import startSound
+from . import const
+from .sound import startSound
 
 import os
 
-import fsuipc
-import xplane
+from . import fsuipc
+from . import xplane
 
 import threading
@@ -36,13 +36,13 @@
         """Called when a connection has been established to the flight
         simulator of the given type."""
-        print "fs.ConnectionListener.connected, fsType:", fsType, ", descriptor:", descriptor
+        print("fs.ConnectionListener.connected, fsType:", fsType, ", descriptor:", descriptor)
 
     def connectionFailed(self):
         """Called when the connection could not be established."""
-        print "fs.ConnectionListener.connectionFailed"
+        print("fs.ConnectionListener.connectionFailed")
 
     def disconnected(self):
         """Called when a connection to the flight simulator has been broken."""
-        print "fs.ConnectionListener.disconnected"
+        print("fs.ConnectionListener.disconnected")
 
 #-------------------------------------------------------------------------------
Index: src/mlx/fsuipc.py
===================================================================
--- src/mlx/fsuipc.py	(revision 877)
+++ src/mlx/fsuipc.py	(revision 919)
@@ -1,8 +1,8 @@
 
-import fs
-import const
-import util
-import acft
-from watchdog import Watchdog
+from . import fs
+from . import const
+from . import util
+from . import acft
+from .watchdog import Watchdog
 
 import threading
@@ -17,5 +17,5 @@
     import pyuipc
 else:
-    import pyuipc_sim as pyuipc
+    from . import pyuipc_sim as pyuipc
 
 #------------------------------------------------------------------------------
@@ -104,6 +104,6 @@
         try:
             return fun()
-        except Exception, e:
-            print >> sys.stderr, util.utf2unicode(str(e))
+        except Exception as e:
+            print(util.utf2unicode(str(e)), file=sys.stderr)
             return None
 
@@ -133,5 +133,5 @@
             try:
                 values = pyuipc.read(data)
-            except TypeError, e:
+            except TypeError as e:
                 exception = e
 
@@ -174,5 +174,5 @@
                 try:
                     pyuipc.write(self._data)
-                except TypeError, e:
+                except TypeError as e:
                     exception = e
 
@@ -420,8 +420,8 @@
                 self._connected = True
                 return attempts
-            except Exception, e:
-                print "fsuipc.Handler._connect: connection failed: " + \
+            except Exception as e:
+                print("fsuipc.Handler._connect: connection failed: " + \
                       util.utf2unicode(str(e)) + \
-                      " (attempts: %d)" % (attempts,)
+                      " (attempts: %d)" % (attempts,))
                 if attempts<self.NUM_CONNECTATTEMPTS:
                     time.sleep(self.CONNECT_INTERVAL)
@@ -454,5 +454,5 @@
     def _disconnect(self):
         """Disconnect from the flight simulator."""
-        print "fsuipc.Handler._disconnect"
+        print("fsuipc.Handler._disconnect")
         if self._connected:
             pyuipc.close()
@@ -479,16 +479,16 @@
             try:
                 if not request.process(time):
-                    print "fsuipc.Handler._processRequest: FSUIPC returned invalid data too many times, reconnecting"
+                    print("fsuipc.Handler._processRequest: FSUIPC returned invalid data too many times, reconnecting")
                     needReconnect = True
             except TypeError as e:
-                print "fsuipc.Handler._processRequest: type error: " + \
+                print("fsuipc.Handler._processRequest: type error: " + \
                       util.utf2unicode(str(e)) + \
                       ("." if request.unimportant else
-                       (", reconnecting (attempts=%d)." % (attempts,)))
+                       (", reconnecting (attempts=%d)." % (attempts,))))
                 needReconnect = not request.unimportant
             except Exception as e:
-                print "fsuipc.Handler._processRequest: FSUIPC connection failed (" + \
+                print("fsuipc.Handler._processRequest: FSUIPC connection failed (" + \
                       util.utf2unicode(str(e)) + \
-                      "), reconnecting (attempts=%d)." % (attempts,)
+                      "), reconnecting (attempts=%d)." % (attempts,))
                 needReconnect = True
 
@@ -723,5 +723,5 @@
         duration is the number of seconds to keep the message displayed."""
 
-        print "fsuipc.Simulator.sendMessage:", message
+        print("fsuipc.Simulator.sendMessage:", message)
 
         if self._scroll:
@@ -732,6 +732,6 @@
         try:
             message = str(message)
-        except Exception, e:
-            print "fsuipc.Simulator.sendMessage: failed to convert the message to a string:", e
+        except Exception as e:
+            print("fsuipc.Simulator.sendMessage: failed to convert the message to a string:", e)
 
         data = [(0x3380, -1 - len(message), message),
@@ -822,5 +822,5 @@
         assert not self._monitoringRequested
 
-        print "fsuipc.Simulator.disconnect", closingMessage, duration
+        print("fsuipc.Simulator.disconnect", closingMessage, duration)
 
         self._stopNormal()
@@ -953,6 +953,6 @@
             return False
 
-        print "fsuipc.Simulator: new aircraft name and air file path: %s, %s" % \
-              (name, airPath)
+        print("fsuipc.Simulator: new aircraft name and air file path: %s, %s" % \
+              (name, airPath))
 
         self._aircraftName = aircraftName
@@ -1088,10 +1088,11 @@
             self._handler.disconnect()
 
-    def _handleNumHotkeys(self, data, (id, generation)):
+    def _handleNumHotkeys(self, data, xxx_todo_changeme5):
         """Handle the result of the query of the number of hotkeys"""
+        (id, generation) = xxx_todo_changeme5
         with self._hotkeyLock:
             if id==self._hotkeySetID and generation==self._hotkeySetGeneration:
                 numHotkeys = data[0]
-                print "fsuipc.Simulator._handleNumHotkeys: numHotkeys:", numHotkeys
+                print("fsuipc.Simulator._handleNumHotkeys: numHotkeys:", numHotkeys)
                 data = [(0x3210 + i*4, "d") for i in range(0, numHotkeys)]
                 self._handler.requestRead(data, self._handleHotkeyTable,
@@ -1135,10 +1136,11 @@
 
         for offset in oldHotkeyOffsets:
-            writeData.append((offset, "u", long(0)))
+            writeData.append((offset, "u", int(0)))
 
         return writeData
 
-    def _handleHotkeyTable(self, data, (id, generation)):
+    def _handleHotkeyTable(self, data, xxx_todo_changeme6):
         """Handle the result of the query of the hotkey table."""
+        (id, generation) = xxx_todo_changeme6
         with self._hotkeyLock:
             if id==self._hotkeySetID and generation==self._hotkeySetGeneration:
@@ -1148,6 +1150,7 @@
                                            (id, generation))
 
-    def _handleHotkeysWritten(self, success, (id, generation)):
+    def _handleHotkeysWritten(self, success, xxx_todo_changeme7):
         """Handle the result of the hotkeys having been written."""
+        (id, generation) = xxx_todo_changeme7
         with self._hotkeyLock:
             if success and id==self._hotkeySetID and \
@@ -1160,6 +1163,7 @@
                                                       (id, generation))
 
-    def _handleHotkeys(self, data, (id, generation)):
+    def _handleHotkeys(self, data, xxx_todo_changeme8):
         """Handle the hotkeys."""
+        (id, generation) = xxx_todo_changeme8
         with self._hotkeyLock:
             if id!=self._hotkeySetID or generation!=self._hotkeySetGeneration:
@@ -1406,8 +1410,8 @@
         state.flapsSet = self._flapsNotches[flapsIndex]
         if state.flapsSet != self._flapsSet:
-            print "flapsControl: %d, flapsLeft: %d, flapsRight: %d, flapsAxis: %d, flapsIncrement: %d, flapsSet: %d, numNotchesM1: %d" % \
+            print("flapsControl: %d, flapsLeft: %d, flapsRight: %d, flapsAxis: %d, flapsIncrement: %d, flapsSet: %d, numNotchesM1: %d" % \
                   (flapsControl, data[self._monidx_flapsLeft],
                    data[self._monidx_flapsRight], data[self._monidx_flapsAxis],
-                   data[self._monidx_flapsIncrement], state.flapsSet, numNotchesM1)
+                   data[self._monidx_flapsIncrement], state.flapsSet, numNotchesM1))
             self._flapsSet = state.flapsSet
 
@@ -1588,5 +1592,5 @@
         for (tank, level) in levels:
             offset = _tank2offset[tank]
-            value = long(level * 128.0 * 65536.0)
+            value = int(level * 128.0 * 65536.0)
             data.append( (offset, "u", value) )
 
@@ -1698,7 +1702,8 @@
     """A model handler for the PMDG Boeing 737NG model."""
     @staticmethod
-    def doesHandle(aircraft, (name, airPath)):
+    def doesHandle(aircraft, xxx_todo_changeme):
         """Determine if this model handler handles the aircraft with the given
         name."""
+        (name, airPath) = xxx_todo_changeme
         return aircraft.type in [const.AIRCRAFT_B736,
                                  const.AIRCRAFT_B737,
@@ -1730,6 +1735,6 @@
 
         if fsType==const.SIM_MSFSX or fsType==const.SIM_P3D:
-            print "%s detected, adding PMDG 737 NGX-specific offsets" % \
-                  ("FSX" if fsType==const.SIM_MSFSX else "P3D",)
+            print("%s detected, adding PMDG 737 NGX-specific offsets" % \
+                  ("FSX" if fsType==const.SIM_MSFSX else "P3D",))
             self._addOffsetWithIndexMember(data, 0x6500, "b",
                                            "_pmdgidx_lts_positionsw")
@@ -1741,5 +1746,5 @@
             self._addOffsetWithIndexMember(data, 0x65cd, "b", "_pmdgidx_xpdr")
         else:
-            print "FS9 detected, adding PMDG 737 NG-specific offsets"
+            print("FS9 detected, adding PMDG 737 NG-specific offsets")
             self._addOffsetWithIndexMember(data, 0x6202, "b", "_pmdgidx_switches")
             self._addOffsetWithIndexMember(data, 0x6216, "b", "_pmdgidx_xpdr")
@@ -1786,5 +1791,5 @@
 
         if gearControl!=self._lastGearControl or noseGear!=self._lastNoseGear:
-            print "gearControl:", gearControl, " noseGear:", noseGear
+            print("gearControl:", gearControl, " noseGear:", noseGear)
             self._lastGearControl = gearControl
             self._lastNoseGear = noseGear
@@ -1833,7 +1838,8 @@
     """Model handler for the Dreamwings Dash 8-Q400."""
     @staticmethod
-    def doesHandle(aircraft, (name, airPath)):
+    def doesHandle(aircraft, xxx_todo_changeme1):
         """Determine if this model handler handles the aircraft with the given
         name."""
+        (name, airPath) = xxx_todo_changeme1
         return aircraft.type==const.AIRCRAFT_DH8D and \
             (name.find("Dreamwings")!=-1 or airPath.find("Dreamwings")!=-1) and \
@@ -1870,7 +1876,8 @@
     """Model handler for the Majestic Dash 8-Q400."""
     @staticmethod
-    def doesHandle(aircraft, (name, airPath)):
+    def doesHandle(aircraft, xxx_todo_changeme2):
         """Determine if this model handler handles the aircraft with the given
         name."""
+        (name, airPath) = xxx_todo_changeme2
         return aircraft.type==const.AIRCRAFT_DH8D and \
             (name.find("MJC8Q400")!=-1 or \
@@ -1948,7 +1955,8 @@
     """Model for the Digital Aviation F70 implementation on FS9."""
     @staticmethod
-    def doesHandle(aircraft, (name, airPath)):
+    def doesHandle(aircraft, xxx_todo_changeme3):
         """Determine if this model handler handles the aircraft with the given
         name."""
+        (name, airPath) = xxx_todo_changeme3
         return aircraft.type == const.AIRCRAFT_F70 and \
                (airPath.endswith("fokker70_2k4_v4.1.air") or
@@ -2137,8 +2145,9 @@
     """Project Tupolev Tu-154."""
     @staticmethod
-    def doesHandle(aircraft, (name, airPath)):
+    def doesHandle(aircraft, xxx_todo_changeme4):
         """Determine if this model handler handles the aircraft with the given
         name."""
-        print "PTT154Model.doesHandle", aircraft.type, name, airPath
+        (name, airPath) = xxx_todo_changeme4
+        print("PTT154Model.doesHandle", aircraft.type, name, airPath)
         return aircraft.type==const.AIRCRAFT_T154 and \
                (name.find("Tu-154")!=-1 or name.find("Tu154B")!=-1) and \
Index: src/mlx/gui/acars.py
===================================================================
--- src/mlx/gui/acars.py	(revision 747)
+++ src/mlx/gui/acars.py	(revision 919)
@@ -1,9 +1,9 @@
 
-from common import *
+from .common import *
 
 from mlx.i18n import xstr
 import mlx.const as const
 
-import cef
+from . import cef
 
 #------------------------------------------------------------------------------
Index: src/mlx/gui/bugreport.py
===================================================================
--- src/mlx/gui/bugreport.py	(revision 492)
+++ src/mlx/gui/bugreport.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from common import *
+from .common import *
 
 from mlx.i18n import xstr
@@ -105,5 +105,5 @@
         response = super(BugReportDialog, self).run()
 
-        print "response", response, RESPONSETYPE_ACCEPT
+        print("response", response, RESPONSETYPE_ACCEPT)
         if response==RESPONSETYPE_ACCEPT:
             self._send()
Index: src/mlx/gui/callouts.py
===================================================================
--- src/mlx/gui/callouts.py	(revision 300)
+++ src/mlx/gui/callouts.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from common import *
+from .common import *
 
 from mlx.i18n import xstr
@@ -208,5 +208,5 @@
             config = self._gui.config
             for (aircraftType, approachCallouts) in \
-                    self._approachCallouts.iteritems():
+                    self._approachCallouts.items():
                 config.setApproachCallouts(aircraftType, approachCallouts)
             config.save()
Index: src/mlx/gui/cef.py
===================================================================
--- src/mlx/gui/cef.py	(revision 915)
+++ src/mlx/gui/cef.py	(revision 919)
@@ -1,3 +1,3 @@
-from common import *
+from .common import *
 
 from mlx.util import secondaryInstallation
@@ -10,11 +10,11 @@
 import os
 import re
-import thread
+import _thread
 import threading
 import tempfile
 import traceback
-import urllib2
+import urllib.request, urllib.error, urllib.parse
 from lxml import etree
-from StringIO import StringIO
+from io import StringIO
 import lxml.html
 
@@ -115,5 +115,5 @@
         """Called when a page has been loaded in the SimBrief browser."""
         url = frame.GetUrl()
-        print "gui.cef.SimBriefHandler._onLoadEnd", httpCode, url
+        print("gui.cef.SimBriefHandler._onLoadEnd", httpCode, url)
         if httpCode>=300:
             self._updateProgress(self._lastProgress,
@@ -127,7 +127,7 @@
 
             js = "form=document.getElementById(\"sbapiform\");"
-            for (name, value) in self._plan.iteritems():
+            for (name, value) in self._plan.items():
                 js += "form." + name + ".value=\"" + value + "\";"
-            for (name, value) in SimBriefHandler._querySettings.iteritems():
+            for (name, value) in SimBriefHandler._querySettings.items():
                 if isinstance(value, bool):
                     js += "form." + name + ".checked=" + \
@@ -175,6 +175,6 @@
 
             thread = threading.Thread(target = self._getResults, args = (link,))
-            thread.daemon = True
-            thread.start()
+            _thread.daemon = True
+            _thread.start()
         else:
             self._updateProgress(SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING,
@@ -219,5 +219,5 @@
 
         # Obtaining the xml
-        response = urllib2.urlopen(link)
+        response = urllib.request.urlopen(link)
         xmlContent = response.read()
         # Processing xml
@@ -242,5 +242,5 @@
                     imageLinks.append(imageLink[2])
         flightInfo["image_links"] = imageLinks
-        print(sorted(availableInfo.keys()))
+        print((sorted(availableInfo.keys())))
         htmlFilePath = "simbrief_plan.html" if self._htmlFilePath is None \
           else self._htmlFilePath
@@ -266,5 +266,5 @@
 def _initializeCEF(args, initializedCallback):
     """Perform the actual initialization of CEF using the given arguments."""
-    print "Initializing CEF with args:", args
+    print("Initializing CEF with args:", args)
 
     settings = {
@@ -290,5 +290,5 @@
                     switches[arg[2:assignIndex]] = arg[assignIndex+1:]
         else:
-            print "Unhandled switch", arg
+            print("Unhandled switch", arg)
 
     cefpython.Initialize(settings, switches)
@@ -296,5 +296,5 @@
     gobject.timeout_add(10, _handleTimeout)
 
-    print "Initialized, executing callback..."
+    print("Initialized, executing callback...")
     initializedCallback()
 
@@ -322,5 +322,5 @@
         window = container.get_window()
         if window is None:
-            print "mlx.gui.cef.startInContainer: no window found!"
+            print("mlx.gui.cef.startInContainer: no window found!")
             windowID = None
         else:
Index: src/mlx/gui/checklist.py
===================================================================
--- src/mlx/gui/checklist.py	(revision 300)
+++ src/mlx/gui/checklist.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from common import *
+from .common import *
 
 from mlx.i18n import xstr
@@ -190,5 +190,5 @@
             self._saveChecklist()
             config = self._gui.config
-            for (aircraftType, checklist) in self._checklists.iteritems():
+            for (aircraftType, checklist) in self._checklists.items():
                 config.setChecklist(aircraftType, checklist)
             config.save()
Index: src/mlx/gui/common.py
===================================================================
--- src/mlx/gui/common.py	(revision 895)
+++ src/mlx/gui/common.py	(revision 919)
@@ -31,5 +31,5 @@
 
 if not pygobject:
-    print "Using PyGTK"
+    print("Using PyGTK")
     pygobject = False
     import pygtk
@@ -42,5 +42,5 @@
         import appindicator
         appIndicator = True
-    except Exception, e:
+    except Exception as e:
         pass
 
@@ -113,5 +113,5 @@
     def text2unicode(text):
         """Convert the given text, returned by a Gtk widget, to Unicode."""
-        return unicode(text)
+        return str(text)
 
     def text2str(text):
@@ -547,6 +547,5 @@
                   _const.AIRCRAFT_T154  : xstr("aircraft_t154"),
                   _const.AIRCRAFT_YK40  : xstr("aircraft_yk40"),
-                  _const.AIRCRAFT_B462  : xstr("aircraft_b462"),
-                  _const.AIRCRAFT_IL62  : xstr("aircraft_il62") }
+                  _const.AIRCRAFT_B462  : xstr("aircraft_b462") }
 
 #------------------------------------------------------------------------------
@@ -573,7 +572,5 @@
     _const.AIRCRAFT_FAMILY_YK40: xstr("aircraft_family_yk40"),
 
-    _const.AIRCRAFT_FAMILY_B462: xstr("aircraft_family_b462"),
-
-    _const.AIRCRAFT_FAMILY_IL62: xstr("aircraft_family_il62")
+    _const.AIRCRAFT_FAMILY_B462: xstr("aircraft_family_b462")
 }
 
Index: src/mlx/gui/delaycodes.py
===================================================================
--- src/mlx/gui/delaycodes.py	(revision 840)
+++ src/mlx/gui/delaycodes.py	(revision 919)
@@ -3,5 +3,5 @@
 #------------------------------------------------------------------------------
 
-from dcdata import CAPTION, DELAYCODE, getTable
+from .dcdata import CAPTION, DELAYCODE, getTable
 
 from mlx.gui.common import *
Index: src/mlx/gui/faultexplain.py
===================================================================
--- src/mlx/gui/faultexplain.py	(revision 842)
+++ src/mlx/gui/faultexplain.py	(revision 919)
@@ -247,5 +247,5 @@
     def reset(self):
         """Reset the widget by removing all faults."""
-        for (alignment, faultFrame) in self._faultWidgets.itervalues():
+        for (alignment, faultFrame) in self._faultWidgets.values():
             self._faults.remove(alignment)
         self._faults.show_all()
Index: src/mlx/gui/flight.py
===================================================================
--- src/mlx/gui/flight.py	(revision 908)
+++ src/mlx/gui/flight.py	(revision 919)
@@ -32,5 +32,5 @@
 #
 # This module implements the main tab of the application, the flight
-# wizard. The wizard consists of \ref Page "pages", that come one yafter the
+# wizard. The wizard consists of \ref Page "pages", that come one after the
 # other. As some pages might be skipped, the pages dynamically store the index
 # of the previous page so that going back to it is simpler. The \ref
@@ -405,10 +405,10 @@
     def _offlineClicked(self, button):
         """Called when the offline button was clicked."""
-        print "mlx.flight.LoginPage: offline flight selected"
+        print("mlx.flight.LoginPage: offline flight selected")
         self._wizard.nextPage()
 
     def _loginClicked(self, button):
         """Called when the login button was clicked."""
-        print "mlx.flight.LoginPage: logging in"
+        print("mlx.flight.LoginPage: logging in")
         self._wizard.login(self._handleLoginResult,
                            self._pilotID.get_text(),
@@ -649,10 +649,10 @@
         if response==RESPONSETYPE_OK:
             fileName = text2unicode(dialog.get_filename())
-            print "Saving", fileName
+            print("Saving", fileName)
             try:
                 with open(fileName, "wt") as f:
                     flight.writeIntoFile(f)
-            except Exception, e:
-                print "Failed to save flight:", util.utf2unicode(str(e))
+            except Exception as e:
+                print("Failed to save flight:", util.utf2unicode(str(e)))
                 dialog = gtk.MessageDialog(parent = self._wizard.gui.mainWindow,
                                            type = MESSAGETYPE_ERROR,
@@ -706,5 +706,5 @@
         flight=self._getSelectedFlight()
 
-        print "DPI", context.get_dpi_x(), context.get_dpi_y()
+        print("DPI", context.get_dpi_x(), context.get_dpi_y())
 
         scale = context.get_dpi_x() / 72.0
@@ -719,5 +719,5 @@
 
         layout = cr.create_layout()
-        layout.set_text(u"Malév VA official briefing")
+        layout.set_text("Malév VA official briefing")
         font = pango.FontDescription("sans")
         font.set_size(int(32 * scale * pango.SCALE))
@@ -740,5 +740,5 @@
 
         layout = cr.create_layout()
-        layout.set_text(u"%s (%s) részére" %
+        layout.set_text("%s (%s) részére" %
                         (loginResult.pilotName, loginResult.pilotID))
         font = pango.FontDescription("sans")
@@ -940,5 +940,5 @@
         if response==RESPONSETYPE_OK:
             fileName = text2unicode(dialog.get_filename())
-            print "Loading", fileName
+            print("Loading", fileName)
             bookedFlight = web.BookedFlight()
             try:
@@ -946,6 +946,6 @@
                     bookedFlight.readFromFile(f)
                 self.addFlight(bookedFlight)
-            except Exception, e:
-                print "Failed to load flight:", util.utf2unicode(str(e))
+            except Exception as e:
+                print("Failed to load flight:", util.utf2unicode(str(e)))
                 dialog = gtk.MessageDialog(parent = self._wizard.gui.mainWindow,
                                            type = MESSAGETYPE_ERROR,
@@ -1629,13 +1629,13 @@
                                             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
+        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
@@ -1653,13 +1653,13 @@
         gui.endBusy()
 
-        print "Registration result:"
-        print "  returned:", returned
+        print("Registration result:")
+        print("  returned:", returned)
         if returned:
-            print "  registered:", result.registered
+            print("  registered:", result.registered)
             if result.registered:
-                print "  pilotID", result.pilotID
-                print "  loggedIn", result.loggedIn
-            print "  emailAlreadyRegistered:", result.emailAlreadyRegistered
-            print "  invalidData:", result.invalidData
+                print("  pilotID", result.pilotID)
+                print("  loggedIn", result.loggedIn)
+            print("  emailAlreadyRegistered:", result.emailAlreadyRegistered)
+            print("  invalidData:", result.invalidData)
 
         registrationOK = returned and result.registered
@@ -1830,5 +1830,5 @@
     def activate(self):
         """Activate the student page."""
-        print "StudentPage.activate"
+        print("StudentPage.activate")
         self._getEntryExamStatusCancelled = False
 
@@ -1844,5 +1844,5 @@
     def finalize(self):
         """Finalize the page."""
-        print "StudentPage.finalize"
+        print("StudentPage.finalize")
         self._getEntryExamStatusCancelled = True
 
@@ -1864,5 +1864,5 @@
     def _handleEntryExamStatus(self, returned, result):
         """Called when the entry exam status is availabe."""
-        print "_handleEntryExamStatus", returned, result
+        print("_handleEntryExamStatus", returned, result)
         if returned and not self._getEntryExamStatusCancelled:
             self._entryExamLink = result.entryExamLink
@@ -2125,5 +2125,5 @@
                                   xscale = 0.0, yscale = 0.0)
 
-        table = gtk.Table(8, 3)
+        table = gtk.Table(7, 3)
         table.set_row_spacings(4)
         table.set_col_spacings(16)
@@ -2132,32 +2132,20 @@
         self.setMainWidget(alignment)
 
-        label = gtk.Label(xstr("payload_cockpit_crew"))
+        label = gtk.Label(xstr("payload_crew"))
         label.set_use_underline(True)
         label.set_alignment(0.0, 0.5)
         table.attach(label, 0, 1, 0, 1)
 
-        self._numCockpitCrew = IntegerEntry(defaultValue = 0)
-        self._numCockpitCrew.set_width_chars(6)
-        self._numCockpitCrew.connect("integer-changed", self._weightChanged)
-        self._numCockpitCrew.set_tooltip_text(xstr("payload_cockpit_crew_tooltip"))
-        table.attach(self._numCockpitCrew, 1, 2, 0, 1)
-        label.set_mnemonic_widget(self._numCockpitCrew)
-
-        label = gtk.Label(xstr("payload_cabin_crew"))
+        self._numCrew = IntegerEntry(defaultValue = 0)
+        self._numCrew.set_width_chars(6)
+        self._numCrew.connect("integer-changed", self._weightChanged)
+        self._numCrew.set_tooltip_text(xstr("payload_crew_tooltip"))
+        table.attach(self._numCrew, 1, 2, 0, 1)
+        label.set_mnemonic_widget(self._numCrew)
+
+        label = gtk.Label(xstr("payload_pax"))
         label.set_use_underline(True)
         label.set_alignment(0.0, 0.5)
         table.attach(label, 0, 1, 1, 2)
-
-        self._numCabinCrew = IntegerEntry(defaultValue = 0)
-        self._numCabinCrew.set_width_chars(6)
-        self._numCabinCrew.connect("integer-changed", self._weightChanged)
-        self._numCabinCrew.set_tooltip_text(xstr("payload_cabin_crew_tooltip"))
-        table.attach(self._numCabinCrew, 1, 2, 1, 2)
-        label.set_mnemonic_widget(self._numCabinCrew)
-
-        label = gtk.Label(xstr("payload_pax"))
-        label.set_use_underline(True)
-        label.set_alignment(0.0, 0.5)
-        table.attach(label, 0, 1, 2, 3)
 
         self._numPassengers = IntegerEntry(defaultValue = 0)
@@ -2165,5 +2153,5 @@
         self._numPassengers.connect("integer-changed", self._weightChanged)
         self._numPassengers.set_tooltip_text(xstr("payload_pax_tooltip"))
-        table.attach(self._numPassengers, 1, 2, 2, 3)
+        table.attach(self._numPassengers, 1, 2, 1, 2)
         label.set_mnemonic_widget(self._numPassengers)
 
@@ -2171,5 +2159,5 @@
         label.set_use_underline(True)
         label.set_alignment(0.0, 0.5)
-        table.attach(label, 0, 1, 3, 4)
+        table.attach(label, 0, 1, 2, 3)
 
         self._bagWeight = IntegerEntry(defaultValue = 0)
@@ -2177,13 +2165,13 @@
         self._bagWeight.connect("integer-changed", self._weightChanged)
         self._bagWeight.set_tooltip_text(xstr("payload_bag_tooltip"))
-        table.attach(self._bagWeight, 1, 2, 3, 4)
+        table.attach(self._bagWeight, 1, 2, 2, 3)
         label.set_mnemonic_widget(self._bagWeight)
 
-        table.attach(gtk.Label("kg"), 2, 3, 3, 4)
+        table.attach(gtk.Label("kg"), 2, 3, 2, 3)
 
         label = gtk.Label(xstr("payload_cargo"))
         label.set_use_underline(True)
         label.set_alignment(0.0, 0.5)
-        table.attach(label, 0, 1, 4, 5)
+        table.attach(label, 0, 1, 3, 4)
 
         self._cargoWeight = IntegerEntry(defaultValue = 0)
@@ -2191,13 +2179,13 @@
         self._cargoWeight.connect("integer-changed", self._weightChanged)
         self._cargoWeight.set_tooltip_text(xstr("payload_cargo_tooltip"))
-        table.attach(self._cargoWeight, 1, 2, 4, 5)
+        table.attach(self._cargoWeight, 1, 2, 3, 4)
         label.set_mnemonic_widget(self._cargoWeight)
 
-        table.attach(gtk.Label("kg"), 2, 3, 4, 5)
+        table.attach(gtk.Label("kg"), 2, 3, 3, 4)
 
         label = gtk.Label(xstr("payload_mail"))
         label.set_use_underline(True)
         label.set_alignment(0.0, 0.5)
-        table.attach(label, 0, 1, 5, 6)
+        table.attach(label, 0, 1, 4, 5)
 
         self._mailWeight = IntegerEntry(defaultValue = 0)
@@ -2205,20 +2193,20 @@
         self._mailWeight.connect("integer-changed", self._weightChanged)
         self._mailWeight.set_tooltip_text(xstr("payload_mail_tooltip"))
-        table.attach(self._mailWeight, 1, 2, 5, 6)
+        table.attach(self._mailWeight, 1, 2, 4, 5)
         label.set_mnemonic_widget(self._mailWeight)
 
-        table.attach(gtk.Label("kg"), 2, 3, 5, 6)
+        table.attach(gtk.Label("kg"), 2, 3, 4, 5)
 
         label = gtk.Label("<b>" + xstr("payload_zfw") + "</b>")
         label.set_alignment(0.0, 0.5)
         label.set_use_markup(True)
-        table.attach(label, 0, 1, 6, 7)
+        table.attach(label, 0, 1, 5, 6)
 
         self._calculatedZFW = gtk.Label()
         self._calculatedZFW.set_width_chars(6)
         self._calculatedZFW.set_alignment(1.0, 0.5)
-        table.attach(self._calculatedZFW, 1, 2, 6, 7)
-
-        table.attach(gtk.Label("kg"), 2, 3, 6, 7)
+        table.attach(self._calculatedZFW, 1, 2, 5, 6)
+
+        table.attach(gtk.Label("kg"), 2, 3, 5, 6)
 
         self._zfwButton = gtk.Button(xstr("payload_fszfw"))
@@ -2226,13 +2214,13 @@
         self._zfwButton.connect("clicked", self._zfwRequested)
         self._zfwButton.set_tooltip_text(xstr("payload_fszfw_tooltip"))
-        table.attach(self._zfwButton, 0, 1, 7, 8)
+        table.attach(self._zfwButton, 0, 1, 6, 7)
 
         self._simulatorZFW = gtk.Label("-")
         self._simulatorZFW.set_width_chars(6)
         self._simulatorZFW.set_alignment(1.0, 0.5)
-        table.attach(self._simulatorZFW, 1, 2, 7, 8)
+        table.attach(self._simulatorZFW, 1, 2, 6, 7)
         self._simulatorZFWValue = None
 
-        table.attach(gtk.Label("kg"), 2, 3, 7, 8)
+        table.attach(gtk.Label("kg"), 2, 3, 6, 7)
 
         self.addCancelFlightButton()
@@ -2241,12 +2229,7 @@
 
     @property
-    def numCockpitCrew(self):
-        """The number of the cockpit crew members on the flight."""
-        return self._numCockpitCrew.get_int()
-
-    @property
-    def numCabinCrew(self):
-        """The number of the cabin crew members on the flight."""
-        return self._numCabinCrew.get_int()
+    def numCrew(self):
+        """The number of the crew members on the flight."""
+        return self._numCrew.get_int()
 
     @property
@@ -2273,14 +2256,7 @@
         """Setup the information."""
         bookedFlight = self._wizard._bookedFlight
-        aircraft = self._wizard.gui._flight.aircraft
-
-        numCockpitCrew = bookedFlight.numCockpitCrew
-        numCabinCrew = bookedFlight.numCabinCrew
-        numCrew = numCockpitCrew + numCabinCrew
-
-        self._numCockpitCrew.set_int(numCockpitCrew)
-        self._numCockpitCrew.set_sensitive(True)
-        self._numCabinCrew.set_int(numCabinCrew)
-        self._numCabinCrew.set_sensitive(True)
+
+        self._numCrew.set_int(bookedFlight.numCrew)
+        self._numCrew.set_sensitive(True)
         self._numPassengers.set_int(bookedFlight.numPassengers)
         self._numPassengers.set_sensitive(True)
@@ -2300,6 +2276,5 @@
     def finalize(self):
         """Finalize the payload page."""
-        self._numCockpitCrew.set_sensitive(False)
-        self._numCabinCrew.set_sensitive(False)
+        self._numCrew.set_sensitive(False)
         self._numPassengers.set_sensitive(False)
         self._bagWeight.set_sensitive(False)
@@ -2310,13 +2285,9 @@
     def calculateZFW(self):
         """Calculate the ZFW value."""
-        aircraft = self._wizard.gui._flight.aircraft
         zfw = self._wizard.gui._flight.aircraft.dow
-        zfw += (self.numCockpitCrew - aircraft.dowCockpit) * aircraft.cockpitCrewWeight
-        zfw += (self.numCabinCrew - aircraft.dowCabin) * aircraft.cabinCrewWeight
-        zfw += (self._numPassengers.get_int()) * aircraft.humanWeight
+        zfw += (self._numCrew.get_int() + self._numPassengers.get_int()) * 82
         zfw += self._bagWeight.get_int()
         zfw += self._cargoWeight.get_int()
         zfw += self._mailWeight.get_int()
-        zfw = int(zfw)
         return zfw
 
@@ -3020,5 +2991,5 @@
 
             plan = self._getPlan()
-            print "plan:", plan
+            print("plan:", plan)
 
             takeoffRunway = self._takeoffRunway.get_text()
@@ -3056,5 +3027,5 @@
         are returned. Otherwise a dialog box is displayed informing the user of
         invalid credentials and requesting another set of them."""
-        print "_getCredentials", count
+        print("_getCredentials", count)
         if count==0:
             return (self._userName.get_text(), self._password.get_text())
@@ -3090,5 +3061,5 @@
     def _simBriefProgress(self, progress, result, flightInfo):
         """The real SimBrief progress handler."""
-        print "_simBriefProgress", progress, result, flightInfo
+        print("_simBriefProgress", progress, result, flightInfo)
         if result==cef.SIMBRIEF_RESULT_NONE:
             message = SimBriefSetupPage.progress2Message.get(progress,
@@ -3787,5 +3758,5 @@
     def _metarChanged(self, buffer):
         """Called when the METAR has changed."""
-        print "BriefingPage.metarChanged", self._updatingMETAR
+        print("BriefingPage.metarChanged", self._updatingMETAR)
         if not self._updatingMETAR:
             self.metarEdited = True
@@ -3799,5 +3770,5 @@
 
         It uppercases all characters."""
-        print "BriefingPage.metarInserted", self._updatingMETAR
+        print("BriefingPage.metarInserted", self._updatingMETAR)
         if not self._updatingMETAR:
             self._updatingMETAR = True
@@ -4054,5 +4025,5 @@
     def activate(self):
         """Activate the page."""
-        print "TakeoffPage.activate"
+        print("TakeoffPage.activate")
 
         self._updatingMETAR = True
@@ -4098,5 +4069,5 @@
     def allowForward(self):
         """Allow going to the next page."""
-        print "TakeoffPage.allowForward"
+        print("TakeoffPage.allowForward")
         self._forwardAllowed = True
         self._updateForwardButton()
@@ -4104,5 +4075,5 @@
     def reset(self):
         """Reset the page if the wizard is reset."""
-        print "TakeoffPage.reset"
+        print("TakeoffPage.reset")
 
         super(TakeoffPage, self).reset()
@@ -4124,5 +4095,5 @@
         pages."""
         if self._active:
-            print "TakeoffPage.changeMETAR"
+            print("TakeoffPage.changeMETAR")
             self._updatingMETAR = True
             self._metar.get_buffer().set_text(metar, -1)
@@ -4145,14 +4116,14 @@
                      self.derate is not None)
 
-        print "TakeoffPage._updateForwardButton: forwardAllowed:", self._forwardAllowed, ", sensitive:", sensitive
+        print("TakeoffPage._updateForwardButton: forwardAllowed:", self._forwardAllowed, ", sensitive:", sensitive)
         if self._forwardAllowed:
-            print "  METAR: ", self._metar.get_text()
-            print "  runway: ", self._runway.get_text()
-            print "  SID:", self.sid
-            print "  V1:", self.v1
-            print "  VR:", self.vr
-            print "  V2:", self.v2
-            print "  derateType:", self._derateType
-            print "  derate:", self.derate
+            print("  METAR: ", self._metar.get_text())
+            print("  runway: ", self._runway.get_text())
+            print("  SID:", self.sid)
+            print("  V1:", self.v1)
+            print("  VR:", self.vr)
+            print("  V2:", self.v2)
+            print("  derateType:", self._derateType)
+            print("  derate:", self.derate)
 
         self._button.set_sensitive(sensitive)
@@ -4160,5 +4131,5 @@
     def _valueChanged(self, widget, arg = None):
         """Called when the value of some widget has changed."""
-        print "TakeoffPage._valueChanged"
+        print("TakeoffPage._valueChanged")
 
         self._updateForwardButton()
@@ -4167,5 +4138,5 @@
         """Called when the value of some entry widget has changed and the value
         should be converted to uppercase."""
-        print "TakeoffPage._upperChanged"
+        print("TakeoffPage._upperChanged")
         entry.set_text(entry.get_text().upper())
         self._valueChanged(entry, arg)
@@ -4180,5 +4151,5 @@
     def _derateChanged(self, entry):
         """Called when the value of the derate is changed."""
-        print "TakeoffPage._derateChanged"
+        print("TakeoffPage._derateChanged")
         self._updateForwardButton()
 
@@ -4291,5 +4262,5 @@
     def _metarChanged(self, entry):
         """Called when the METAR has changed."""
-        print "TakeoffPage.metarChanged", self._updatingMETAR
+        print("TakeoffPage.metarChanged", self._updatingMETAR)
         if not self._updatingMETAR:
             self._updateForwardButton()
@@ -4300,5 +4271,5 @@
 
         It uppercases all characters."""
-        print "TakeoffPage.metarInserted", self._updatingMETAR
+        print("TakeoffPage.metarInserted", self._updatingMETAR)
         if not self._updatingMETAR:
             self._updatingMETAR = True
@@ -4657,5 +4628,5 @@
         pages."""
         if self._active:
-            print "LandingPage.changeMETAR"
+            print("LandingPage.changeMETAR")
             self._updatingMETAR = True
             self._metar.get_buffer().set_text(metar, -1)
@@ -4718,5 +4689,5 @@
     def _metarChanged(self, entry):
         """Called when the METAR has changed."""
-        print "LandingPage.metarChanged", self._updatingMETAR
+        print("LandingPage.metarChanged", self._updatingMETAR)
         if not self._updatingMETAR:
             self._updateForwardButton()
@@ -4727,5 +4698,5 @@
 
         It uppercases all characters."""
-        print "LandingPage.metarInserted", self._updatingMETAR
+        print("LandingPage.metarInserted", self._updatingMETAR)
         if not self._updatingMETAR:
             self._updatingMETAR = True
@@ -5246,7 +5217,8 @@
         pass
 
-    def _formatTime(self, scheduledTime, realTimestamp, (warning, error)):
+    def _formatTime(self, scheduledTime, realTimestamp, xxx_todo_changeme):
         """Format the departure or arrival time based on the given data as a
         markup for a label."""
+        (warning, error) = xxx_todo_changeme
         realTime = time.gmtime(realTimestamp)
 
@@ -5570,12 +5542,7 @@
 
     @property
-    def numCockpitCrew(self):
-        """Get the number of cockpit crew members."""
-        return self._payloadPage.numCockpitCrew
-
-    @property
-    def numCabinCrew(self):
-        """Get the number of cabin crew members."""
-        return self._payloadPage.numCabinCrew
+    def numCrew(self):
+        """Get the number of crew members."""
+        return self._payloadPage.numCrew
 
     @property
@@ -5786,5 +5753,5 @@
         elif stage==const.STAGE_LANDING:
             if not self._arrivalBriefingPage.metarEdited:
-                print "Downloading arrival METAR again"
+                print("Downloading arrival METAR again")
                 self.gui.webHandler.getMETARs(self._arrivalMETARCallback,
                                               [self._bookedFlight.arrivalICAO])
@@ -5925,5 +5892,4 @@
                 self._loginResult = result
                 self.gui.loginSuccessful()
-                acft.setupTypes(result.aircraftTypes)
             else:
                 if isReload:
Index: src/mlx/gui/flightlist.py
===================================================================
--- src/mlx/gui/flightlist.py	(revision 868)
+++ src/mlx/gui/flightlist.py	(revision 919)
@@ -61,5 +61,5 @@
 
         if self._extraColumnAttributes is not None:
-            for (key, value) in self._extraColumnAttributes.iteritems():
+            for (key, value) in self._extraColumnAttributes.items():
                 if key=="alignment":
                     self._renderer.set_alignment(value, 0.5)
@@ -401,5 +401,5 @@
         gui.endBusy()
 
-        print "PendingFlightsFrame._handleReflyResult", returned, result
+        print("PendingFlightsFrame._handleReflyResult", returned, result)
 
         if returned:
@@ -444,5 +444,5 @@
         gui.endBusy()
 
-        print "PendingFlightsFrame._handleDeleteResult", returned, result
+        print("PendingFlightsFrame._handleDeleteResult", returned, result)
 
         if returned:
Index: src/mlx/gui/gates.py
===================================================================
--- src/mlx/gui/gates.py	(revision 619)
+++ src/mlx/gui/gates.py	(revision 919)
@@ -143,5 +143,5 @@
         self._fleetStore.clear()
         if fleet is None:
-            for (gateNumber, label) in self._gateLabels.iteritems():
+            for (gateNumber, label) in self._gateLabels.items():
                 label.set_markup("<b>" + gateNumber + "</b>")
         else:        
Index: src/mlx/gui/gui.py
===================================================================
--- src/mlx/gui/gui.py	(revision 899)
+++ src/mlx/gui/gui.py	(revision 919)
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 
-from statusicon import StatusIcon
-from statusbar import Statusbar
-from info import FlightInfo
-from update import Updater
+from .statusicon import StatusIcon
+from .statusbar import Statusbar
+from .info import FlightInfo
+from .update import Updater
 from mlx.gui.common import *
 from mlx.gui.flight import Wizard
@@ -18,5 +18,5 @@
 from mlx.gui.acars import ACARS
 from mlx.gui.timetable import TimetableWindow
-import cef
+from . import cef
 
 import mlx.const as const
@@ -51,13 +51,13 @@
 class GUI(fs.ConnectionListener):
     """The main GUI class."""
-    _authors = [ (u"Váradi", u"István", "prog_test"),
-                 (u"Galyassy", u"Tamás", "negotiation"),
-                 (u"Kurják", u"Ákos", "test"),
-                 (u"Nagy", u"Dániel", "test"),
-                 (u"Radó", u"Iván", "test"),
-                 (u"Petrovszki", u"Gábor", "test"),
-                 (u"Serfőző", u"Tamás", "test"),
-                 (u"Szebenyi", u"Bálint", "test"),
-                 (u"Zsebényi-Loksa", u"Gergely", "test") ]
+    _authors = [ ("Váradi", "István", "prog_test"),
+                 ("Galyassy", "Tamás", "negotiation"),
+                 ("Kurják", "Ákos", "test"),
+                 ("Nagy", "Dániel", "test"),
+                 ("Radó", "Iván", "test"),
+                 ("Petrovszki", "Gábor", "test"),
+                 ("Serfőző", "Tamás", "test"),
+                 ("Szebenyi", "Bálint", "test"),
+                 ("Zsebényi-Loksa", "Gergely", "test") ]
 
     def __init__(self, programDirectory, config):
@@ -264,12 +264,7 @@
 
     @property
-    def numCockpitCrew(self):
-        """Get the number of cockpit crew members."""
-        return self._wizard.numCockpitCrew
-
-    @property
-    def numCabinCrew(self):
-        """Get the number of cabin crew members."""
-        return self._wizard.numCabinCrew
+    def numCrew(self):
+        """Get the number of crew members."""
+        return self._wizard.numCrew
 
     @property
@@ -1467,5 +1462,5 @@
                 secondaryMarkup = xstr("sendPIREP_unknown_sec")
         else:
-            print "PIREP sending failed", result
+            print("PIREP sending failed", result)
             messageFormat = xstr("sendPIREP_failed")
             secondaryMarkup = xstr("sendPIREP_failed_sec")
@@ -1691,5 +1686,5 @@
                 secondaryMarkup = xstr("sendPIREP_unknown_sec")
         else:
-            print "PIREP sending failed", result
+            print("PIREP sending failed", result)
             messageFormat = xstr("sendPIREP_failed")
             secondaryMarkup = xstr("sendPIREP_failed_sec")
@@ -1716,5 +1711,5 @@
 
         for (timestampString, text) in self._logger.lines:
-            description += unicode(formatFlightLogLine(timestampString, text))
+            description += str(formatFlightLogLine(timestampString, text))
 
         description += "\n\n" + ("=" * 40)
@@ -1803,11 +1798,11 @@
             for index in hotkeys:
                 if index==self._pilotHotkeyIndex:
-                    print "gui.GUI._handleHotkeys: pilot hotkey pressed"
+                    print("gui.GUI._handleHotkeys: pilot hotkey pressed")
                     self._flight.pilotHotkeyPressed()
                 elif index==self._checklistHotkeyIndex:
-                    print "gui.GUI._handleHotkeys: checklist hotkey pressed"
+                    print("gui.GUI._handleHotkeys: checklist hotkey pressed")
                     self._flight.checklistHotkeyPressed()
                 else:
-                    print "gui.GUI._handleHotkeys: unhandled hotkey index:", index
+                    print("gui.GUI._handleHotkeys: unhandled hotkey index:", index)
 
     def _showManual(self, menuitem):
Index: src/mlx/gui/info.py
===================================================================
--- src/mlx/gui/info.py	(revision 846)
+++ src/mlx/gui/info.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from common import *
+from .common import *
 
 from mlx.gui.delaycodes import DelayCodeTable
Index: src/mlx/gui/pirep.py
===================================================================
--- src/mlx/gui/pirep.py	(revision 855)
+++ src/mlx/gui/pirep.py	(revision 919)
@@ -1,7 +1,7 @@
 
-from common import *
-from dcdata import getTable
-from info import FlightInfo
-from flight import comboModel
+from .common import *
+from .dcdata import getTable
+from .info import FlightInfo
+from .flight import comboModel
 
 from mlx.pirep import PIREP
Index: src/mlx/gui/prefs.py
===================================================================
--- src/mlx/gui/prefs.py	(revision 897)
+++ src/mlx/gui/prefs.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from common import *
+from .common import *
 
 from mlx.i18n import xstr
@@ -6,5 +6,5 @@
 import mlx.config as config
 
-import urlparse
+import urllib.parse
 
 #------------------------------------------------------------------------------
@@ -63,5 +63,5 @@
 
         self._hotkeyModel = gtk.ListStore(str)
-        for keyCode in range(ord("0"), ord("9")+1) + range(ord("A"), ord("Z")+1):
+        for keyCode in list(range(ord("0"), ord("9")+1)) + list(range(ord("A"), ord("Z")+1)):
             self._hotkeyModel.append([chr(keyCode)])
 
@@ -276,4 +276,6 @@
 
         self._updateURL.set_text(config.updateURL)
+
+        self._useRPC.set_active(config.useRPC)
 
         self._settingFromConfig = False
@@ -320,4 +322,5 @@
         config.autoUpdate = self._autoUpdate.get_active()
         config.updateURL = self._updateURL.get_text()
+        config.useRPC = self._useRPC.get_active()
 
     def _buildGeneral(self):
@@ -814,4 +817,10 @@
         updateURLBox.pack_start(self._updateURL, True, True, 4)
 
+        self._useRPC = gtk.CheckButton(xstr("prefs_use_rpc"))
+        mainBox.pack_start(self._useRPC, False, False, 16)
+
+        self._useRPC.set_use_underline(True)
+        self._useRPC.set_tooltip_text(xstr("prefs_use_rpc_tooltip"))
+
         return mainAlignment
 
@@ -820,5 +829,5 @@
         sensitive = False
         try:
-            result = urlparse.urlparse(self._updateURL.get_text())
+            result = urllib.parse.urlparse(self._updateURL.get_text())
             sensitive = result.scheme!="" and (result.netloc + result.path)!=""
         except:
Index: src/mlx/gui/statusbar.py
===================================================================
--- src/mlx/gui/statusbar.py	(revision 679)
+++ src/mlx/gui/statusbar.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from common import *
+from .common import *
 
 import mlx.const as const
Index: src/mlx/gui/statusicon.py
===================================================================
--- src/mlx/gui/statusicon.py	(revision 544)
+++ src/mlx/gui/statusicon.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from common import *
+from .common import *
 
 import mlx.const as const
@@ -154,5 +154,5 @@
     def _updateFlightStatus(self):
         """Update the flight status."""
-        stage = u"-" if self._stage is None \
+        stage = "-" if self._stage is None \
                 else xstr("flight_stage_" + const.stage2string(self._stage))
 
@@ -172,5 +172,5 @@
             if self._noGoReason is not None:
                 rating = '<span foreground="red">' + rating + '</span>'
-            markup = u"MAVA Logger X %s\n\n%s: %s\n%s: %s" %\
+            markup = "MAVA Logger X %s\n\n%s: %s\n%s: %s" %\
                      (const.VERSION, xstr("statusicon_stage"), stage,
                       xstr("statusicon_rating"), rating)
Index: src/mlx/gui/timetable.py
===================================================================
--- src/mlx/gui/timetable.py	(revision 879)
+++ src/mlx/gui/timetable.py	(revision 919)
@@ -4,5 +4,5 @@
 
 from mlx.gui.common import *
-from flightlist import ColumnDescriptor
+from .flightlist import ColumnDescriptor
 from mlx.rpc import ScheduledFlight
 
@@ -249,6 +249,6 @@
                     self._tooltips.set_tip(widget, "")
                     self._tooltips.disable()
-        except Exception, e:
-            print e
+        except Exception as e:
+            print(e)
             self._tooltips.set_tip(widget, "")
             self._tooltips.disable()
@@ -656,5 +656,5 @@
             typeFamilies.add(const.aircraftType2Family(aircraftType))
 
-        for (typeFamily, checkButton) in self._typeFamilyButtons.iteritems():
+        for (typeFamily, checkButton) in self._typeFamilyButtons.items():
             checkButton.set_sensitive(typeFamily in typeFamilies)
 
@@ -712,5 +712,5 @@
         """Update the timetable list."""
         aircraftTypes = []
-        for (aircraftFamily, button) in self._typeFamilyButtons.iteritems():
+        for (aircraftFamily, button) in self._typeFamilyButtons.items():
             if button.get_active():
                 aircraftTypes += const.aircraftFamily2Types[aircraftFamily]
Index: src/mlx/gui/weighthelp.py
===================================================================
--- src/mlx/gui/weighthelp.py	(revision 899)
+++ src/mlx/gui/weighthelp.py	(revision 303)
@@ -56,5 +56,5 @@
 
         
-        self._weightsTable = table = gtk.Table(17, 5)
+        self._weightsTable = table = gtk.Table(16, 5)
         table.set_homogeneous(False)
         table.set_row_spacings(4)
@@ -91,33 +91,17 @@
         
 
-        self._cockpitCrewLabel = \
-          gtk.Label(xstr("weighthelp_cockpit_crew") % ("99",))
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._cockpitCrewLabel)
+        self._crewLabel = gtk.Label(xstr("weighthelp_crew") % ("99",))
+        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._crewLabel)
         table.attach(alignment, 0, 1, 1, 2)
 
-        self._cockpitCrewWeight = gtk.Label("0")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._cockpitCrewWeight)
+        self._crewWeight = gtk.Label("0")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._crewWeight)
         table.attach(alignment, 1, 2, 1, 2)
         
         table.attach(gtk.Label("kg"), 2, 3, 1, 2)
-
-        self._cabinCrewLabel = \
-          gtk.Label(xstr("weighthelp_cabin_crew") % ("99",))
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._cabinCrewLabel)
-        table.attach(alignment, 0, 1, 2, 3)
-
-        self._cabinCrewWeight = gtk.Label("0")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._cabinCrewWeight)
-        table.attach(alignment, 1, 2, 2, 3)
-        
-        table.attach(gtk.Label("kg"), 2, 3, 2, 3)
 
         text = xstr("weighthelp_pax") % ("999",)
@@ -128,15 +112,29 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(self._paxLabel)
+        table.attach(alignment, 0, 1, 2, 3)
+
+        self._paxWeight = gtk.Label("20000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._paxWeight)
+        table.attach(alignment, 1, 2, 2, 3)
+        
+        table.attach(gtk.Label("kg"), 2, 3, 2, 3)
+        
+        label = gtk.Label(xstr("weighthelp_baggage"))
+        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(label)
         table.attach(alignment, 0, 1, 3, 4)
 
-        self._paxWeight = gtk.Label("20000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._paxWeight)
+        self._bagWeight = gtk.Label("2000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._bagWeight)
         table.attach(alignment, 1, 2, 3, 4)
         
         table.attach(gtk.Label("kg"), 2, 3, 3, 4)
         
-        label = gtk.Label(xstr("weighthelp_baggage"))
+        label = gtk.Label(xstr("weighthelp_cargo"))
         alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
                                   xscale = 0.0, yscale = 0.0)
@@ -144,13 +142,13 @@
         table.attach(alignment, 0, 1, 4, 5)
 
-        self._bagWeight = gtk.Label("2000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._bagWeight)
+        self._cargoWeight = gtk.Label("2000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._cargoWeight)
         table.attach(alignment, 1, 2, 4, 5)
         
         table.attach(gtk.Label("kg"), 2, 3, 4, 5)
         
-        label = gtk.Label(xstr("weighthelp_cargo"))
+        label = gtk.Label(xstr("weighthelp_mail"))
         alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
                                   xscale = 0.0, yscale = 0.0)
@@ -158,27 +156,13 @@
         table.attach(alignment, 0, 1, 5, 6)
 
-        self._cargoWeight = gtk.Label("2000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._cargoWeight)
+        self._mailWeight = gtk.Label("2000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._mailWeight)
         table.attach(alignment, 1, 2, 5, 6)
         
         table.attach(gtk.Label("kg"), 2, 3, 5, 6)
-        
-        label = gtk.Label(xstr("weighthelp_mail"))
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(label)
-        table.attach(alignment, 0, 1, 6, 7)
-
-        self._mailWeight = gtk.Label("2000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._mailWeight)
-        table.attach(alignment, 1, 2, 6, 7)
-        
-        table.attach(gtk.Label("kg"), 2, 3, 6, 7)
-
-        table.attach(gtk.HSeparator(), 1, 2, 7, 8)
+
+        table.attach(gtk.HSeparator(), 1, 2, 6, 7)
 
         label = gtk.Label("<b>" + xstr("weighthelp_payload") + "</b>")
@@ -187,5 +171,5 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(label)
-        table.attach(alignment, 0, 1, 8, 9)
+        table.attach(alignment, 0, 1, 7, 8)
 
         self._payload = gtk.Label("<b>32000</b>")
@@ -194,7 +178,7 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(self._payload)
-        table.attach(alignment, 1, 2, 8, 9)
-        
-        table.attach(gtk.Label("kg"), 2, 3, 8, 9)
+        table.attach(alignment, 1, 2, 7, 8)
+        
+        table.attach(gtk.Label("kg"), 2, 3, 7, 8)
 
         self._fsPayload = gtk.Label("<b>32001</b>")
@@ -203,34 +187,34 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(self._fsPayload)
+        table.attach(alignment, 3, 4, 7, 8)
+        
+        table.attach(gtk.Label("kg"), 4, 5, 7, 8)
+
+        label = gtk.Label(xstr("weighthelp_dow"))
+        label.set_use_markup(True)
+        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(label)
+        table.attach(alignment, 0, 1, 8, 9)
+
+        self._dow = gtk.Label("35000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._dow)
+        table.attach(alignment, 1, 2, 8, 9)
+        
+        table.attach(gtk.Label("kg"), 2, 3, 8, 9)
+
+        self._fsDOW = gtk.Label("33012")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._fsDOW)
         table.attach(alignment, 3, 4, 8, 9)
         
         table.attach(gtk.Label("kg"), 4, 5, 8, 9)
 
-        label = gtk.Label(xstr("weighthelp_dow"))
-        label.set_use_markup(True)
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(label)
-        table.attach(alignment, 0, 1, 9, 10)
-
-        self._dow = gtk.Label("35000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._dow)
-        table.attach(alignment, 1, 2, 9, 10)
-        
-        table.attach(gtk.Label("kg"), 2, 3, 9, 10)
-
-        self._fsDOW = gtk.Label("33012")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._fsDOW)
-        table.attach(alignment, 3, 4, 9, 10)
-        
-        table.attach(gtk.Label("kg"), 4, 5, 9, 10)
-
-        table.attach(gtk.HSeparator(), 1, 2, 10, 11)
-
-        table.attach(gtk.HSeparator(), 3, 4, 10, 11)
+        table.attach(gtk.HSeparator(), 1, 2, 9, 10)
+
+        table.attach(gtk.HSeparator(), 3, 4, 9, 10)
 
         label = gtk.Label("<b>" + xstr("weighthelp_zfw") + "</b>")
@@ -239,5 +223,5 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(label)
-        table.attach(alignment, 0, 1, 11, 12)
+        table.attach(alignment, 0, 1, 10, 11)
 
         self._zfw = gtk.Label("<b>122000</b>")
@@ -246,7 +230,7 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(self._zfw)
-        table.attach(alignment, 1, 2, 11, 12)
-        
-        table.attach(gtk.Label("kg"), 2, 3, 11, 12)
+        table.attach(alignment, 1, 2, 10, 11)
+        
+        table.attach(gtk.Label("kg"), 2, 3, 10, 11)
 
         self._fsZFW = gtk.Label("<b>124000</b>")
@@ -255,9 +239,9 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(self._fsZFW)
-        table.attach(alignment, 3, 4, 11, 12)
-        
-        table.attach(gtk.Label("kg"), 4, 5, 11, 12)
-
-        table.attach(gtk.HSeparator(), 0, 5, 12, 13)
+        table.attach(alignment, 3, 4, 10, 11)
+        
+        table.attach(gtk.Label("kg"), 4, 5, 10, 11)
+
+        table.attach(gtk.HSeparator(), 0, 5, 11, 12)
         
         label = gtk.Label(xstr("weighthelp_gross"))
@@ -266,15 +250,30 @@
                                   xscale = 0.0, yscale = 0.0)
         alignment.add(label)
+        table.attach(alignment, 0, 1, 12, 13)
+
+        self._fsGross = gtk.Label("124000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._fsGross)
+        table.attach(alignment, 3, 4, 12, 13)
+        
+        table.attach(gtk.Label("kg"), 4, 5, 12, 13)
+
+        label = gtk.Label(xstr("weighthelp_mzfw"))
+        label.set_use_markup(True)
+        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(label)
         table.attach(alignment, 0, 1, 13, 14)
 
-        self._fsGross = gtk.Label("124000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._fsGross)
-        table.attach(alignment, 3, 4, 13, 14)
-        
-        table.attach(gtk.Label("kg"), 4, 5, 13, 14)
-
-        label = gtk.Label(xstr("weighthelp_mzfw"))
+        self._mzfw = gtk.Label("35000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._mzfw)
+        table.attach(alignment, 1, 2, 13, 14)
+        
+        table.attach(gtk.Label("kg"), 2, 3, 13, 14)
+
+        label = gtk.Label(xstr("weighthelp_mtow"))
         label.set_use_markup(True)
         alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
@@ -283,13 +282,13 @@
         table.attach(alignment, 0, 1, 14, 15)
 
-        self._mzfw = gtk.Label("35000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._mzfw)
+        self._mtow = gtk.Label("35000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._mtow)
         table.attach(alignment, 1, 2, 14, 15)
         
         table.attach(gtk.Label("kg"), 2, 3, 14, 15)
 
-        label = gtk.Label(xstr("weighthelp_mtow"))
+        label = gtk.Label(xstr("weighthelp_mlw"))
         label.set_use_markup(True)
         alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
@@ -298,26 +297,11 @@
         table.attach(alignment, 0, 1, 15, 16)
 
-        self._mtow = gtk.Label("35000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._mtow)
+        self._mlw = gtk.Label("35000")
+        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
+                                  xscale = 0.0, yscale = 0.0)
+        alignment.add(self._mlw)
         table.attach(alignment, 1, 2, 15, 16)
         
         table.attach(gtk.Label("kg"), 2, 3, 15, 16)
-
-        label = gtk.Label(xstr("weighthelp_mlw"))
-        label.set_use_markup(True)
-        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(label)
-        table.attach(alignment, 0, 1, 16, 17)
-
-        self._mlw = gtk.Label("35000")
-        alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
-                                  xscale = 0.0, yscale = 0.0)
-        alignment.add(self._mlw)
-        table.attach(alignment, 1, 2, 16, 17)
-        
-        table.attach(gtk.Label("kg"), 2, 3, 16, 17)
 
         self.show_all()
@@ -338,12 +322,7 @@
         self._weightsTable.set_sensitive(False)
         
-        self._cockpitCrew = -1
-        self._cabinCrew = -1
+        self._crew = -1
         self._pax = -1
-        self._dowCockpit = 2
-        self._cockpitCrewMemberWeight = 85.0
-        self._dowCabin = 2
-        self._cabinCrewMemberWeight = 75.0
-        self._humanWeight = 84.0
+        self._humanWeight = 82.0
         self._bag = -1
         self._cargo = -1
@@ -364,21 +343,11 @@
     def _setupCalculated(self):
         """Setup the labels for the calculated values."""
-        if self._cockpitCrew<0:
-            self._cockpitCrewLabel.set_text(xstr("weighthelp_cockpit_crew") % ("-",))
-            self._cockpitCrewWeight.set_text("-")
-        else:
-            self._cockpitCrewLabel.set_text(xstr("weighthelp_cockpit_crew") %
-                                            (str(self._cockpitCrew),))
-            crewWeight = (self._cockpitCrew - self._dowCockpit) * self._cockpitCrewMemberWeight
-            self._cockpitCrewWeight.set_text("%.0f" % (crewWeight,))
-            
-        if self._cabinCrew<0:
-            self._cabinCrewLabel.set_text(xstr("weighthelp_cabin_crew") % ("-",))
-            self._cabinCrewWeight.set_text("-")
-        else:
-            self._cabinCrewLabel.set_text(xstr("weighthelp_cabin_crew") %
-                                          (str(self._cabinCrew),))
-            crewWeight = (self._cabinCrew - self._dowCabin) * self._cabinCrewMemberWeight
-            self._cabinCrewWeight.set_text("%.0f" % (crewWeight,))
+        if self._crew<0:
+            self._crewLabel.set_text(xstr("weighthelp_crew") % ("-",))
+            self._crewWeight.set_text("-")
+        else:
+            self._crewLabel.set_text(xstr("weighthelp_crew") % (str(self._crew),))
+            crewWeight = self._crew * self._humanWeight
+            self._crewWeight.set_text("%.0f" % (crewWeight,))
             
         if self._pax<0:
@@ -454,15 +423,10 @@
         It returns a tuple with these two items. If any of the items cannot be
         calculated, that is -1."""
-        if self._cockpitCrew<0 or self._cabinCrew<0 or self._pax<0 or \
+        if self._crew<0 or self._pax<0 or \
                self._bag<0 or self._cargo<0 or self._mail<0:
             payload = -1
         else:
-            payload = \
-              (self._cockpitCrew - self._dowCockpit) * \
-              self._cockpitCrewMemberWeight + \
-              (self._cabinCrew - self._dowCabin) * \
-              self._cabinCrewMemberWeight + \
-              self._pax * self._humanWeight + \
-              self._bag + self._cargo + self._mail
+            payload = (self._crew + self._pax) * self._humanWeight + \
+                      self._bag + self._cargo + self._mail
 
         if payload<0 or self._dowValue<0:
@@ -480,6 +444,5 @@
         self._gui.logger.untimedMessage("The weight calculation help function was used by the pilot")
 
-        self._cockpitCrew = self._gui.numCockpitCrew
-        self._cabinCrew = self._gui.numCabinCrew
+        self._crew = self._gui.numCrew
         self._pax = self._gui.numPassengers
         self._bag = self._gui.bagWeight
@@ -488,8 +451,4 @@
         
         aircraft = self._gui.flight.aircraft
-        self._dowCockpit = aircraft.dowCockpit
-        self._cockpitCrewMemberWeight = aircraft.cockpitCrewWeight
-        self._dowCabin = aircraft.dowCabin
-        self._cabinCrewMemberWeight = aircraft.cabinCrewWeight
         self._humanWeight = aircraft.humanWeight
         self._dowValue = aircraft.dow
Index: src/mlx/i18n.py
===================================================================
--- src/mlx/i18n.py	(revision 298)
+++ src/mlx/i18n.py	(revision 919)
@@ -24,5 +24,5 @@
 def setLanguage(programDirectory, language):
     """Setup the internationalization support for the given language."""
-    print "i18n.setLanguage", language
+    print("i18n.setLanguage", language)
     translation = _getTranslation(programDirectory, language)
     fallback = _getFallbackFor(programDirectory, language)
Index: src/mlx/logger.py
===================================================================
--- src/mlx/logger.py	(revision 634)
+++ src/mlx/logger.py	(revision 919)
@@ -1,6 +1,6 @@
 
-from fs import sendMessage
-import const
-import util
+from .fs import sendMessage
+from . import const
+from . import util
 
 import sys
@@ -235,5 +235,5 @@
     def debug(self, msg):
         """Log a debug message."""
-        print "[DEBUG]", msg
+        print("[DEBUG]", msg)
 
     def stage(self, timestamp, stage):
@@ -326,5 +326,5 @@
         """Get the rating of the flight so far."""
         totalScore = 100
-        for fault in self._faults.itervalues():
+        for fault in self._faults.values():
             score = fault.score
             if score==Logger.NO_GO_SCORE:
Index: src/mlx/mlx.py
===================================================================
--- src/mlx/mlx.py	(revision 800)
+++ src/mlx/mlx.py	(revision 919)
@@ -1,9 +1,9 @@
 
-from config import Config
-from i18n import setLanguage
-from sound import preInitializeSound, initializeSound, finalizeSound
-from util import secondaryInstallation
-from const import VERSION
-from watchdog import Watchdog
+from .config import Config
+from .i18n import setLanguage
+from .sound import preInitializeSound, initializeSound, finalizeSound
+from .util import secondaryInstallation
+from .const import VERSION
+from .watchdog import Watchdog
 
 import os
@@ -60,5 +60,5 @@
 def main():
     """The main operation of the program."""
-    from singleton import SingleInstance, raiseCallbackWrapper
+    from .singleton import SingleInstance, raiseCallbackWrapper
 
     global instance
@@ -86,6 +86,6 @@
     sys.stderr = StdIOHandler(gui)
 
-    print "MAVA Logger X " + VERSION + " debug log"
-    print "The initial configuration:"
+    print("MAVA Logger X " + VERSION + " debug log")
+    print("The initial configuration:")
     config.log()
 
Index: src/mlx/pirep.py
===================================================================
--- src/mlx/pirep.py	(revision 908)
+++ src/mlx/pirep.py	(revision 919)
@@ -1,8 +1,8 @@
 
-from util import utf2unicode
-from flight import Flight
-
-import const
-import cPickle as pickle
+from .util import utf2unicode
+from .flight import Flight
+
+from . import const
+import pickle as pickle
 import calendar
 import datetime
@@ -65,5 +65,5 @@
     def decodeFlightTypeText(s):
         """Decode the given flight type text."""
-        for (flighType, text) in PIREP._flightTypes.iteritems():
+        for (flighType, text) in PIREP._flightTypes.items():
             if s==text:
                 return flighType
@@ -124,7 +124,7 @@
                     pirep.mailWeight = pirep.bookedFlight.mailWeight
                 return pirep
-        except Exception, e:
-            print "Failed loading PIREP from %s: %s" % (path,
-                                                        utf2unicode(str(e)))
+        except Exception as e:
+            print("Failed loading PIREP from %s: %s" % (path,
+                                                        utf2unicode(str(e))))
             return None
 
@@ -136,6 +136,4 @@
         self.bookedFlight = flight.bookedFlight
 
-        self.numCockpitCrew = flight.numCockpitCrew
-        self.numCabinCrew = flight.numCabinCrew
         self.numCrew = flight.numCrew
         self.numPassengers = flight.numPassengers
@@ -184,7 +182,5 @@
         self.bookedFlight = bookedFlight
 
-        self.numCockpitCrew = int(pirepData["numCockpitCrew"])
-        self.numCabinCrew = int(pirepData["numCabinCrew"])
-        self.numCrew = self.numCockpitCrew + self.numCabinCrew
+        self.numCrew = int(pirepData["numCrew"])
         self.numPassengers = int(pirepData["numPassengers"])
         self.bagWeight = int(pirepData["bagWeight"])
@@ -371,7 +367,7 @@
                 pickle.dump(self, f)
             return None
-        except Exception, e:
+        except Exception as e:
             error = utf2unicode(str(e))
-            print u"Failed saving PIREP to %s: %s" % (path, error)
+            print("Failed saving PIREP to %s: %s" % (path, error))
             return error
 
@@ -385,6 +381,4 @@
         attrs["arrivalICAO"] = self.bookedFlight.arrivalICAO
         attrs["numPassengers"] = self.numPassengers
-        attrs["numCockpitCrew"] = self.numCockpitCrew
-        attrs["numCabinCrew"] = self.numCabinCrew
         attrs["numCrew"] = self.numCrew
         attrs["cargoWeight"] = self.cargoWeight
Index: src/mlx/pyuipc_emu.py
===================================================================
--- src/mlx/pyuipc_emu.py	(revision 298)
+++ src/mlx/pyuipc_emu.py	(revision 919)
@@ -217,9 +217,9 @@
             results.append(int(vs / 60.0 * 0.3048 * 256))
         elif offset==0x0560:  # Latitude
-            results.append(long(latitude*10001750.0*65536.0*65536.0/90.0))
+            results.append(int(latitude*10001750.0*65536.0*65536.0/90.0))
         elif offset==0x0568:  # Longitude
-            results.append(long(longitude*65536.9*65536.0*65536.0*65536.0/360.0))
+            results.append(int(longitude*65536.9*65536.0*65536.0*65536.0/360.0))
         elif offset==0x0570:  # Aircraft altitude in metres (fractional part)
-            results.append(long( (altitude*0.3048*65536*65536)%(65536*65536)))
+            results.append(int( (altitude*0.3048*65536*65536)%(65536*65536)))
         elif offset==0x0574:  # Aircraft altitude in metres (whole part)
             results.append(int(altitude*.3048))
@@ -237,15 +237,15 @@
             centre_fuel = fuel_remaining - 2*side_tank_capacity
             if centre_fuel<0: centre_fuel = 0.0
-            results.append(long(round(centre_fuel/centre_tank_capacity*128.0*65536.0)))
+            results.append(int(round(centre_fuel/centre_tank_capacity*128.0*65536.0)))
         elif offset==0x0b78:  # Centre tank capacity (gallons)
-            results.append(long(round(centre_tank_capacity*KGTOLBS/fuel_weight)))
+            results.append(int(round(centre_tank_capacity*KGTOLBS/fuel_weight)))
         elif offset==0x0b7c or \
              offset==0x0b94:  # Left and right main tank level (%*128*65536)
             fuel = fuel_remaining/2
             if fuel>side_tank_capacity: fuel = side_tank_capacity
-            results.append(long(round(fuel/side_tank_capacity*128.0*65536.0)))
+            results.append(int(round(fuel/side_tank_capacity*128.0*65536.0)))
         elif offset==0x0b80 or \
              offset==0x0b98:  # Left and right main tank capacity (gallons)
-            results.append(long(round(side_tank_capacity*KGTOLBS/fuel_weight)))
+            results.append(int(round(side_tank_capacity*KGTOLBS/fuel_weight)))
         elif offset in [0x0b84, 0x0b88, 0x0b8c, 0x0b90,
                         0x0b9c, 0x0ba0, 0x0ba4, 0x0ba8,
@@ -253,5 +253,5 @@
                         0x1254, 0x1258, 0x125c, 0x1260]:
                               # Other tank capacities and levels
-            results.append(long(0))
+            results.append(int(0))
         elif offset==0x023a:  # Second of time
             results.append(int(tm[5]))
Index: src/mlx/pyuipc_sim.py
===================================================================
--- src/mlx/pyuipc_sim.py	(revision 877)
+++ src/mlx/pyuipc_sim.py	(revision 919)
@@ -1,4 +1,4 @@
 
-import const
+from . import const
 
 import cmd
@@ -9,5 +9,5 @@
 import sys
 import struct
-import cPickle
+import pickle
 import math
 
@@ -342,6 +342,6 @@
         try:
             return self._read(offset, type)
-        except Exception, e:
-            print "failed to read offset %04x: %s" % (offset, str(e))
+        except Exception as e:
+            print("failed to read offset %04x: %s" % (offset, str(e)))
             raise FSUIPCException(ERR_DATA)
 
@@ -414,9 +414,9 @@
             return 1 if self.overspeed else 0
         elif offset==0x0560:       # Latitude
-            return long(self.latitude * 10001750.0 * 65536.0 * 65536.0 / 90.0)
+            return int(self.latitude * 10001750.0 * 65536.0 * 65536.0 / 90.0)
         elif offset==0x0568:       # Longitude
-            return long(self.longitude * 65536.0 * 65536.0 * 65536.0 * 65536.0 / 360.0)
+            return int(self.longitude * 65536.0 * 65536.0 * 65536.0 * 65536.0 / 360.0)
         elif offset==0x0570:       # Altitude
-            return long(self.altitude * const.FEETTOMETRES * 65536.0 * 65536.0)
+            return int(self.altitude * const.FEETTOMETRES * 65536.0 * 65536.0)
         elif offset==0x0578:       # Pitch
             return int(self.pitch * 65536.0 * 65536.0 / 360.0)
@@ -584,8 +584,8 @@
                     return value
                 else:
-                    print "Unhandled offset: %04x" % (offset,)
+                    print("Unhandled offset: %04x" % (offset,))
                     raise FSUIPCException(ERR_DATA)
             else:
-                print "Unhandled offset: %04x" % (offset,)
+                print("Unhandled offset: %04x" % (offset,))
                 raise FSUIPCException(ERR_DATA)
         elif offset==0x32fa:       # Message duration
@@ -616,5 +616,5 @@
             return 0 if self.xpdrC else 1
         else:
-            print "Unhandled offset: %04x" % (offset,)
+            print("Unhandled offset: %04x" % (offset,))
             raise FSUIPCException(ERR_DATA)
 
@@ -623,8 +623,8 @@
         try:
             return self._write(offset, value, type)
-        except TypeError, e:
+        except TypeError as e:
             raise e
-        except Exception, e:
-            print "failed to write offset %04x: %s" % (offset, str(e))
+        except Exception as e:
+            print("failed to write offset %04x: %s" % (offset, str(e)))
             raise FSUIPCException(ERR_DATA)
 
@@ -852,8 +852,8 @@
                     hotkey[3] = (value>>24) & 0xff
                 else:
-                    print "Unhandled offset: %04x for type '%s'" % (offset, type)
+                    print("Unhandled offset: %04x for type '%s'" % (offset, type))
                     raise FSUIPCException(ERR_DATA)
             else:
-                print "Unhandled offset: %04x for type '%s'" % (offset, type)
+                print("Unhandled offset: %04x for type '%s'" % (offset, type))
                 raise FSUIPCException(ERR_DATA)
         elif offset==0x32fa:       # Message duration
@@ -882,5 +882,5 @@
             self.xpdrC = value==0
         else:
-            print "Unhandled offset: %04x" % (offset,)
+            print("Unhandled offset: %04x" % (offset,))
             raise FSUIPCException(ERR_DATA)
 
@@ -1039,5 +1039,5 @@
                 (length,) = struct.unpack("I", clientSocket.recv(4))
                 data = clientSocket.recv(length)
-                (call, args) = cPickle.loads(data)
+                (call, args) = pickle.loads(data)
                 exception = None
 
@@ -1061,14 +1061,14 @@
                     else:
                         break
-                except Exception, e:
+                except Exception as e:
                     exception = e
 
                 if exception is None:
-                    data = cPickle.dumps((RESULT_RETURNED, result))
+                    data = pickle.dumps((RESULT_RETURNED, result))
                 else:
-                    data = cPickle.dumps((RESULT_EXCEPTION, str(exception)))
+                    data = pickle.dumps((RESULT_EXCEPTION, str(exception)))
                 clientSocket.send(struct.pack("I", len(data)) + data)
-        except Exception, e:
-            print >> sys.stderr, "pyuipc_sim.Server._process: failed with exception:", str(e)
+        except Exception as e:
+            print("pyuipc_sim.Server._process: failed with exception:", str(e), file=sys.stderr)
         finally:
             try:
@@ -1112,14 +1112,14 @@
     def quit(self):
         """Quit from the simulator."""
-        data = cPickle.dumps((CALL_QUIT, None))
+        data = pickle.dumps((CALL_QUIT, None))
         self._socket.send(struct.pack("I", len(data)) + data)
 
     def _call(self, command, data):
         """Perform a call with the given command and data."""
-        data = cPickle.dumps((command, [data]))
+        data = pickle.dumps((command, [data]))
         self._socket.send(struct.pack("I", len(data)) + data)
         (length,) = struct.unpack("I", self._socket.recv(4))
         data = self._socket.recv(length)
-        (resultCode, result) = cPickle.loads(data)
+        (resultCode, result) = pickle.loads(data)
         if resultCode==RESULT_RETURNED:
             return result
@@ -1234,5 +1234,5 @@
                                            lambda value: value * 90.0 /
                                            10001750.0 / 65536.0 / 65536.0,
-                                           lambda word: long(float(word) *
+                                           lambda word: int(float(word) *
                                                              10001750.0 *
                                                              65536.0 * 65536.0 / 90.0))
@@ -1240,5 +1240,5 @@
                                             lambda value: value * 360.0 /
                                             65536.0 / 65536.0 / 65536.0 / 65536.0,
-                                            lambda word: long(float(word) *
+                                            lambda word: int(float(word) *
                                                               65536.0 * 65536.0 *
                                                               65536.0 * 65536.0 /
@@ -1300,5 +1300,5 @@
                                            const.FEETTOMETRES / 65536.0 /
                                            65536.0,
-                                           lambda word: long(float(word) *
+                                           lambda word: int(float(word) *
                                                              const.FEETTOMETRES *
                                                              65536.0 * 65536.0))
@@ -1487,5 +1487,5 @@
             self._valueHandlers["hotkey%d" % (i,)] = ([(0x3210 + i*4, "u")],
                                                       lambda value: "0x%08x" % (value,),
-                                                      lambda word: long(word, 16))
+                                                      lambda word: int(word, 16))
 
         self._valueHandlers["cog"] = ([(0x2ef8, "f")], lambda value: value,
@@ -1537,5 +1537,5 @@
         """Handle unhandle commands."""
         if line=="EOF":
-            print
+            print()
             return self.do_quit("")
         else:
@@ -1548,5 +1548,5 @@
         for name in names:
             if name not in self._valueHandlers:
-                print >> sys.stderr, "Unknown variable: " + name
+                print("Unknown variable: " + name, file=sys.stderr)
                 return False
             valueHandler = self._valueHandlers[name]
@@ -1565,10 +1565,10 @@
                                         else thisResults)
 
-                print name + "=" + str(value)
+                print(name + "=" + str(value))
 
                 index += numResults
                 i+=1
-        except Exception, e:
-            print >> sys.stderr, "Failed to read data: " + str(e)
+        except Exception as e:
+            print("Failed to read data: " + str(e), file=sys.stderr)
 
         return False
@@ -1576,5 +1576,5 @@
     def help_get(self):
         """Print help for the get command."""
-        print "get <variable> [<variable>...]"
+        print("get <variable> [<variable>...]")
 
     def complete_get(self, text, line, begidx, endidx):
@@ -1608,10 +1608,10 @@
             words = argument.split("=")
             if len(words)!=2:
-                print >> sys.stderr, "Invalid argument: " + argument
+                print("Invalid argument: " + argument, file=sys.stderr)
                 return False
 
             (name, value) = words
             if name not in self._valueHandlers:
-                print >> sys.stderr, "Unknown variable: " + name
+                print("Unknown variable: " + name, file=sys.stderr)
                 return False
 
@@ -1625,14 +1625,14 @@
                     data.append((offset, type, values[index]))
                     index += 1
-            except Exception, e:
-                print >> sys.stderr, "Invalid value '%s' for variable %s: %s" % \
-                      (value, name, str(e))
+            except Exception as e:
+                print("Invalid value '%s' for variable %s: %s" % \
+                      (value, name, str(e)), file=sys.stderr)
                 return False
 
         try:
             self._client.write(data)
-            print "Data written"
-        except Exception, e:
-            print >> sys.stderr, "Failed to write data: " + str(e)
+            print("Data written")
+        except Exception as e:
+            print("Failed to write data: " + str(e), file=sys.stderr)
 
         return False
@@ -1640,5 +1640,5 @@
     def help_set(self):
         """Print help for the set command."""
-        print "set <variable>=<value> [<variable>=<value>...]"
+        print("set <variable>=<value> [<variable>=<value>...]")
 
     def complete_set(self, text, line, begidx, endidx):
@@ -1654,12 +1654,12 @@
             value = int(args)
             self._client.setVersion(value)
-            print "Emulating version %d" % (value,)
-        except Exception, e:
-            print >> sys.stderr, "Failed to set the version: " + str(e)
+            print("Emulating version %d" % (value,))
+        except Exception as e:
+            print("Failed to set the version: " + str(e), file=sys.stderr)
 
     def help_setversion(self, usage = False):
         """Help for the setversion command"""
-        if usage: print "Usage:",
-        print "setversion <number>"
+        if usage: print("Usage:", end=' ')
+        print("setversion <number>")
 
     def do_close(self, args):
@@ -1667,7 +1667,7 @@
         try:
             self._client.close()
-            print "Connection closed"
-        except Exception, e:
-            print >> sys.stderr, "Failed to close the connection: " + str(e)
+            print("Connection closed")
+        except Exception as e:
+            print("Failed to close the connection: " + str(e), file=sys.stderr)
 
     def do_failopen(self, args):
@@ -1676,12 +1676,12 @@
             value = self.str2bool(args)
             self._client.failOpen(value)
-            print "Opening will%s fail" % ("" if value else " not",)
-        except Exception, e:
-            print >> sys.stderr, "Failed to set open failure: " + str(e)
+            print("Opening will%s fail" % ("" if value else " not",))
+        except Exception as e:
+            print("Failed to set open failure: " + str(e), file=sys.stderr)
 
     def help_failopen(self, usage = False):
         """Help for the failopen command"""
-        if usage: print "Usage:",
-        print "failopen yes|no"
+        if usage: print("Usage:", end=' ')
+        print("failopen yes|no")
 
     def complete_failopen(self, text, line, begidx, endidx):
Index: src/mlx/rpc.py
===================================================================
--- src/mlx/rpc.py	(revision 908)
+++ src/mlx/rpc.py	(revision 919)
@@ -1,6 +1,6 @@
-import const
-import rpccommon
-
-from common import MAVA_BASE_URL
+from . import const
+from . import rpccommon
+
+from .common import MAVA_BASE_URL
 
 import jsonrpclib
@@ -28,5 +28,5 @@
         For all other names, the value will be stored as the same-named
         attribute."""
-        for (key, value) in value.iteritems():
+        for (key, value) in value.items():
             if key in instructions:
                 instruction = instructions[key]
@@ -37,6 +37,6 @@
                     value = instruction(value)
                 except:
-                    print >> sys.stderr, "Failed to convert value '%s' of attribute '%s':" % \
-                        (value, key)
+                    print("Failed to convert value '%s' of attribute '%s':" % \
+                        (value, key), file=sys.stderr)
                     import traceback
                     traceback.print_exc()
@@ -208,6 +208,5 @@
                       "TU5"  : const.AIRCRAFT_T154,
                       "YK4"  : const.AIRCRAFT_YK40,
-                      "146"  : const.AIRCRAFT_B462,
-                      "IL6"  : const.AIRCRAFT_IL62 }
+                      "146"  : const.AIRCRAFT_B462 }
 
     # FIXME: copied from web.BookedFlight
@@ -229,6 +228,5 @@
                       const.AIRCRAFT_T154  : "TU5",
                       const.AIRCRAFT_YK40  : "YK4",
-                      const.AIRCRAFT_B462  : "146",
-                      const.AIRCRAFT_IL62  : "IL6" }
+                      const.AIRCRAFT_B462  : "146" }
 
     # FIXME: copied from web.BookedFlight
@@ -236,6 +234,6 @@
     def _decodeAircraftType(typeCode):
         """Decode the aircraft type from the given typeCode."""
-        if typeCode in const.icao2Type:
-            return const.icao2Type[typeCode]
+        if typeCode in BookedFlight.TYPECODE2TYPE:
+            return BookedFlight.TYPECODE2TYPE[typeCode]
         else:
             raise Exception("Invalid aircraft type code: '" + typeCode + "'")
@@ -277,6 +275,5 @@
     _instructions = {
         "numPassengers" : int,
-        "numCockpitCrew" : int,
-        "numCabinCrew" : int,
+        "numCrew" : int,
         "bagWeight" : int,
         "cargoWeight" : int,
@@ -300,26 +297,26 @@
     def writeIntoFile(self, f):
         """Write the flight into a file."""
-        print >> f, "callsign=%s" % (self.callsign,)
+        print("callsign=%s" % (self.callsign,), file=f)
         date = self.departureTime.date()
-        print >> f, "date=%04d-%02d-%0d" % (date.year, date.month, date.day)
-        print >> f, "dep_airport=%s" % (self.departureICAO,)
-        print >> f, "dest_airport=%s" % (self.arrivalICAO,)
-        print >> f, "planecode=%s" % \
-              (BookedFlight.TYPE2TYPECODE[self.aircraftType],)
-        print >> f, "planetype=%s" % (self.aircraftTypeName,)
-        print >> f, "tail_nr=%s" % (self.tailNumber,)
-        print >> f, "passenger=%d" % (self.numPassengers,)
-        print >> f, "crew=%d" % (self.numCockpitrew + self.numCabinCrew,)
-        print >> f, "bag=%d" % (self.bagWeight,)
-        print >> f, "cargo=%d" % (self.cargoWeight,)
-        print >> f, "mail=%d" % (self.mailWeight,)
-        print >> f, "flight_route=%s" % (self.route,)
+        print("date=%04d-%02d-%0d" % (date.year, date.month, date.day), file=f)
+        print("dep_airport=%s" % (self.departureICAO,), file=f)
+        print("dest_airport=%s" % (self.arrivalICAO,), file=f)
+        print("planecode=%s" % \
+              (BookedFlight.TYPE2TYPECODE[self.aircraftType],), file=f)
+        print("planetype=%s" % (self.aircraftTypeName,), file=f)
+        print("tail_nr=%s" % (self.tailNumber,), file=f)
+        print("passenger=%d" % (self.numPassengers,), file=f)
+        print("crew=%d" % (self.numCrew,), file=f)
+        print("bag=%d" % (self.bagWeight,), file=f)
+        print("cargo=%d" % (self.cargoWeight,), file=f)
+        print("mail=%d" % (self.mailWeight,), file=f)
+        print("flight_route=%s" % (self.route,), file=f)
         departureTime = self.departureTime
-        print >> f, "departure_time=%02d\\:%02d\\:%02d" % \
-              (departureTime.hour, departureTime.minute, departureTime.second)
+        print("departure_time=%02d\\:%02d\\:%02d" % \
+              (departureTime.hour, departureTime.minute, departureTime.second), file=f)
         arrivalTime = self.arrivalTime
-        print >> f, "arrival_time=%02d\\:%02d\\:%02d" % \
-              (arrivalTime.hour, arrivalTime.minute, arrivalTime.second)
-        print >> f, "foglalas_id=%s" % ("0" if self.id is None else self.id,)
+        print("arrival_time=%02d\\:%02d\\:%02d" % \
+              (arrivalTime.hour, arrivalTime.minute, arrivalTime.second), file=f)
+        print("foglalas_id=%s" % ("0" if self.id is None else self.id,), file=f)
 
 #---------------------------------------------------------------------------------------
@@ -379,22 +376,4 @@
         for planeValue in value:
             self._addPlane(Plane(planeValue))
-
-#---------------------------------------------------------------------------------------
-
-class AircraftTypeInfo(RPCObject):
-    """Information about an aircraft type."""
-    # The instructions for the construction
-    _instructions = {
-        "dow" : int,
-        "dowCockpit" : int,
-        "dowCabin" : int,
-        }
-
-    def __init__(self, value):
-        """Construct the booked flight object from the given RPC result
-        value."""
-        super(AircraftTypeInfo, self).__init__(value,
-                                               AircraftTypeInfo._instructions)
-        self.aircraftType = const.icao2Type[value["typeCode"]]
 
 #---------------------------------------------------------------------------------------
@@ -519,5 +498,5 @@
             self._sessionID = reply.value["sessionID"]
 
-            types = [const.icao2Type[typeCode]
+            types = [BookedFlight.TYPECODE2TYPE[typeCode]
                      for typeCode in reply.value["typeCodes"]]
 
@@ -525,11 +504,4 @@
         else:
             return None
-
-    def getTypes(self):
-        """Get the data of the aircraft types supported by us."""
-        value = self._performCall(lambda sessionID:
-                                  self._server.getTypes(sessionID))
-
-        return [AircraftTypeInfo(t) for t in value]
 
     def getFlights(self):
@@ -627,5 +599,5 @@
         of type codes, if any."""
         typeCodes = None if types is None else \
-          [const.icaoCodes[type] for type in types]
+            [BookedFlight.TYPE2TYPECODE[type] for type in types]
 
         values = self._performCall(lambda sessionID:
Index: src/mlx/rpccommon.py
===================================================================
--- src/mlx/rpccommon.py	(revision 742)
+++ src/mlx/rpccommon.py	(revision 919)
@@ -3,5 +3,5 @@
 #------------------------------------------------------------------------------
 
-import const
+from . import const
 
 #------------------------------------------------------------------------------
@@ -51,5 +51,5 @@
         """Check if the gate of the given plane conflicts with another plane's
         position."""
-        for p in self._planes.itervalues():
+        for p in self._planes.values():
             if p.tailNumber!=plane.tailNumber and \
                p.status==const.PLANE_HOME and \
@@ -62,5 +62,5 @@
         """Get a set containing the numbers of the gates occupied by planes."""
         gateNumbers = set()
-        for p in self._planes.itervalues():
+        for p in self._planes.values():
             if p.status==const.PLANE_HOME and p.gateNumber:
                 gateNumbers.add(p.gateNumber)
@@ -80,5 +80,5 @@
     def __iter__(self):
         """Get an iterator over the planes."""
-        for plane in self._planes.itervalues():
+        for plane in self._planes.values():
             yield plane
 
Index: src/mlx/singleton.py
===================================================================
--- src/mlx/singleton.py	(revision 401)
+++ src/mlx/singleton.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from util import utf2unicode
+from .util import utf2unicode
 
 import os
@@ -59,8 +59,8 @@
                         break
 
-                    print "singleton._PipeServer.run: created the pipe"
+                    print("singleton._PipeServer.run: created the pipe")
                     try:
                         if win32pipe.ConnectNamedPipe(handle)==0:
-                            print "singleton._PipeServer.run: client connection received"
+                            print("singleton._PipeServer.run: client connection received")
                             (code, message) = \
                                 win32file.ReadFile(handle,
@@ -69,17 +69,17 @@
 
                             if code==0:
-                                print "singleton._PipeServer.run: message received from client"
+                                print("singleton._PipeServer.run: message received from client")
                                 self._raiseCallback()
                             else:
-                                print "singleton._PipeServer.run: failed to read from the pipe"
-                    except Exception, e:
-                        print "singleton._PipeServer.run: exception:",
-                        print utf2unicode(str(e))
+                                print("singleton._PipeServer.run: failed to read from the pipe")
+                    except Exception as e:
+                        print("singleton._PipeServer.run: exception:", end=' ')
+                        print(utf2unicode(str(e)))
                     finally:
                         win32pipe.DisconnectNamedPipe(handle)
                         win32file.CloseHandle(handle)
-            except Exception, e:
-                print "singleton._PipeServer.run: fatal exception:",
-                print utf2unicode(str(e))
+            except Exception as e:
+                print("singleton._PipeServer.run: fatal exception:", end=' ')
+                print(utf2unicode(str(e)))
                             
         def _createPipe(self):
@@ -96,5 +96,5 @@
                                                None)
             if handle==win32file.INVALID_HANDLE_VALUE:
-                print "singleton._PipeServer.run: could not create the handle"
+                print("singleton._PipeServer.run: could not create the handle")
                 return None
             else:
@@ -144,10 +144,10 @@
                     f.close()
                     return
-                except Exception, e:
-                    print "SingleInstance._notifySingleton: failed:",
-                    print utf2unicode(str(e))
+                except Exception as e:
+                    print("SingleInstance._notifySingleton: failed:", end=' ')
+                    print(utf2unicode(str(e)))
                     time.sleep(0.5)
         
-        def __nonzero__(self):
+        def __bool__(self):
             """Return a boolean representation of the object.
 
@@ -194,7 +194,7 @@
                     s.recv(64)
                     self._raiseCallback()
-            except Exception, e:
-                print "singleton._SocketServer.run: fatal exception:",
-                print utf2unicode(str(e))
+            except Exception as e:
+                print("singleton._SocketServer.run: fatal exception:", end=' ')
+                print(utf2unicode(str(e)))
     
     class SingleInstance(object):
@@ -218,5 +218,5 @@
                 fcntl.lockf(self._lockFile, fcntl.LOCK_EX | fcntl.LOCK_NB)
                 self._isSingle = True
-            except Exception, e:
+            except Exception as e:
                 self._lockFile.close()
                 self._lockFile = None
@@ -259,10 +259,10 @@
                     s.close()
                     return
-                except Exception, e:
-                    print "singleton.SingleInstance._notifySingleton: failed:",
-                    print utf2unicode(str(e))
+                except Exception as e:
+                    print("singleton.SingleInstance._notifySingleton: failed:", end=' ')
+                    print(utf2unicode(str(e)))
                     time.sleep(0.5)
 
-        def __nonzero__(self):
+        def __bool__(self):
             """Return a boolean representation of the object.
 
@@ -299,11 +299,11 @@
 if __name__=="__main__":
     def raiseCallback():
-        print "Raise the window!"
+        print("Raise the window!")
 
     instance = SingleInstance("mlx", raiseCallback)
     if instance:
-        print "The first instance"
+        print("The first instance")
         time.sleep(10)
     else:
-        print "The program is already running."
-
+        print("The program is already running.")
+
Index: src/mlx/sound.py
===================================================================
--- src/mlx/sound.py	(revision 800)
+++ src/mlx/sound.py	(revision 919)
@@ -1,4 +1,4 @@
 
-from util import utf2unicode
+from .util import utf2unicode
 
 import os
@@ -113,10 +113,10 @@
                     success = True
                     try:
-                        print "Closing", alias
+                        print("Closing", alias)
                         self._mci.send("close " + alias)
-                        print "Closed", alias
-                    except Exception, e:
-                        print "Failed closing " + alias + ":",
-                        print utf2unicode(str(e))
+                        print("Closed", alias)
+                    except Exception as e:
+                        print("Failed closing " + alias + ":", end=' ')
+                        print(utf2unicode(str(e)))
                         success = False
 
@@ -130,5 +130,5 @@
                     try:
                         alias = "mlxsound%d" % (counter,)
-                        print "Starting to play", path, "as", alias
+                        print("Starting to play", path, "as", alias)
                         self._mci.send("open \"%s\" alias %s" % \
                                        (path, alias))
@@ -144,8 +144,8 @@
                             self._pending.append((timeout, (alias, finishData)))
                             self._pending.sort()
-                        print "Started to play", path
-                    except Exception, e:
-                        print "Failed to start playing " + path + ":",
-                        print utf2unicode(str(e))
+                        print("Started to play", path)
+                    except Exception as e:
+                        print("Failed to start playing " + path + ":", end=' ')
+                        print(utf2unicode(str(e)))
                         (finishCallback, extra) = finishData
                         if finishCallback is not None:
@@ -220,5 +220,5 @@
 
             Gst.init(None)
-        except Exception, e:
+        except Exception as e:
             outQueue.put(False)
             outQueue.put(e)
@@ -351,6 +351,6 @@
         else:
             exception = _inQueue.get()
-            print "The Gst library is missing from your system. It is needed for sound playback on Linux:"
-            print exception
+            print("The Gst library is missing from your system. It is needed for sound playback on Linux:")
+            print(exception)
 
     def startSound(name, finishCallback = None, extra = None):
@@ -387,5 +387,5 @@
 
     def callback(result, extra):
-        print "callback", result, extra
+        print("callback", result, extra)
 
     preInitializeSound()
@@ -393,5 +393,5 @@
     soundsPath = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                               "..", "..", "sounds"))
-    print "soundsPath:", soundsPath
+    print("soundsPath:", soundsPath)
     initializeSound(soundsPath)
     startSound("notam.mp3", finishCallback = callback, extra= "notam.mp3")
Index: src/mlx/soundsched.py
===================================================================
--- src/mlx/soundsched.py	(revision 352)
+++ src/mlx/soundsched.py	(revision 919)
@@ -1,6 +1,6 @@
 
-from sound import startSound
-import const
-import fs
+from .sound import startSound
+from . import const
+from . import fs
 
 import threading
@@ -64,7 +64,7 @@
         """Called when the playback of thee sound has finished (or failed)."""
         if success is None:
-            print "Failed to start sound", self._name
+            print("Failed to start sound", self._name)
         elif not success:
-            print "Failed to finish sound", self._name
+            print("Failed to finish sound", self._name)
         with Sound._lock:            
             self._playing -= 1
Index: src/mlx/test.py
===================================================================
--- src/mlx/test.py	(revision 27)
+++ src/mlx/test.py	(revision 919)
@@ -1,9 +1,9 @@
 # Test module
 
-import fs
-import flight
-import logger
-import acft
-import const
+from . import fs
+from . import flight
+from . import logger
+from . import acft
+from . import const
 
 import time
@@ -11,5 +11,5 @@
 
 def callback(data, extra):
-    print data
+    print(data)
 
 def main():
Index: src/mlx/update.py
===================================================================
--- src/mlx/update.py	(revision 788)
+++ src/mlx/update.py	(revision 919)
@@ -1,9 +1,9 @@
 
-from config import Config
-from util import utf2unicode
+from .config import Config
+from .util import utf2unicode
 
 import os
 import sys
-import urllib2
+import urllib.request, urllib.error, urllib.parse
 import tempfile
 import socket
@@ -57,5 +57,5 @@
 
         Each file is returned as a 3-tuple with items as in the file."""
-        for (path, (size, sum)) in self._files.iteritems():
+        for (path, (size, sum)) in self._files.items():
             yield (path, size, sum)
 
@@ -99,5 +99,5 @@
     def writeInto(self, file):
         """Write the manifest into the file at the given path."""
-        for (path, (size, sum)) in self._files.iteritems():
+        for (path, (size, sum)) in self._files.items():
             file.write("%s\t%d\t%s\n" % (path, size, sum))
 
@@ -207,6 +207,6 @@
         with open(manifestPath, "rt") as f:
             manifest.readFrom(f)
-    except Exception, e:
-        print "Error reading the manifest, ignoring:", utf2unicode(str(e))
+    except Exception as e:
+        print("Error reading the manifest, ignoring:", utf2unicode(str(e)))
         manifest = Manifest()
 
@@ -226,10 +226,10 @@
     try:
         updateManifest = Manifest()
-        f= urllib2.urlopen(updateURL + "/" + manifestName)
+        f= urllib.request.urlopen(updateURL + "/" + manifestName)
         updateManifest.readFrom(f)
 
-    except Exception, e:
+    except Exception as e:
         error = utf2unicode(str(e))
-        print >> sys.stderr, "Error downloading manifest:", error
+        print("Error downloading manifest:", error, file=sys.stderr)
         listener.failed(error)
         return None
@@ -298,6 +298,6 @@
                 pass
             os.rename(path, targetPath)
-        except Exception, e:
-            print "Cannot remove file " + path + ": " + utf2unicode(str(e))
+        except Exception as e:
+            print("Cannot remove file " + path + ": " + utf2unicode(str(e)))
 
 #------------------------------------------------------------------------------
@@ -359,5 +359,5 @@
                 
             with open(targetFile, "wb") as fout:
-                fin = urllib2.urlopen(updateURL + "/" + path)
+                fin = urllib.request.urlopen(updateURL + "/" + path)
                 while True:
                     data = fin.read(4096)
@@ -391,10 +391,10 @@
         
         listener.done()
-    except Exception, e:
+    except Exception as e:
         exc = traceback.format_exc()
-        print >> sys.stderr, utf2unicode(exc)
+        print(utf2unicode(exc), file=sys.stderr)
         
         error = utf2unicode(str(e))
-        print >> sys.stderr, "Error:", error
+        print("Error:", error, file=sys.stderr)
 
         listener.failed(error)
@@ -409,5 +409,5 @@
         f.close()
         return True
-    except Exception, e:
+    except Exception as e:
         return False
     finally:
@@ -439,8 +439,8 @@
                 listener.downloadedManifest()
             elif command=="setTotalSize":
-                listener.setTotalSize(int(words[1]), long(words[2]),
+                listener.setTotalSize(int(words[1]), int(words[2]),
                                       int(words[3]), int(words[4]))
             elif command=="setDownloaded":
-                listener.setDownloaded(long(words[1]))
+                listener.setDownloaded(int(words[1]))
             elif command=="startRenaming":
                 listener.startRenaming()
@@ -457,7 +457,7 @@
             elif command=="failed":
                 listener.failed(words[1])
-        except Exception, e:
-            print >> sys.stderr, "Failed to parse line '%s': %s" % \
-                  (line, utf2unicode(str(e)))
+        except Exception as e:
+            print("Failed to parse line '%s': %s" % \
+                  (line, utf2unicode(str(e))), file=sys.stderr)
 
     return buffer
@@ -514,7 +514,7 @@
             process.wait()
         
-    except Exception, e:
+    except Exception as e:
         error = utf2unicode(str(e))
-        print >> sys.stderr, "Failed updating:", error
+        print("Failed updating:", error, file=sys.stderr)
         listener.failed(error)
     finally:
@@ -563,10 +563,10 @@
             updateFiles(directory, updateURL, listener, updateManifest,
                         modifiedAndNew, removed, localRemoved)
-    except Exception, e:
+    except Exception as e:
         exc = traceback.format_exc()
-        print >> sys.stderr, utf2unicode(exc)
+        print(utf2unicode(exc), file=sys.stderr)
         
         error = utf2unicode(str(e))
-        print >> sys.stderr, "Update error:", error
+        print("Update error:", error, file=sys.stderr)
         
         listener.failed(error)
@@ -596,5 +596,5 @@
     except:
         exc = traceback.format_exc()
-        print >> sys.stderr, utf2unicode(exc)
+        print(utf2unicode(exc), file=sys.stderr)
 
 #------------------------------------------------------------------------------
Index: src/mlx/util.py
===================================================================
--- src/mlx/util.py	(revision 784)
+++ src/mlx/util.py	(revision 919)
@@ -43,7 +43,7 @@
 #------------------------------------------------------------------------------
 
-def getCoordinateString((latitude, longitude)):
+def getCoordinateString(xxx_todo_changeme):
     """Get the string representation of the given coordinate pair."""
-
+    (latitude, longitude) = xxx_todo_changeme
     latitude_str = getLatitudeString(latitude)
     longitude_str = getLongitudeString(longitude)
@@ -79,5 +79,5 @@
     (deg, min, sec, _sign) = getDegMinSec(degree)
 
-    return u"%s%d\u00b0%02d\u2032%02d\u2033" % (prefix, deg, min, sec)
+    return "%s%d\u00b0%02d\u2032%02d\u2033" % (prefix, deg, min, sec)
 
 #------------------------------------------------------------------------------
@@ -175,8 +175,8 @@
     """Convert the given text from UTF-8 encoding to unicode."""
     try:
-        return unicode(_utf8decoder(text)[0])
+        return str(_utf8decoder(text)[0])
     except:
         try:
-            return unicode(_latin2decoder(text)[0])
+            return str(_latin2decoder(text)[0])
         except:
-            return unicode(list(text))
+            return str(list(text))
Index: src/mlx/watchdog.py
===================================================================
--- src/mlx/watchdog.py	(revision 535)
+++ src/mlx/watchdog.py	(revision 919)
@@ -60,7 +60,7 @@
 
         if logTimeout:
-            print "Watchdog client %s has timed out!" % (self._name)
+            print("Watchdog client %s has timed out!" % (self._name))
         elif logCleared:
-            print "Watchdog client %s has been cleared." % (self._name)
+            print("Watchdog client %s has been cleared." % (self._name))
 
 #-----------------------------------------------------------------------------
@@ -115,5 +115,5 @@
 
             if t>=nextLogTime:
-                print "Watchdog.run: running"
+                print("Watchdog.run: running")
                 while t>=nextLogTime:
                     nextLogTime += self.LOG_INTERVAL
Index: src/mlx/web.py
===================================================================
--- src/mlx/web.py	(revision 908)
+++ src/mlx/web.py	(revision 919)
@@ -1,16 +1,16 @@
 
-import const
-import util
-from rpc import Registration
-import rpc
-import rpccommon
-
-from common import MAVA_BASE_URL
-from pirep import PIREP
+from . import const
+from . import util
+from .rpc import Registration
+from . import rpc
+from . import rpccommon
+
+from .common import MAVA_BASE_URL
+from .pirep import PIREP
 
 import threading
 import sys
-import urllib
-import urllib2
+import urllib.request, urllib.parse, urllib.error
+import urllib.request, urllib.error, urllib.parse
 import hashlib
 import time
@@ -19,6 +19,6 @@
 import traceback
 import xml.sax
-import xmlrpclib
-import HTMLParser
+import xmlrpc.client
+import html.parser
 
 #---------------------------------------------------------------------------------------
@@ -73,6 +73,5 @@
                       "TU5"  : const.AIRCRAFT_T154,
                       "YK4"  : const.AIRCRAFT_YK40,
-                      "146"  : const.AIRCRAFT_B462,
-                      "IL6"  : const.AIRCRAFT_IL62 }
+                      "146"  : const.AIRCRAFT_B462 }
 
     TYPE2TYPECODE = { const.AIRCRAFT_B736  : "736",
@@ -93,6 +92,5 @@
                       const.AIRCRAFT_T154  : "TU5",
                       const.AIRCRAFT_YK40  : "YK4",
-                      const.AIRCRAFT_B462  : "146",
-                      const.AIRCRAFT_IL62  : "IL6" }
+                      const.AIRCRAFT_B462  : "146" }
 
     checkFlightTypes = [ const.AIRCRAFT_B736, const.AIRCRAFT_B737,
@@ -130,6 +128,4 @@
 
         flight.numPassengers = 0
-        flight.numCockpitCrew = 2
-        flight.numCabinCrew = 2
         flight.numCrew = 2
         flight.bagWeight = 0
@@ -164,5 +160,5 @@
 
         date = readline(f)
-        print "web.BookedFlight.readFromWeb: date:", date
+        print("web.BookedFlight.readFromWeb: date:", date)
         if date=="0000-00-00": date = "0001-01-01"
 
@@ -237,6 +233,6 @@
 
                 if not lineOK:
-                    print "web.BookedFlight.readFromFile: line %d is invalid" % \
-                          (lineNumber,)
+                    print("web.BookedFlight.readFromFile: line %d is invalid" % \
+                          (lineNumber,))
 
             line = f.readline()
@@ -250,11 +246,8 @@
                                                             arrivalTime)
 
-        self.numCockpitCrew = self.numCrew
-        self.numCabinCrew = 0
-
         d = dir(self)
         for attribute in ["callsign", "departureICAO", "arrivalICAO",
-                          "aircraftType", "tailNumber", "numPassengers",
-                          "numCrew", "numCockpitCrew", "numCabinCrew",
+                          "aircraftType", "tailNumber",
+                          "numPassengers", "numCrew",
                           "bagWeight", "cargoWeight", "mailWeight",
                           "route", "departureTime", "arrivalTime"]:
@@ -286,10 +279,8 @@
 
         self.aircraftType = \
-          self._decodeAircraftICAOType(bookedFlightData["aircraftType"])
+          self._decodeAircraftType(bookedFlightData["aircraftType"])
         self.tailNumber = bookedFlightData["tailNumber"]
         self.numPassengers = int(bookedFlightData["numPassengers"])
-        self.numCockpitCrew = int(bookedFlightData["numCockpitCrew"])
-        self.numCabinCrew = int(bookedFlightData["numCabinCrew"])
-        self.numCrew = self.numCockpitCrew + self.numCabinCrew
+        self.numCrew = int(bookedFlightData["numCrew"])
         self.bagWeight = int(bookedFlightData["bagWeight"])
         self.cargoWeight = int(bookedFlightData["cargoWeight"])
@@ -299,26 +290,26 @@
     def writeIntoFile(self, f):
         """Write the flight into a file."""
-        print >> f, "callsign=%s" % (self.callsign,)
+        print("callsign=%s" % (self.callsign,), file=f)
         date = self.departureTime.date()
-        print >> f, "date=%04d-%02d-%0d" % (date.year, date.month, date.day)
-        print >> f, "dep_airport=%s" % (self.departureICAO,)
-        print >> f, "dest_airport=%s" % (self.arrivalICAO,)
-        print >> f, "planecode=%s" % \
-              (BookedFlight.TYPE2TYPECODE[self.aircraftType],)
-        print >> f, "planetype=%s" % (self.aircraftTypeName,)
-        print >> f, "tail_nr=%s" % (self.tailNumber,)
-        print >> f, "passenger=%d" % (self.numPassengers,)
-        print >> f, "crew=%d" % (self.numCrew,)
-        print >> f, "bag=%d" % (self.bagWeight,)
-        print >> f, "cargo=%d" % (self.cargoWeight,)
-        print >> f, "mail=%d" % (self.mailWeight,)
-        print >> f, "flight_route=%s" % (self.route,)
+        print("date=%04d-%02d-%0d" % (date.year, date.month, date.day), file=f)
+        print("dep_airport=%s" % (self.departureICAO,), file=f)
+        print("dest_airport=%s" % (self.arrivalICAO,), file=f)
+        print("planecode=%s" % \
+              (BookedFlight.TYPE2TYPECODE[self.aircraftType],), file=f)
+        print("planetype=%s" % (self.aircraftTypeName,), file=f)
+        print("tail_nr=%s" % (self.tailNumber,), file=f)
+        print("passenger=%d" % (self.numPassengers,), file=f)
+        print("crew=%d" % (self.numCrew,), file=f)
+        print("bag=%d" % (self.bagWeight,), file=f)
+        print("cargo=%d" % (self.cargoWeight,), file=f)
+        print("mail=%d" % (self.mailWeight,), file=f)
+        print("flight_route=%s" % (self.route,), file=f)
         departureTime = self.departureTime
-        print >> f, "departure_time=%02d\\:%02d\\:%02d" % \
-              (departureTime.hour, departureTime.minute, departureTime.second)
+        print("departure_time=%02d\\:%02d\\:%02d" % \
+              (departureTime.hour, departureTime.minute, departureTime.second), file=f)
         arrivalTime = self.arrivalTime
-        print >> f, "arrival_time=%02d\\:%02d\\:%02d" % \
-              (arrivalTime.hour, arrivalTime.minute, arrivalTime.second)
-        print >> f, "foglalas_id=%s" % ("0" if self.id is None else self.id,)
+        print("arrival_time=%02d\\:%02d\\:%02d" % \
+              (arrivalTime.hour, arrivalTime.minute, arrivalTime.second), file=f)
+        print("foglalas_id=%s" % ("0" if self.id is None else self.id,), file=f)
 
     def _readAircraftType(self, f):
@@ -333,11 +324,4 @@
         if typeCode in self.TYPECODE2TYPE:
             return self.TYPECODE2TYPE[typeCode]
-        else:
-            raise Exception("Invalid aircraft type code: '" + typeCode + "'")
-
-    def _decodeAircraftICAOType(self, typeCode):
-        """Decode the aircraft type from the given typeCode."""
-        if typeCode in const.icao2Type:
-            return const.icao2Type[typeCode]
         else:
             raise Exception("Invalid aircraft type code: '" + typeCode + "'")
@@ -380,5 +364,5 @@
 
         except:
-            print >> sys.stderr, "Plane string is invalid: '" + s + "'"
+            print("Plane string is invalid: '" + s + "'", file=sys.stderr)
             self.tailNumber = None
 
@@ -486,9 +470,9 @@
 #------------------------------------------------------------------------------
 
-class PilotsWebNOTAMsParser(HTMLParser.HTMLParser):
+class PilotsWebNOTAMsParser(html.parser.HTMLParser):
     """XML handler for the NOTAM query results on the PilotsWeb website."""
     def __init__(self):
         """Construct the handler."""
-        HTMLParser.HTMLParser.__init__(self)
+        html.parser.HTMLParser.__init__(self)
 
         self._notams = []
@@ -529,9 +513,9 @@
         try:
             notam = self._parseCurrentNOTAM2()
-        except Exception, e:
-            print "Error parsing current NOTAM: " + str(e)
+        except Exception as e:
+            print("Error parsing current NOTAM: " + str(e))
 
         if notam is None:
-            print "Could not parse NOTAM: " + self._currentNOTAM
+            print("Could not parse NOTAM: " + self._currentNOTAM)
             if self._currentNOTAM:
                 self._notams.append(self._currentNOTAM + "\n")
@@ -542,5 +526,5 @@
         """Parse the current NOTAM, if possible, and return a NOTAM object."""
         lines = self._currentNOTAM.splitlines()
-        lines = map(lambda line: line.strip(), lines)
+        lines = [line.strip() for line in lines]
 
         if len(lines)<4:
@@ -595,5 +579,5 @@
         """Parse the current NOTAM with a second, more flexible method."""
         lines = self._currentNOTAM.splitlines()
-        lines = map(lambda line: line.strip(), lines)
+        lines = [line.strip() for line in lines]
 
         if not lines:
@@ -608,5 +592,5 @@
                 lines = lines[:-1]
 
-        lines = map(lambda line: line.strip(), lines)
+        lines = [line.strip() for line in lines]
         contents = " ".join(lines).split()
 
@@ -669,6 +653,6 @@
         """Get a representation of the result."""
         s = "<Result:"
-        for (key, value) in self.__dict__.iteritems():
-            s += " " + key + "=" + unicode(value)
+        for (key, value) in self.__dict__.items():
+            s += " " + key + "=" + str(value)
         s += ">"
         return s
@@ -704,5 +688,5 @@
             result = self.run()
             returned = True
-        except Exception, e:
+        except Exception as e:
             traceback.print_exc()
             result = e
@@ -711,6 +695,6 @@
         try:
             self._callback(returned, result)
-        except Exception, e:
-            print >> sys.stderr, "web.Handler.Request.perform: callback throwed an exception: " + util.utf2unicode(str(e))
+        except Exception as e:
+            print("web.Handler.Request.perform: callback throwed an exception: " + util.utf2unicode(str(e)), file=sys.stderr)
             #traceback.print_exc()
 
@@ -785,5 +769,5 @@
         result = Result()
 
-        f = urllib2.urlopen(url, timeout = 10.0)
+        f = urllib.request.urlopen(url, timeout = 10.0)
 
         status = readline(f)
@@ -831,12 +815,8 @@
             result.types = loginResult[2]
             result.password = password
-
-            result.aircraftTypes = client.getTypes()
-
             flights = client.getFlights()
             result.flights = flights[0]
             result.reportedFlights = flights[1]
             result.rejectedFlights = flights[2]
-
             if result.rank=="STU":
                 reply = client.getEntryExamStatus()
@@ -900,5 +880,5 @@
         url = MAVA_BASE_URL + "/onlinegates_get.php"
 
-        f = urllib2.urlopen(url, timeout = 10.0)
+        f = urllib.request.urlopen(url, timeout = 10.0)
         result = Result()
         result.fleet = Fleet(f)
@@ -942,9 +922,9 @@
         gateNumber = self._gateNumber if self._gateNumber else ""
 
-        data = urllib.urlencode([("lajstrom", self._tailNumber),
+        data = urllib.parse.urlencode([("lajstrom", self._tailNumber),
                                  ("status", status),
                                  ("kapu", gateNumber)])
 
-        f = urllib2.urlopen(url, data, timeout = 10.0)
+        f = urllib.request.urlopen(url, data, timeout = 10.0)
         line = readline(f)
 
@@ -1003,5 +983,5 @@
             url = "http://notams.euroutepro.com/notams.xml"
 
-            f = urllib2.urlopen(url, timeout = 10.0)
+            f = urllib.request.urlopen(url, timeout = 10.0)
             try:
                 xmlParser.parse(f)
@@ -1032,5 +1012,5 @@
               (icao.upper(),)
 
-            f = urllib2.urlopen(url, timeout = 10.0)
+            f = urllib.request.urlopen(url, timeout = 10.0)
             try:
                 data = f.read(16384)
@@ -1043,8 +1023,8 @@
             return parser.getNOTAMs()
 
-        except Exception, e:
+        except Exception as e:
             traceback.print_exc()
-            print "mlx.web.GetNOTAMs.getPilotsWebNOTAMs: failed to get NOTAMs for '%s': %s" % \
-                  (icao, str(e))
+            print("mlx.web.GetNOTAMs.getPilotsWebNOTAMs: failed to get NOTAMs for '%s': %s" % \
+                  (icao, str(e)))
             return None
 
@@ -1062,5 +1042,5 @@
         """Perform the retrieval opf the METARs."""
         url = "http://www.aviationweather.gov/adds/dataserver_current/httpparam?"
-        data = urllib.urlencode([ ("dataSource" , "metars"),
+        data = urllib.parse.urlencode([ ("dataSource" , "metars"),
                                   ("requestType",  "retrieve"),
                                   ("format", "csv"),
@@ -1069,5 +1049,5 @@
                                   ("mostRecentForEachStation", "constraint")])
         url += data
-        f = urllib2.urlopen(url, timeout = 10.0)
+        f = urllib.request.urlopen(url, timeout = 10.0)
         try:
             result = Result()
@@ -1148,10 +1128,10 @@
         data["insdate"] = datetime.date.today().strftime("%Y-%m-%d")
 
-        postData = urllib.urlencode(data)
-        f = urllib2.urlopen(url, postData, timeout = 10.0)
+        postData = urllib.parse.urlencode(data)
+        f = urllib.request.urlopen(url, postData, timeout = 10.0)
         try:
             result = Result()
             line = f.readline().strip()
-            print "PIREP result from website:", line
+            print("PIREP result from website:", line)
             result.success = line=="OK"
             result.alreadyFlown = line=="MARVOLT"
@@ -1198,5 +1178,5 @@
     def run(self):
         """Perform the sending of the ACARS."""
-        print "Sending the online ACARS"
+        print("Sending the online ACARS")
 
         url = MAVA_BASE_URL  + "/acars2/acarsonline.php"
@@ -1224,5 +1204,5 @@
         data["event"] = acars.getEventText()
 
-        f = urllib2.urlopen(url, urllib.urlencode(data), timeout = 10.0)
+        f = urllib.request.urlopen(url, urllib.parse.urlencode(data), timeout = 10.0)
         try:
             result = Result()
@@ -1243,5 +1223,5 @@
     def run(self):
         """Perform the sending of the ACARS."""
-        print "Sending the online ACARS via JSON-RPC"
+        print("Sending the online ACARS via JSON-RPC")
 
         self._client.updateOnlineACARS(self._acars)
@@ -1263,5 +1243,5 @@
     def run(self):
         """Perform the sending of the bug report."""
-        serverProxy = xmlrpclib.ServerProxy("http://mlx.varadiistvan.hu/rpc")
+        serverProxy = xmlrpc.client.ServerProxy("http://mlx.varadiistvan.hu/rpc")
 
         result = Result()
@@ -1274,5 +1254,5 @@
         result.ticketID = serverProxy.ticket.create(self._summary, self._description,
                                                     attributes, True)
-        print "Created ticket with ID:", result.ticketID
+        print("Created ticket with ID:", result.ticketID)
         result.success = True
 
@@ -1308,5 +1288,5 @@
 
         pirepData = self._client.getPIREP(self._flightID)
-        print "pirepData:", pirepData
+        print("pirepData:", pirepData)
 
         bookedFlight = BookedFlight(self._flightID)
@@ -1532,5 +1512,5 @@
 
     def callback(returned, result):
-        print returned, unicode(result)
+        print(returned, str(result))
 
     handler = Handler()
Index: src/mlx/xplane.py
===================================================================
--- src/mlx/xplane.py	(revision 909)
+++ src/mlx/xplane.py	(revision 919)
@@ -1,7 +1,7 @@
 
-import fs
-import const
-import util
-from watchdog import Watchdog
+from . import fs
+from . import const
+from . import util
+from .watchdog import Watchdog
 
 import threading
@@ -106,5 +106,5 @@
             else:
                 return False
-        except ProtocolException, e:
+        except ProtocolException as e:
             self._result = None
             return True
@@ -241,6 +241,6 @@
         try:
             return fun()
-        except Exception, e:
-            print >> sys.stderr, util.utf2unicode(str(e))
+        except Exception as e:
+            print(util.utf2unicode(str(e)), file=sys.stderr)
             return None
 
@@ -312,6 +312,6 @@
             try:
                 multiGetter.execute()
-            except ProtocolException, e:
-                print "xplane.Handler._performRead: " + str(e)
+            except ProtocolException as e:
+                print("xplane.Handler._performRead: " + str(e))
                 raise
 
@@ -514,8 +514,8 @@
                 self._connected = True
                 return attempts
-            except Exception, e:
-                print "xplane.Handler._connect: connection failed: " + \
+            except Exception as e:
+                print("xplane.Handler._connect: connection failed: " + \
                       util.utf2unicode(str(e)) + \
-                      " (attempts: %d)" % (attempts,)
+                      " (attempts: %d)" % (attempts,))
                 if attempts<self.NUM_CONNECTATTEMPTS:
                     time.sleep(self.CONNECT_INTERVAL)
@@ -549,5 +549,5 @@
     def _disconnect(self):
         """Disconnect from the flight simulator."""
-        print "xplane.Handler._disconnect"
+        print("xplane.Handler._disconnect")
         if self._connected:
             try:
@@ -578,10 +578,10 @@
             try:
                 if not request.process(time):
-                    print "xplane.Handler._processRequest: X-Plane returned invalid data too many times, reconnecting"
+                    print("xplane.Handler._processRequest: X-Plane returned invalid data too many times, reconnecting")
                     needReconnect = True
             except Exception as e:
-                print "xplane.Handler._processRequest: X-Plane connection failed (" + \
+                print("xplane.Handler._processRequest: X-Plane connection failed (" + \
                       util.utf2unicode(str(e)) + \
-                      "), reconnecting (attempts=%d)." % (attempts,)
+                      "), reconnecting (attempts=%d)." % (attempts,))
                 needReconnect = True
 
@@ -804,5 +804,5 @@
 
         duration is the number of seconds to keep the message displayed."""
-        print "xplra.Simulator.sendMessage:", message
+        print("xplra.Simulator.sendMessage:", message)
         self._handler.requestShowMessage(message, duration,
                                          self._handleMessageSent,
@@ -887,5 +887,5 @@
         assert not self._monitoringRequested
 
-        print "xplra.Simulator.disconnect", closingMessage, duration
+        print("xplra.Simulator.disconnect", closingMessage, duration)
 
         self._stopNormal()
@@ -938,6 +938,6 @@
         if self._lastZuluSeconds is not None and \
            zuluSeconds<self._lastZuluSeconds:
-            print "xplane.Simulator._getTimestamp: Zulu seconds have gone backwards (%f -> %f), increasing day offset" % \
-              (self._lastZuluSeconds, zuluSeconds)
+            print("xplane.Simulator._getTimestamp: Zulu seconds have gone backwards (%f -> %f), increasing day offset" % \
+              (self._lastZuluSeconds, zuluSeconds))
             self._timestampDaysOffset += 1
 
@@ -1016,6 +1016,6 @@
             return False
 
-        print "xplane.Simulator: new data: %s, %s, %s, %s, %s, %s" % \
-              (tailnum, author, description, notes, icao, liveryPath)
+        print("xplane.Simulator: new data: %s, %s, %s, %s, %s, %s" % \
+              (tailnum, author, description, notes, icao, liveryPath))
 
         self._aircraftInfo = aircraftInfo
@@ -1140,6 +1140,7 @@
             self._handler.disconnect()
 
-    def _handleHotkeysRegistered(self, success, (id, generation)):
+    def _handleHotkeysRegistered(self, success, xxx_todo_changeme2):
         """Handle the result of the hotkeys having been written."""
+        (id, generation) = xxx_todo_changeme2
         with self._hotkeyLock:
             if success and id==self._hotkeySetID and \
@@ -1150,6 +1151,7 @@
                                                     (id, generation))
 
-    def _handleHotkeys(self, data, (id, generation)):
+    def _handleHotkeys(self, data, xxx_todo_changeme3):
         """Handle the hotkeys."""
+        (id, generation) = xxx_todo_changeme3
         with self._hotkeyLock:
             if id!=self._hotkeySetID or generation!=self._hotkeySetGeneration:
@@ -1617,6 +1619,6 @@
                               [level * self._fuelTankCapacities[index]]) )
             except:
-                print "xplane.Simulator.setFuelLevel: invalid tank constant: %d" % \
-                  (tank,)
+                print("xplane.Simulator.setFuelLevel: invalid tank constant: %d" % \
+                  (tank,))
 
         handler.requestWrite(data, self._handleFuelWritten)
@@ -1748,8 +1750,9 @@
     """Model handler for the FlyJSim Dash 8-Q400."""
     @staticmethod
-    def doesHandle(aircraft, (tailnum, author, description, notes,
-                              icao, liveryPath)):
+    def doesHandle(aircraft, xxx_todo_changeme):
         """Determine if this model handler handles the aircraft with the given
         name."""
+        (tailnum, author, description, notes,
+                              icao, liveryPath) = xxx_todo_changeme
         return aircraft.type==const.AIRCRAFT_DH8D and \
           description.find("Dash 8 Q400")!=-1 and \
@@ -1909,8 +1912,9 @@
     """Model for Felis' Tupolev Tu-154-M aircraft."""
     @staticmethod
-    def doesHandle(aircraft, (tailnum, author, description, notes,
-                              icao, liveryPath)):
+    def doesHandle(aircraft, xxx_todo_changeme1):
         """Determine if this model handler handles the aircraft with the given
         name."""
+        (tailnum, author, description, notes,
+                              icao, liveryPath) = xxx_todo_changeme1
         return aircraft.type==const.AIRCRAFT_T154 and \
           author.find("Felis")!=-1 and \
