Index: locale/en/mlx.po
===================================================================
--- locale/en/mlx.po	(revision 383)
+++ locale/en/mlx.po	(revision 384)
@@ -768,4 +768,16 @@
 msgstr "The takeoff safety speed in km/h."
 
+msgid "takeoff_derate"
+msgstr "Derate:"
+
+msgid "takeoff_derate_boeing"
+msgstr "Der_ate:"
+
+msgid "takeoff_derate_tupolev"
+msgstr "N_ominal/takeoff:"
+
+msgid "takeoff_derate_tooltip"
+msgstr "Enter the takeoff derate parameter."
+
 msgid "takeoff_rto"
 msgstr "R_ejected takeoff"
Index: locale/hu/mlx.po
===================================================================
--- locale/hu/mlx.po	(revision 383)
+++ locale/hu/mlx.po	(revision 384)
@@ -769,4 +769,16 @@
 msgstr "A biztonságos emelkedési sebesség km/órában."
 
+msgid "takeoff_derate"
+msgstr "Teljesítménycsökkentés:"
+
+msgid "takeoff_derate_boeing"
+msgstr "Teljesítménycsökkentés:"
+
+msgid "takeoff_derate_tupolev"
+msgstr "Névleges/felszállási:"
+
+msgid "takeoff_derate_tooltip"
+msgstr "Írd be a felszállási teljesítménycsökkentés értékét."
+
 msgid "takeoff_rto"
 msgstr "_Megszakított felszállás"
Index: src/mlx/acft.py
===================================================================
--- src/mlx/acft.py	(revision 369)
+++ src/mlx/acft.py	(revision 384)
@@ -3,4 +3,5 @@
 import checks
 import fs
+from i18n import xstr
 import util
 
@@ -74,4 +75,5 @@
 
         self._v1r2LineIndex = None
+        self._derateLineID = None
         self._vrefLineIndex = None
 
@@ -197,4 +199,24 @@
         return None if self._aircraftState is None \
                else self._aircraftState.timestamp
+
+    @property
+    def derateLabels(self):
+        """Get the strings related to the derate entry.
+
+        It returns a tuple of two items:
+        - the label before the entry field,
+        - the label after the entry field, which can be None.
+
+        If both labels are None, the derate value will not be logged or
+        queried. This is the default."""
+        return (None, None)
+
+    @property
+    def derateTemplate(self):
+        """Get the template for logging the derate value.
+
+        If it returns None (which is the default), no derate value will be
+        logged."""
+        return None
 
     def getFlapsSpeedLimit(self, flaps):
@@ -271,4 +293,5 @@
                 self._logRadios(aircraftState)
                 self._logV1R2(aircraftState)
+                self._logDerate(aircraftState)
             elif newStage==const.STAGE_DESCENT or newStage==const.STAGE_LANDING:
                 self._logRadios(aircraftState)
@@ -380,4 +403,10 @@
             self._logV1R2()
 
+    def updateDerate(self):
+        """Update the derate value from the flight, if the these values
+        have already been logged."""
+        if self._derateLineID is not None:
+            self._logDerate()
+
     def _appendLightsLoggers(self):
         """Append the loggers needed for the lights.
@@ -429,4 +458,21 @@
         else:
             self.logger.updateLine(self._v1r2LineIndex, message)
+
+    def _logDerate(self, state = None):
+        """Log the derate values either newly or by updating the corresponding
+        line."""
+        derateTemplate = self.derateTemplate
+        if derateTemplate is None:
+            return
+
+        derate = self._flight.derate
+        message = derateTemplate % ("-" if derate is None else derate)
+        if self._derateLineID is None:
+            if state is None:
+                state = self._aircraftState
+            self._derateLineID = \
+                self.logger.message(state.timestamp, message)
+        else:
+            self.logger.updateLine(self._derateLineID, message)
 
     def updateVRef(self):
@@ -502,4 +548,14 @@
                                  40 : 162 }
 
+    @property
+    def derateLabels(self):
+        """Get the derate strings for this type."""
+        return (xstr("takeoff_derate_boeing"), "%")
+
+    @property
+    def derateTemplate(self):
+        """Get the derate template for this aicraft type."""
+        return "Derate calculated by the pilot: %s %%"
+
     # def _appendSpeedChecker(self):
     #     """Append the NoStrobeSpeedChecker to the checkers.
