Index: trunk/FACT++/src/biasctrl.cc
===================================================================
--- trunk/FACT++/src/biasctrl.cc	(revision 18142)
+++ trunk/FACT++/src/biasctrl.cc	(revision 18149)
@@ -274,9 +274,24 @@
             fPresent[board] = true;
 
-            if (fEmergencyLimit>0 && fCurrent[id]>fEmergencyLimit && !fEmergencyShutdown)
+            if (!fEmergencyShutdown)
             {
-                Info("Emergency shutdown initiated.");
-                RampAllDacs(0);
-                fEmergencyShutdown = true;
+                if (fCurrent[id]<0)
+                {
+                    Warn("OverCurrent detected.");
+                    fEmergencyShutdown = true;
+                }
+
+                if (fEmergencyLimit>0 && fCurrent[id]>fEmergencyLimit && !fEmergencyShutdown)
+                {
+                    Warn("Emergency limit exceeded.");
+                    fEmergencyShutdown = true;
+                }
+
+                if (fEmergencyShutdown)
+                {
+                    Error("Emergency ramp down initiated.");
+                    Dim::SendCommandNB("MCP/STOP");
+                    RampAllDacs(0);
+                }
             }
         }
@@ -433,6 +448,11 @@
             if (oc)
             {
-                Warn("OverCurrent detected - ramping stopped.");
-                fIsRamping = false;
+                if (!fEmergencyShutdown)
+                {
+                    Warn("OverCurrent detected - emergency ramp down initiated.");
+                    Dim::SendCommandNB("MCP/STOP");
+                    RampAllDacs(0);
+                    fEmergencyShutdown = true;
+                }
             }
             else
@@ -1890,8 +1910,8 @@
     }
 
-    int Shutdown()
+    int Shutdown(const string &reason)
     {
         fBias.RampAllDacs(0);
-        T::Info("Emergency shutdown initiated.");
+        T::Info("Emergency shutdown initiated ["+reason+"].");
         return State::kLocked;
     }
@@ -1899,4 +1919,5 @@
     int Unlock()
     {
+        fBias.ResetEmergencyShutdown();
         return fBias.GetStatus();
     }
@@ -1906,8 +1927,8 @@
         const int state = fBias.GetStatus();
 
-        if (fBias.IsEmergencyShutdown() && state>State::kInitializing && state<State::kExpertMode)
-        {
+        if (fBias.IsEmergencyShutdown()/* && state>State::kInitializing && state<State::kExpertMode*/)
+        {
+            // This needs to be repeated for the case that in between a different command was processed
             fBias.RampAllDacs(0);
-            fBias.ResetEmergencyShutdown();
             return State::kLocked;
         }
@@ -1923,8 +1944,5 @@
 
             if (shutdown)
-            {
-                T::Error("Voltage on at end of nautical twilight!");
-                Shutdown();
-            }
+                Shutdown("beginning of civil twilight");
 
             fSunRise = now.GetNextSunRise(-6);
@@ -2070,5 +2088,5 @@
             ("Set all channels to a zero reference voltage. Starts ramping if necessary.");
         T::AddEvent("SHUTDOWN")(State::kConnected)(State::kVoltageOff)(State::kVoltageOn)(State::kNotReferenced)(State::kOverCurrent)(State::kRamping)
-            (bind(&StateMachineBias::Shutdown, this))
+            (bind(&StateMachineBias::Shutdown, this, "user request"))
             ("Same as SET_ZERO_VOLTAGE; but goes to locked state afterwards.");
 
