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):