@@ -626,4 +682,14 @@
                                  25 : 185,
                                  30 : 175 }
+
+    @property
+    def derateLabels(self):
+        """Get the derate strings for this type."""
+        return (xstr("takeoff_derate_boeing"), "%")
+
+    @property
+    def derateTemplate(self):
+        """Get the derate template for this aicraft type."""
+        return "Derate calculated by the pilot: %s %%"
 
 #---------------------------------------------------------------------------------------
@@ -697,4 +763,14 @@
         self.reverseMinSpeed = 50
 
+    @property
+    def derateLabels(self):
+        """Get the derate strings for this type."""
+        return ("EPR", None)
+
+    @property
+    def derateTemplate(self):
+        """Get the derate template for this aicraft type."""
+        return "EPR calculated by the pilot: %s"
+
 #---------------------------------------------------------------------------------------
 
@@ -751,4 +827,14 @@
 
     @property
+    def derateLabels(self):
+        """Get the derate strings for this type."""
+        return (xstr("takeoff_derate_tupolev"), None)
+
+    @property
+    def derateTemplate(self):
+        """Get the derate template for this aicraft type."""
+        return "Nominal/takeoff power calculated by the pilot: %s"
+
+    @property
     def speedInKnots(self):
         """Indicate if the speed is in knots."""
@@ -798,4 +884,14 @@
         return False
 
+    @property
+    def derateLabels(self):
+        """Get the derate strings for this type."""
+        return (xstr("takeoff_derate_tupolev"), None)
+
+    @property
+    def derateTemplate(self):
+        """Get the derate template for this aicraft type."""
+        return "Nominal/takeoff power calculated by the pilot: %s"
+
     def _appendLightsLoggers(self):
         """Append the loggers needed for the lights."""
@@ -811,5 +907,4 @@
 
 #---------------------------------------------------------------------------------------
-
 
 class YK40(Aircraft):
@@ -836,4 +931,14 @@
         """Indicate if the speed is in knots."""
         return False
+
+    @property
+    def derateLabels(self):
+        """Get the derate strings for this type."""
+        return (xstr("takeoff_derate_tupolev"), None)
+
+    @property
+    def derateTemplate(self):
+        """Get the derate template for this aicraft type."""
+        return "Nominal/takeoff power calculated by the pilot: %s"
 
     def _appendLightsLoggers(self):
Index: src/mlx/flight.py
===================================================================
--- src/mlx/flight.py	(revision 383)
+++ src/mlx/flight.py	(revision 384)
@@ -181,4 +181,9 @@
         """Get the V2 speed of the flight."""
         return self._gui.v2
+
+    @property
+    def derate(self):
+        """Get the derate value of the flight."""
+        return self._gui.derate
 
     @property
Index: src/mlx/gui/flight.py
===================================================================
--- src/mlx/gui/flight.py	(revision 383)
+++ src/mlx/gui/flight.py	(revision 384)
@@ -1999,5 +1999,5 @@
                                   xscale = 0.0, yscale = 0.0)
 
-        table = gtk.Table(6, 4)
+        table = gtk.Table(7, 4)
         table.set_row_spacings(4)
         table.set_col_spacings(16)
@@ -2044,4 +2044,5 @@
 
         self._v1Unit = gtk.Label(xstr("label_knots"))
+        self._v1Unit.set_alignment(0.0, 0.5)
         table.attach(self._v1Unit, 3, 4, 2, 3)
 
@@ -2060,4 +2061,5 @@
 
         self._vrUnit = gtk.Label(xstr("label_knots"))
+        self._vrUnit.set_alignment(0.0, 0.5)
         table.attach(self._vrUnit, 3, 4, 3, 4)
 
@@ -2076,5 +2078,27 @@
 
         self._v2Unit = gtk.Label(xstr("label_knots"))
+        self._v2Unit.set_alignment(0.0, 0.5)
         table.attach(self._v2Unit, 3, 4, 4, 5)
