   update_blocks();
   update_outputs();
 
-  // Special case: signals going back to PLUS free the route fixation.
-  // It also marks the related route as disallowed so that the handle
-  // shows up as having to change.
-  if (number == SIGNAL_A1 || number == SIGNAL_A2) {
-    if (new_position == PLUS) {
-      if (current_position[ROUTE_A1] == MINUS) {
-        position_is_ok[ROUTE_A1] = false;
-      }
-      if (current_position[ROUTE_A2] == MINUS) {
-        position_is_ok[ROUTE_A2] = false;
-      }
-      change_position(ROUTE_A_FIXATION, PLUS);
-    }
-  }
+  // Special case: fixating a route enables the corresponding signal. This way
+  // it can be thrown once (instead of through normal requirements, then it
+  // would have been possible to throw it multiple times). It also enables the
+  // corresponding route recall.
+  if (number == ROUTE_A_FIXATION && new_position == MINUS) {
+    requirements_fulfilled[ROUTE_A_RECALL] = true;
+    if (current_position[ROUTE_A1] == MINUS) {
+      requirements_fulfilled[SIGNAL_A1] = true;
+    }
+    if (current_position[ROUTE_A2] == MINUS) {
+      requirements_fulfilled[SIGNAL_A2] = true;
+    }
+  }
+
+  // Special case: route recall frees the route fixation.
+  if (number == ROUTE_A_RECALL) {
+    // Any new position is OK, we don't care which way the lock is turned.
+    change_position(ROUTE_A_FIXATION, PLUS);
+  }
+
+  // Special case: signals going back to PLUS remove their own "requirements
+  // fulfilled" marker.
+  if (number == SIGNAL_A1 && new_position == PLUS) {
+      requirements_fulfilled[SIGNAL_A1] = false;
+  }
+  if (number == SIGNAL_A2 && new_position == PLUS) {
+      requirements_fulfilled[SIGNAL_A2] = false;
+  }
+
 }
 
 


  if (current_position[ROUTE_A_FIXATION] == PLUS) {
    digitalWrite(PIN_LED_ROUTE_A_FIXATION, LOW);
  }
  else {
    digitalWrite(PIN_LED_ROUTE_A_FIXATION, HIGH);
  }

  // TODO: update the outgoing pins.

    // moving a signal back to PLUS).
    blocked[ROUTE_A_FIXATION] = true;
  }

  // Signals also block routes.
  if (current_position[SIGNAL_A1] == MINUS || current_position[SIGNAL_A2] == MINUS) {
    blocked[ROUTE_A1] = true;
    blocked[ROUTE_A2] = true;
  }
}


