Index: src/mlx/checks.py
===================================================================
--- src/mlx/checks.py	(revision 354)
+++ src/mlx/checks.py	(revision 355)
@@ -337,4 +337,12 @@
         self._firstChange = None
         self._lastChangeState = None
+        self._lastLoggedValue = None
+
+        self._logState = lambda flight, logger, state, forced = False: \
+            StateChangeLogger.logState(self, flight, logger, state,
+                                       forced = forced)
+        self.logState = lambda flight, logger, state, forced = False: \
+            DelayedChangeMixin.logState(self, flight, logger, state,
+                                        forced = forced)
 
     def _changed(self, oldState, state):
@@ -345,7 +353,11 @@
         newValue = self._getValue(state)
         if self._isDifferent(self._oldValue, newValue):
-            if self._firstChange is None:
-                self._firstChange = state.timestamp
-            self._lastChangeState = state
+            if self._lastLoggedValue is not None and \
+               not self._isDifferent(self._lastLoggedValue, newValue):
+                self._firstChange = None
+            else:
+                if self._firstChange is None:
+                    self._firstChange = state.timestamp
+                self._lastChangeState = state
             self._oldValue = newValue
 
@@ -370,4 +382,13 @@
         This default implementation checks for simple equality."""
         return oldValue!=newValue
+
+    def logState(self, flight, logger, state, forced):
+        """Log the given state.
+
+        The value belonging to that state is recorded in _lastLoggedValue.
+
+        It calls _logState to perform the real logging."""
+        self._lastLoggedValue = self._getValue(state)
+        self._logState(flight, logger, state, forced = forced)
 
 #---------------------------------------------------------------------------------------
@@ -408,38 +429,8 @@
 
 class ForceableLoggerMixin(object):
-    """A mixin for loggers that can be forced to log a certain state.
-
-    The last logged state is always maintained, and when checking for a change,
-    that state is compared to the current one (which may actually be the same,
-    if a forced logging was performed for that state).
-
-    Children should implement the following functions:
-    - _hasChanged(oldState, state): the real check for a change
-    - _logState(flight, logger, state, forced): the real logging function
-    """
-    def __init__(self):
-        """Construct the mixin."""
-        self._lastLoggedState = None
-
+    """A mixin for loggers that can be forced to log a certain state."""
     def forceLog(self, flight, logger, state):
         """Force logging the given state."""
         self.logState(flight, logger, state, forced = True)
-
-    def logState(self, flight, logger, state, forced = False):
-        """Log the state.
-
-        It calls _logState to perform the real logging, and saves the given
-        state as the last logged one."""
-        self._logState(flight, logger, state, forced)
-        self._lastLoggedState = state
-
-    def _changed(self, oldState, state):
-        """Check if the state has changed.
-
-        This function calls _hasChanged for the real check, and replaces
-        oldState with the stored last logged state, if any."""
-        if self._lastLoggedState is not None:
-            oldState = self._lastLoggedState
-        return self._hasChanged(oldState, state)
 
 #---------------------------------------------------------------------------------------
@@ -469,5 +460,5 @@
     """Logger for NAV radios.
 
-    It also logs the OBS frequency set."""
+    It also logs the OBS radial set."""
     @staticmethod
     def getMessage(logName, frequency, obs):
@@ -481,19 +472,8 @@
         StateChangeLogger.__init__(self, logInitial = True)
         DelayedChangeMixin.__init__(self)
-        ForceableLoggerMixin.__init__(self)
-
-        self.logState = lambda flight, logger, state, forced = False: \
-            ForceableLoggerMixin.logState(self, flight, logger, state,
-                                          forced = forced)
+
         self._getLogTimestamp = \
             lambda state, forced: \
             DelayedChangeMixin._getLogTimestamp(self, state, forced)
-        self._changed = lambda oldState, state: \
-            ForceableLoggerMixin._changed(self, oldState, state)
-        self._hasChanged = lambda oldState, state: \
-            DelayedChangeMixin._changed(self, oldState, state)
-        self._logState = lambda flight, logger, state, forced: \
-             StateChangeLogger.logState(self, flight, logger, state,
-                                        forced = forced)
 
         self._attrName = attrName
@@ -548,15 +528,4 @@
                                           "%s: %%s" % (logName,),
                                           minDelay = 3.0, maxDelay = 10.0)
-        ForceableLoggerMixin.__init__(self)
-
-        self.logState = lambda flight, logger, state, forced = False: \
-            ForceableLoggerMixin.logState(self, flight, logger, state,
-                                          forced = forced)
-        self._changed = lambda oldState, state: \
-            ForceableLoggerMixin._changed(self, oldState, state)
-        self._hasChanged = lambda oldState, state: \
-            DelayedChangeMixin._changed(self, oldState, state)
-        self._logState = lambda flight, logger, state, forced: \
-             StateChangeLogger.logState(self, flight, logger, state, forced)
 
 #---------------------------------------------------------------------------------------
@@ -725,4 +694,6 @@
         DelayedChangeMixin.__init__(self)
         self._lastLoggedState = None
+        self.logState = lambda flight, logger, state:\
+            APLogger.logState(self, flight, logger, state)
 
     def _getValue(self, state):