+
+        self._hasDerate = False
+
+        self._derateLabel = gtk.Label()
+        self._derateLabel.set_use_underline(True)
+        self._derateLabel.set_markup(xstr("takeoff_derate_tupolev"))
+        self._derateLabel.set_alignment(0.0, 0.5)
+        table.attach(self._derateLabel, 0, 1, 5, 6)
+
+        self._derate = gtk.Entry()
+        self._derate.set_width_chars(10)
+        self._derate.set_tooltip_text(xstr("takeoff_derate_tooltip"))
+        self._derate.set_alignment(1.0)
+        self._derate.connect("changed", self._derateChanged)
+        table.attach(self._derate, 1, 3, 5, 6)
+        self._derateLabel.set_mnemonic_widget(self._derate)
+
+        self._derateUnit = gtk.Label("")
+        self._derateUnit.set_use_markup(True)
+        self._derateUnit.set_alignment(0.0, 0.5)
+        table.attach(self._derateUnit, 3, 4, 5, 6)
 
         self._rto = gtk.CheckButton(xstr("takeoff_rto"))
@@ -2082,5 +2106,5 @@
         self._rto.set_tooltip_text(xstr("takeoff_rto_tooltip"))
         self._rto.connect("toggled", self._rtoToggled)
-        table.attach(self._rto, 2, 4, 5, 6, ypadding = 8)
+        table.attach(self._rto, 2, 4, 6, 7, ypadding = 8)
 
         self.addCancelFlightButton()
@@ -2114,4 +2138,13 @@
         """Get the v2 speed."""
         return self._v2.get_int()
+
+    @property
+    def derate(self):
+        """Get the derate value, if any."""
+        if self._hasDerate:
+            derate = self._derate.get_text()
+            return derate if derate else None
+        else:
+            return None
 
     @property
@@ -2143,4 +2176,24 @@
         self._v2.set_tooltip_markup(xstr("takeoff_v2_tooltip" + i18nSpeedUnit))
 
+        (derateLabel, derateUnit) = \
+             self._wizard.gui.flight.aircraft.derateLabels
+
+        self._hasDerate = derateLabel is not None
+
+        if self._hasDerate:
+            self._derateLabel.set_markup(derateLabel)
+            self._derateLabel.set_use_underline(True)
+            self._derateUnit.set_markup("" if derateUnit is None
+                                        else derateUnit)
+        else:
+            self._derateLabel.set_markup(xstr("takeoff_derate"))
+            self._derateUnit.set_text("")
+
+        self._derate.set_text("")
+
+        self._derateLabel.set_sensitive(self._hasDerate)
+        self._derate.set_sensitive(self._hasDerate)
+        self._derateUnit.set_sensitive(self._hasDerate)
+
         self._rto.set_active(False)
         self._rto.set_sensitive(False)
@@ -2160,4 +2213,6 @@
         self._vr.reset()
         self._v2.reset()
+
+        self._hasDerate = False
 
     def setRTOEnabled(self, enabled):
@@ -2176,5 +2231,6 @@
                     self.v2 is not None and \
                     self.v1 <= self.vr and \
-                    self.vr <= self.v2
+                    self.vr <= self.v2 and \
+                    (not self._hasDerate or self._derate.get_text()!="")
         self._button.set_sensitive(sensitive)
 
@@ -2189,4 +2245,8 @@
         self._valueChanged(entry, arg)
 
+    def _derateChanged(self, entry):
+        """Called when the value of the derate is changed."""
+        self._updateForwardButton()
+
     def _rtoToggled(self, button):
         """Called when the RTO check button is toggled."""
@@ -2200,4 +2260,6 @@
         """Called when the forward button is clicked."""
         self._wizard.gui.flight.aircraft.updateV1R2()
+        if self._hasDerate:
+            self._wizard.gui.flight.aircraft.updateDerate()
         self._wizard.nextPage()
 
@@ -3118,4 +3180,9 @@
         """Get the V2 speed."""
         return self._takeoffPage.v2
+
+    @property
+    def derate(self):
+        """Get the derate value."""
+        return self._takeoffPage.derate
 
     @property
Index: src/mlx/gui/gui.py
===================================================================
--- src/mlx/gui/gui.py	(revision 383)
+++ src/mlx/gui/gui.py	(revision 384)
@@ -306,4 +306,9 @@
         """Get the V2 speed calculated for the flight."""
         return self._wizard.v2
+
+    @property
+    def derate(self):
+        """Get the derate value calculated for the flight."""
+        return self._wizard.derate
 
     @property
