Index: trunk/FACT++/src/HeadersLid.h
===================================================================
--- trunk/FACT++/src/HeadersLid.h	(revision 18124)
+++ trunk/FACT++/src/HeadersLid.h	(revision 18125)
@@ -17,5 +17,6 @@
             kClosed,
             kOpen,
-            kMoving
+            kMoving,
+            kLocked
         };
     };
Index: trunk/FACT++/src/lidctrl.cc
===================================================================
--- trunk/FACT++/src/lidctrl.cc	(revision 18124)
+++ trunk/FACT++/src/lidctrl.cc	(revision 18125)
@@ -473,4 +473,5 @@
     S fLid;
     Time fLastCommand;
+    Time fSunRise;
 
     uint16_t fTimeToMove;
@@ -535,9 +536,15 @@
     }*/
 
+    int Unlock()
+    {
+        return fLid.GetState();
+    }
+
     int Execute()
     {
         const int rc = fLid.GetState();
-
-        if (T::GetCurrentState()==Lid::State::kMoving &&
+        const int state = T::GetCurrentState();
+
+        if (state==Lid::State::kMoving &&
             (rc==Lid::State::kConnected || rc==Lid::State::kDisconnected) &&
             fLastCommand+boost::posix_time::seconds(fTimeToMove+fLid.GetInterval()) > Time())
@@ -546,5 +553,23 @@
         }
 
-        return rc==Lid::State::kConnected ? T::GetCurrentState() : rc;
+        const Time now;
+        if (now>fSunRise)
+        {
+            if (state!=Lid::State::kClosed && state!=Lid::State::kLocked && state>Lid::State::kDisconnected)
+            {
+                T::Error("Lidctrl not in 'Closed' at end of nautical twilight!");
+                Close();
+            }
+
+            fSunRise = now.GetNextSunRise(-6);
+
+            ostringstream msg;
+            msg << "During next sun-rise nautical twilight will end at " << fSunRise;
+            T::Info(msg);
+
+            return Lid::State::kLocked;
+        }
+
+        return rc==Lid::State::kConnected ? state : rc;
     }
 
@@ -552,5 +577,6 @@
 public:
     StateMachineLidControl(ostream &out=cout) :
-        StateMachineAsio<T>(out, "LID_CONTROL"), fLid(*this, *this)
+        StateMachineAsio<T>(out, "LID_CONTROL"), fLid(*this, *this),
+        fSunRise(Time().GetNextSunRise(-6))
     {
         // State names
@@ -584,4 +610,7 @@
         T::AddStateName(Lid::State::kMoving, "Moving",
                      "Lids are supposed to move, waiting for next status");
+
+        T::AddStateName(Lid::State::kLocked, "Locked",
+                        "Locked, no commands accepted except UNLOCK.");
 
 
@@ -600,8 +629,12 @@
             ("Close the lids");
 
-        T::AddEvent("POST", "C")
+        T::AddEvent("POST", "C")(Lid::State::kUnidentified)(Lid::State::kInconsistent)(Lid::State::kUnknown)(Lid::State::kOvercurrent)(Lid::State::kPowerProblem)(Lid::State::kOpen)(Lid::State::kClosed)(Lid::State::kMoving)
             (bind(&StateMachineLidControl::Post, this, placeholders::_1))
             ("set verbosity state"
              "|verbosity[bool]:disable or enable verbosity for received data (yes/no), except dynamic data");
+
+        T::AddEvent("UNLOCK", Lid::State::kLocked)
+            (bind(&StateMachineLidControl::Unlock, this))
+            ("Unlock if in locked state.");
     }
 
