Index: /trunk/FACT++/Makefile.am
===================================================================
--- /trunk/FACT++/Makefile.am	(revision 17173)
+++ /trunk/FACT++/Makefile.am	(revision 17174)
@@ -47,6 +47,5 @@
 	showlog \
 	fitsdump fitscheck \
-	zfits \
-	fitsCompressor
+	zfits
 
 if HAS_GUI
@@ -453,5 +452,5 @@
 
 fitsdump_SOURCES = src/fitsdump.cc 
-fitsdump_LDADD   = $(ROOTLDFLAGS) $(ROOTLIBS) libConfiguration.la libTime.la
+fitsdump_LDADD   = $(ROOTLDFLAGS) $(ROOTLIBS) libConfiguration.la libTime.la libTools.la
 
 fitscheck_SOURCES = src/fitscheck.cc 
Index: /trunk/FACT++/Makefile.in
===================================================================
--- /trunk/FACT++/Makefile.in	(revision 17173)
+++ /trunk/FACT++/Makefile.in	(revision 17174)
@@ -53,7 +53,7 @@
 	temperature$(EXEEXT) timecheck$(EXEEXT) showlog$(EXEEXT) \
 	fitsdump$(EXEEXT) fitscheck$(EXEEXT) zfits$(EXEEXT) \
-	fitsCompressor$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
-	$(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5) \
-	$(am__EXEEXT_6) $(am__EXEEXT_7) $(am__EXEEXT_8)
+	$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+	$(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
+	$(am__EXEEXT_7) $(am__EXEEXT_8)
 @HAS_GUI_TRUE@am__append_1 = fact
 @HAS_DBUS_TRUE@am__append_2 = skypeclient
@@ -320,7 +320,4 @@
 feedback_DEPENDENCIES = libDim++.la libDim.la libDimExtension.la \
 	libStateMachine.la libTools.la libTime.la libConfiguration.la
-am_fitsCompressor_OBJECTS = src/fitsCompressor.$(OBJEXT)
-fitsCompressor_OBJECTS = $(am_fitsCompressor_OBJECTS)
-fitsCompressor_DEPENDENCIES = libConfiguration.la
 am_fitscheck_OBJECTS = src/fitscheck.$(OBJEXT)
 fitscheck_OBJECTS = $(am_fitscheck_OBJECTS)
@@ -329,5 +326,5 @@
 fitsdump_OBJECTS = $(am_fitsdump_OBJECTS)
 fitsdump_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	libConfiguration.la libTime.la
+	libConfiguration.la libTime.la libTools.la
 fitsgrep_SOURCES = fitsgrep.c
 fitsgrep_OBJECTS = fitsgrep.$(OBJEXT)
@@ -537,16 +534,16 @@
 	$(dns_SOURCES) $(drivectrl_SOURCES) $(dserver2_SOURCES) \
 	$(fact_SOURCES) $(fad_SOURCES) $(fadctrl_SOURCES) \
-	$(feedback_SOURCES) $(fitsCompressor_SOURCES) \
-	$(fitscheck_SOURCES) $(fitsdump_SOURCES) fitsgrep.c \
-	$(fitsloader_SOURCES) $(fsc_SOURCES) $(fscctrl_SOURCES) \
-	$(ftm_SOURCES) $(ftmctrl_SOURCES) $(gcn_SOURCES) \
-	$(lidctrl_SOURCES) $(log_SOURCES) $(logtime_SOURCES) \
-	$(magiclidar_SOURCES) $(magicweather_SOURCES) \
-	$(makedata_SOURCES) $(makeplots_SOURCES) $(mcp_SOURCES) \
-	$(moon_SOURCES) $(pwrctrl_SOURCES) $(ratecontrol_SOURCES) \
-	$(ratescan_SOURCES) $(readfits_SOURCES) sched.c \
-	$(scheduler_SOURCES) $(showlog_SOURCES) $(skypeclient_SOURCES) \
-	$(smartfact_SOURCES) $(temperature_SOURCES) $(test_SOURCES) \
-	$(time_SOURCES) $(timecheck_SOURCES) $(tngweather_SOURCES) \
+	$(feedback_SOURCES) $(fitscheck_SOURCES) $(fitsdump_SOURCES) \
+	fitsgrep.c $(fitsloader_SOURCES) $(fsc_SOURCES) \
+	$(fscctrl_SOURCES) $(ftm_SOURCES) $(ftmctrl_SOURCES) \
+	$(gcn_SOURCES) $(lidctrl_SOURCES) $(log_SOURCES) \
+	$(logtime_SOURCES) $(magiclidar_SOURCES) \
+	$(magicweather_SOURCES) $(makedata_SOURCES) \
+	$(makeplots_SOURCES) $(mcp_SOURCES) $(moon_SOURCES) \
+	$(pwrctrl_SOURCES) $(ratecontrol_SOURCES) $(ratescan_SOURCES) \
+	$(readfits_SOURCES) sched.c $(scheduler_SOURCES) \
+	$(showlog_SOURCES) $(skypeclient_SOURCES) $(smartfact_SOURCES) \
+	$(temperature_SOURCES) $(test_SOURCES) $(time_SOURCES) \
+	$(timecheck_SOURCES) $(tngweather_SOURCES) \
 	$(triggerschedule_SOURCES) $(viewer_SOURCES) $(webDid_SOURCES) \
 	$(zfits_SOURCES)
@@ -561,16 +558,15 @@
 	$(dserver2_SOURCES) $(am__fact_SOURCES_DIST) $(fad_SOURCES) \
 	$(am__fadctrl_SOURCES_DIST) $(feedback_SOURCES) \
-	$(fitsCompressor_SOURCES) $(fitscheck_SOURCES) \
-	$(fitsdump_SOURCES) fitsgrep.c $(fitsloader_SOURCES) \
-	$(fsc_SOURCES) $(fscctrl_SOURCES) $(ftm_SOURCES) \
-	$(ftmctrl_SOURCES) $(gcn_SOURCES) $(lidctrl_SOURCES) \
-	$(log_SOURCES) $(logtime_SOURCES) $(magiclidar_SOURCES) \
-	$(magicweather_SOURCES) $(makedata_SOURCES) \
-	$(makeplots_SOURCES) $(mcp_SOURCES) $(moon_SOURCES) \
-	$(pwrctrl_SOURCES) $(ratecontrol_SOURCES) $(ratescan_SOURCES) \
-	$(readfits_SOURCES) sched.c $(scheduler_SOURCES) \
-	$(showlog_SOURCES) $(skypeclient_SOURCES) $(smartfact_SOURCES) \
-	$(temperature_SOURCES) $(test_SOURCES) $(time_SOURCES) \
-	$(timecheck_SOURCES) $(tngweather_SOURCES) \
+	$(fitscheck_SOURCES) $(fitsdump_SOURCES) fitsgrep.c \
+	$(fitsloader_SOURCES) $(fsc_SOURCES) $(fscctrl_SOURCES) \
+	$(ftm_SOURCES) $(ftmctrl_SOURCES) $(gcn_SOURCES) \
+	$(lidctrl_SOURCES) $(log_SOURCES) $(logtime_SOURCES) \
+	$(magiclidar_SOURCES) $(magicweather_SOURCES) \
+	$(makedata_SOURCES) $(makeplots_SOURCES) $(mcp_SOURCES) \
+	$(moon_SOURCES) $(pwrctrl_SOURCES) $(ratecontrol_SOURCES) \
+	$(ratescan_SOURCES) $(readfits_SOURCES) sched.c \
+	$(scheduler_SOURCES) $(showlog_SOURCES) $(skypeclient_SOURCES) \
+	$(smartfact_SOURCES) $(temperature_SOURCES) $(test_SOURCES) \
+	$(time_SOURCES) $(timecheck_SOURCES) $(tngweather_SOURCES) \
 	$(triggerschedule_SOURCES) $(am__viewer_SOURCES_DIST) \
 	$(webDid_SOURCES) $(zfits_SOURCES)
@@ -1141,5 +1137,5 @@
 fitsloader_LDADD = libStateMachine.la libTools.la libTime.la libDim++.la libDim.la libConfiguration.la
 fitsdump_SOURCES = src/fitsdump.cc 
-fitsdump_LDADD = $(ROOTLDFLAGS) $(ROOTLIBS) libConfiguration.la libTime.la
+fitsdump_LDADD = $(ROOTLDFLAGS) $(ROOTLIBS) libConfiguration.la libTime.la libTools.la
 fitscheck_SOURCES = src/fitscheck.cc 
 fitscheck_LDADD = libConfiguration.la
@@ -1597,9 +1593,4 @@
 	@rm -f feedback$(EXEEXT)
 	$(AM_V_CXXLD)$(CXXLINK) $(feedback_OBJECTS) $(feedback_LDADD) $(LIBS)
-src/fitsCompressor.$(OBJEXT): src/$(am__dirstamp) \
-	src/$(DEPDIR)/$(am__dirstamp)
-fitsCompressor$(EXEEXT): $(fitsCompressor_OBJECTS) $(fitsCompressor_DEPENDENCIES) $(EXTRA_fitsCompressor_DEPENDENCIES) 
-	@rm -f fitsCompressor$(EXEEXT)
-	$(AM_V_CXXLD)$(CXXLINK) $(fitsCompressor_OBJECTS) $(fitsCompressor_LDADD) $(LIBS)
 src/fitscheck.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
@@ -1965,5 +1956,4 @@
 	-rm -f src/fadctrl.$(OBJEXT)
 	-rm -f src/feedback.$(OBJEXT)
-	-rm -f src/fitsCompressor.$(OBJEXT)
 	-rm -f src/fitscheck.$(OBJEXT)
 	-rm -f src/fitsdump.$(OBJEXT)
@@ -2114,5 +2104,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fadctrl.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/feedback.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fitsCompressor.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fitscheck.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fitsdump.Po@am__quote@
@@ -2953,4 +2942,5 @@
 
 doc: $(MAN_TARGETS) $(JAVA_SCRIPT_DOC) doxygen-run
+	@ln -s index.html doxygen-doc/html/main.html
 
 diff:
Index: /trunk/FACT++/aclocal.m4
===================================================================
--- /trunk/FACT++/aclocal.m4	(revision 17173)
+++ /trunk/FACT++/aclocal.m4	(revision 17174)
@@ -1725,5 +1725,5 @@
 #   exception to the GPL to apply to your modified version as well.
 
-#serial 16
+#serial 17
 
 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
@@ -1899,5 +1899,12 @@
         case "${host_cpu}-${host_os}" in
             *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
-            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+            *-osf* | *-hpux*) flag="-D_REENTRANT";;
+            *solaris*)
+            if test "$GCC" = "yes"; then
+                flag="-D_REENTRANT"
+            else
+                flag="-mt -D_REENTRANT"
+            fi
+            ;;
         esac
         AC_MSG_RESULT(${flag})
Index: /trunk/FACT++/configure
===================================================================
--- /trunk/FACT++/configure	(revision 17173)
+++ /trunk/FACT++/configure	(revision 17174)
@@ -18480,5 +18480,12 @@
         case "${host_cpu}-${host_os}" in
             *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
-            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+            *-osf* | *-hpux*) flag="-D_REENTRANT";;
+            *solaris*)
+            if test "$GCC" = "yes"; then
+                flag="-D_REENTRANT"
+            else
+                flag="-mt -D_REENTRANT"
+            fi
+            ;;
         esac
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
@@ -23970,5 +23977,5 @@
 
 		cat > conftest.$ac_ext <<EOF
-#line 23972 "configure"
+#line 23979 "configure"
 #include "confdefs.h"
 #include <qglobal.h>
Index: /trunk/FACT++/scripts/Main.js
===================================================================
--- /trunk/FACT++/scripts/Main.js	(revision 17173)
+++ /trunk/FACT++/scripts/Main.js	(revision 17174)
@@ -221,15 +221,12 @@
         return;
 
-    this.ok = cnt==0;
-
-    console.out("  DeltaUov=%.3f [N(>0.033V)=%d]".$(avg, cnt));
-}
-
-// DN:  Why is voltageOff() implemented as 
-//      a method of a Subscription to a specific Service
-//      I naively would think of voltageOff() as an unbound function.
-//      I seems to me it has to be a method of a Subscription object, in order
-//      to use the update counting method. But does it have to be
-//      a Subscription to FEEDBACK/DEVIATION, or could it work with other services as well?
+
+    this.ok = cnt==0 || (this.last!=undefined && Math.abs(this.last-avg)<0.002);
+
+    console.out("  DeltaUov=%.3f (%.3f) [N(>0.033V)=%d]".$(avg, Math.abs(this.last-avg), cnt));
+
+    this.last = avg;
+}
+
 service_feedback.voltageOff = function()
 {
@@ -247,6 +244,4 @@
     {
         dim.log("Switching voltage off.");
-
-        this.ok = undefined;
 
         // Supress the possibility that the bias control is
@@ -260,5 +255,5 @@
     }
 
-    dim.wait("BIAS_CONTROL", "VoltageOff", 60000);
+    dim.wait("BIAS_CONTROL", "VoltageOff", 60000); // FIXME: 30000?
 
     // FEEDBACK stays in CurrentCtrl when Voltage is off but output enabled
@@ -305,8 +300,8 @@
 
     // Wait until voltage on
-    dim.wait("BIAS_CONTROL", "VoltageOn", 60000);
-
-    if (isOff)
-        this.ok = false;
+    dim.wait("BIAS_CONTROL", "VoltageOn", 60000); // FIXME: 30000?
+
+//    if (isOff)
+//        this.ok = false;
 }
 
@@ -324,5 +319,8 @@
     var now = new Date();
 
-    v8.timeout(60000, func, this);
+    this.last = undefined;
+    this.ok = false;
+    v8.timeout(4*60000, func, this); // FIMXE: Remove 4!
+    this.ok = undefined;
 
     if (irq)
@@ -330,6 +328,4 @@
     else
         dim.log("Voltage stable within limits");
-
-    this.ok = undefined;
 }
 
@@ -378,9 +374,10 @@
     //dim.send("FEEDBACK/STOP");
     dim.send("FTM_CONTROL/STOP_TRIGGER");
+
+    dim.wait("FTM_CONTROL",  "Valid",        3000);
+    dim.wait("FEEDBACK",     "Calibrated",   3000);
+
     dim.send("BIAS_CONTROL/DISCONNECT");
-
-    dim.wait("FTM_CONTROL",  "Valid",        3000);
     dim.wait("BIAS_CONTROL", "Disconnected", 3000);
-    dim.wait("FEEDBACK",     "Calibrated",   3000);
 
     var report = sub.get();
@@ -806,6 +803,54 @@
         while (!irq && !takeRun("single-pe", 10000));
 
+        /*
+        // =================== new feedback ======================
+        dim.log("Switching to new bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new2.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOn", 3000);
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+
+        v8.sleep(60000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", true);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+
+        v8.sleep(60000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+        */
+        // =======================================================
+
         // It is unclear what comes next, so we better switch off the voltage
         service_feedback.voltageOff();
+
+        /*
+        // =============== Switch back to old feedback =============
+        dim.log("Switching to old bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOff", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+        // =========================================================
+        */
+
         system_on = true;
         dim.log("Task finished [STARTUP]");
@@ -909,5 +954,163 @@
         console.out("");
         break; // case "RATESCAN"
-
+/*
+    case "FEEDBACK-TEST":
+        // ----------------- Enable new feedback ---------------
+        service_feedback.voltageOff();
+        dim.log("Switching to new bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new2.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOff", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+
+        // ---------------- Take single pe run ------------------
+        CloseLid();
+        doDrsCalibration("singlepe");  // will turn voltage off
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+        v8.sleep(15000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", true);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+        v8.sleep(15000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        // ------------------ Ratescan --------------------------
+        var tm1 = new Date();
+
+        // This is a workaround to make sure that we really catch
+        // the new OnTrack state later and not the old one
+        dim.send("DRIVE_CONTROL/STOP");
+        dim.wait("DRIVE_CONTROL", "Armed", 15000);
+
+        // The lid must be open
+        OpenLid();
+
+        // The voltage must be switched on
+        service_feedback.voltageOn();
+
+        if (obs.source != undefined)
+        {
+            dim.log("Pointing telescope to '"+obs[cub].source+"'.");
+            dim.send("DRIVE_CONTROL/TRACK_ON", obs[sub].source);
+        }
+        else
+        {
+            dim.log("Pointing telescope to ra="+obs[sub].ra+" dec="+obs[sub].dec);
+            dim.send("DRIVE_CONTROL/TRACK", obs[sub].ra, obs[sub].dec);
+        }
+
+        dim.wait("DRIVE_CONTROL", "OnTrack", 150000); // 110s for turning and 30s for stabilizing
+
+        service_feedback.waitForVoltageOn();
+
+        var tm2 = new Date();
+
+        dim.log("Starting ratescan.");
+
+        // Start rate scan
+        dim.send("RATE_SCAN/START_THRESHOLD_SCAN", 50, 1000, -10);
+
+        // Lets wait if the ratescan really starts... this might take a few
+        // seconds because RATE_SCAN configures the ftm and is waiting for
+        // it to be configured.
+        dim.wait("RATE_SCAN", "InProgress", 10000);
+        dim.wait("RATE_SCAN", "Connected", 2700000);
+
+        // this line is actually some kind of hack. 
+        // after the Ratescan, no data is written to disk. I don't know why, but it happens all the time
+        // So I decided to put this line here as a kind of patchwork....
+        //dim.send("FAD_CONTROL/SET_FILE_FORMAT", 2);
+
+        dim.log("Ratescan done [%.1fs, %.1fs]".$((tm2-tm1)/1000, (new Date()-tm2)/1000));
+
+        // ------------------ Switch back --------------------------
+
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOn", 3000);
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 60000);
+
+        dim.log("Starting ratescan.");
+
+        // Start rate scan
+        dim.send("RATE_SCAN/START_THRESHOLD_SCAN", 50, 1000, -10);
+
+        // Lets wait if the ratescan really starts... this might take a few
+        // seconds because RATE_SCAN configures the ftm and is waiting for
+        // it to be configured.
+        dim.wait("RATE_SCAN", "InProgress", 10000);
+        dim.wait("RATE_SCAN", "Connected", 2700000);
+
+        // this line is actually some kind of hack. 
+        // after the Ratescan, no data is written to disk. I don't know why, but it happens all the time
+        // So I decided to put this line here as a kind of patchwork....
+        //dim.send("FAD_CONTROL/SET_FILE_FORMAT", 2);
+
+        dim.log("Ratescan done [%.1fs, %.1fs]".$((tm2-tm1)/1000, (new Date()-tm2)/1000));
+
+        dim.log("Task finished [FEEDBACK-TEST]");
+        console.out("");
+        break;
+
+    case "SINGLEPE-TEST":
+        // ----------------- Enable new feedback ---------------
+        service_feedback.voltageOff();
+        dim.log("Switching to new bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new2.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOff", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+
+        // ---------------- Take single pe run ------------------
+        CloseLid();
+        doDrsCalibration("singlepe");  // will turn voltage off
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", true);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+        v8.sleep(15000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        // ------------------ Switch back --------------------------
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOn", 3000);
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 60000);
+
+        dim.log("Task finished [SINGLEPE-TEST]");
+        console.out("");
+        break;
+*/
 
     case "DATA":
Index: /trunk/FACT++/scripts/Observation_class.js
===================================================================
--- /trunk/FACT++/scripts/Observation_class.js	(revision 17173)
+++ /trunk/FACT++/scripts/Observation_class.js	(revision 17174)
@@ -58,5 +58,5 @@
         case 'DATA':
             if (i!=obj.measurements.length-1)
-                throw new Error("DATA must be the last in the list of measurements");
+                throw new Error("DATA [n="+i+", "+utc.toUTCString()+"] must be the last in the list of measurements [cnt="+obj.measurements.length+"]");
             if (ret[i].source == undefined)
                 throw new Error("Observation must have either 'source' or 'task' " +
@@ -79,5 +79,12 @@
                                 "if 'task' == 'ratescan'");
             break;
-
+       /*
+        case 'FEEDBACK-TEST':
+            if (ret[i].source == undefined && (ret[i].ra == undefined || ret[i].dec == undefined))
+                throw new Error("Observation must have either 'source' or 'ra' & 'dec' " +
+                                "if 'task' == 'ratescan'");
+            break;
+        */
+        //case 'SINGLEPE-TEST':
         case 'SINGLEPE':
         case 'DRSCALIB':
Index: /trunk/FACT++/scripts/Startup.js
===================================================================
--- /trunk/FACT++/scripts/Startup.js	(revision 17173)
+++ /trunk/FACT++/scripts/Startup.js	(revision 17174)
@@ -218,5 +218,5 @@
 {
     dim.send("BIAS_CONTROL/SET_ZERO_VOLTAGE");
-    dim.wait("BIAS_CONTROL", "VoltageOff", 15000);
+    dim.wait("BIAS_CONTROL", "VoltageOff", 30000); // waS: 15000
 
     var now = new Date();
@@ -227,10 +227,10 @@
 
     console.out("Wait for calibration to end");
-    dim.wait("FEEDBACK", "Calibrated", 60000);
+    dim.wait("FEEDBACK", "Calibrated", 90000);
 
     console.out("Calibration finished ["+(new Date()-now)+"ms]");
 
     console.out("Wait for voltage to be off");
-    dim.wait("BIAS_CONTROL", "VoltageOff", 5000);
+    dim.wait("BIAS_CONTROL", "VoltageOff", 30000); // was: 15000
 }
 
@@ -261,8 +261,11 @@
 // ================================================================
 
-dim.send("BIAS_CONTROL/SET_EXPERT_MODE", true);
+dim.log("Switching to old bias calibration and feedback.");
+dim.send("BIAS_CONTROL/EXPERT_MODE", true);
 dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
-dim.send("BIAS_CONTROL/SET_EXPERT_MODE", false);
-dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+v8.sleep(3000);
 
 // ================================================================
@@ -283,5 +286,5 @@
  [ "PWR_CONTROL",     [ "SystemOn"                        ] ],
  [ "AGILENT_CONTROL", [ "VoltageOn"                       ] ],
- [ "BIAS_CONTROL",    [ "VoltageOn", "VoltageOff"         ] ],
+ [ "BIAS_CONTROL",    [ "VoltageOff"                      ] ],
  [ "FEEDBACK",        [ "Calibrated"                      ] ],
  [ "RATE_SCAN",       [ "Connected"                       ] ],
Index: /trunk/FACT++/scripts/getSchedule.js
===================================================================
--- /trunk/FACT++/scripts/getSchedule.js	(revision 17173)
+++ /trunk/FACT++/scripts/getSchedule.js	(revision 17174)
@@ -3,6 +3,6 @@
 function getSchedule()
 {
-    // List of all available measurement types
-    var measurementType = [ "STARTUP", "IDLE", "DRSCALIB", "SINGLEPE", "DATA", "RATESCAN", "SHUTDOWN" ];
+    // List of all available measurement types (see also Observation_class.js)
+    var measurementType = [ "STARTUP", "IDLE", "DRSCALIB", "SINGLEPE", "DATA", "RATESCAN", "SHUTDOWN"/*, "FEEDBACK-TEST", "SINGLEPE-TEST"*/ ];
 
     // Get current time
Index: /trunk/FACT++/src/DimServiceInfoList.cc
===================================================================
--- /trunk/FACT++/src/DimServiceInfoList.cc	(revision 17173)
+++ /trunk/FACT++/src/DimServiceInfoList.cc	(revision 17174)
@@ -696,7 +696,8 @@
 #endif
 
-    const int rc = DimClient::sendCommand(cmd.c_str(), (void*)v.data(), v.size());
-    if (!rc)
-        throw runtime_error("ERROR - Sending command "+cmd+" failed.");
+    DimClient::sendCommandNB(cmd.c_str(), (void*)v.data(), v.size());
+//    const int rc = DimClient::sendCommand(cmd.c_str(), (void*)v.data(), v.size());
+//    if (!rc)
+//        throw runtime_error("ERROR - Sending command "+cmd+" failed.");
 }
 
Index: /trunk/FACT++/src/InterpreterV8.cc
===================================================================
--- /trunk/FACT++/src/InterpreterV8.cc	(revision 17173)
+++ /trunk/FACT++/src/InterpreterV8.cc	(revision 17174)
@@ -1445,4 +1445,6 @@
 void InterpreterV8::JsHandleEvent(const EventImp &evt, uint64_t cnt, const string &service)
 {
+    // FIXME: This blocks service updates, we have to run this
+    //        in a dedicated thread.
     const Locker locker;
 
@@ -1513,4 +1515,6 @@
 void InterpreterV8::JsHandleState(const std::string &server, const State &state)
 {
+    // FIXME: This blocks service updates, we have to run this
+    //        in a dedicated thread.
     const Locker locker;
 
@@ -1619,4 +1623,6 @@
 int InterpreterV8::JsHandleInterrupt(const EventImp &evt)
 {
+    // FIXME: This blocks service updates, we have to run this
+    //        in a dedicated thread.
     const Locker locker;
 
@@ -2723,5 +2729,7 @@
     rc.emplace_back("new Date(");
     rc.emplace_back("'use strict';");
-
+    rc.emplace_back("undefined");
+    rc.emplace_back("null");
+    rc.emplace_back("delete ");
 
     rc.emplace_back("dim.log(");
Index: /trunk/FACT++/src/biasctrl.cc
===================================================================
--- /trunk/FACT++/src/biasctrl.cc	(revision 17173)
+++ /trunk/FACT++/src/biasctrl.cc	(revision 17174)
@@ -69,18 +69,20 @@
     vector<int16_t>  fCurrent;     // Current in ADC units (12bit = 5mA)
 
+    virtual void UpdateV(const Time = Time())
+    {
+    }
+
+    virtual void UpdateVgapd()
+    {
+    }
+
+public:
     virtual void UpdateVA()
     {
     }
 
-    virtual void UpdateV(const Time = Time())
-    {
-    }
-
-    virtual void UpdateVgapd()
-    {
-    }
-
     // ====================================================
 
+protected:
     vector<float> fBreakdownVoltage;      // Breakdown voltage of GAPDs
     //vector<float> fChannelOffset;         // User defined channel offset
@@ -1511,4 +1513,5 @@
     DimDescribedService fDimGapd;
 
+public:
     void UpdateVA()
     {
@@ -1521,4 +1524,5 @@
     }
 
+private:
     void UpdateV(const Time now=Time())
     {
@@ -1560,5 +1564,5 @@
         fDimVolt("BIAS_CONTROL/VOLTAGE", "F:416",
                  "|Uout[V]:Output voltage"),
-        fDimGapd("BIAS_CONTROL/NOMINAL", "F:416;F:416;F:416;F:416",
+        fDimGapd("BIAS_CONTROL/NOMINAL", "F:416;F:416;F:416",
                  "|Ubr[V]:Nominal breakdown voltage at 25deg C"
                  "|Uoff[V]:Bias crate channel calibration offsets"
@@ -1771,4 +1775,8 @@
             return T::GetCurrentState();
         }
+
+        fBias.UpdateVA();
+
+        T::Info("Successfully loaded new mapping '"+evt.GetString()+"'");
 
         return T::GetCurrentState();
Index: /trunk/FACT++/src/fscctrl.cc
===================================================================
--- /trunk/FACT++/src/fscctrl.cc	(revision 17173)
+++ /trunk/FACT++/src/fscctrl.cc	(revision 17174)
@@ -551,8 +551,8 @@
         }
 
-        UpdateHum( time, humidities);
         UpdateTemp(time, temperatures);
         UpdateVolt(time, voltages);
         UpdateCur( time, currents);
+        UpdateHum( time, humidities);
 
         StartRead();
@@ -697,5 +697,5 @@
         rms /= T.size();
         rms -= avg*avg;
-        rms = rms<0 ? 0 : sqrt(rms - avg*avg);
+        rms = rms<0 ? 0 : sqrt(rms);
 
         // Clean broken reports
@@ -725,6 +725,25 @@
         T = inter.Interpolate(T);
 
+        avg = 0;
+        rms = 0;
+        for (int i=0; i<320; i++)
+        {
+            avg += T[i];
+            rms += T[i]*T[i];
+        }
+
+        avg /= 320;
+        rms /= 320;
+        rms -= avg*avg;
+        rms = rms<0 ? 0 : sqrt(rms);
+
+        vector<float> out;
+        out.reserve(322);
+        out.assign(T.cbegin(), T.cend());
+        out.emplace_back(avg);
+        out.emplace_back(rms);
+
         // Update the Dim service with the interpolated positions
-        Update(fDimTemp2, vector<float>(T.cbegin(), T.cend()), time);
+        Update(fDimTemp2, out, time);
     }
 
@@ -755,7 +774,9 @@
                     "|T_back[deg C]:FTM backpanel temperatures FTM (top/bottom), FSC (top/bottom)"
                     "|T_eth[deg C]:Ethernet switches temperatures top (front/back), bottom (f/b)"),
-        fDimTemp2  ("FSC_CONTROL/BIAS_TEMP", "F:1;F:320",
+        fDimTemp2  ("FSC_CONTROL/BIAS_TEMP", "F:1;F:320;F:1;F:1",
                     "|t[s]:FSC uptime"
-                    "|T[deg C]:Interpolated temperatures at bias patch positions"),
+                    "|T[deg C]:Interpolated temperatures at bias patch positions"
+                    "|T_avg[deg C]:Average temperature calculated from all patches"
+                    "|T_rms[deg C]:Temperature RMS calculated from all patches"),
         fDimHum    ("FSC_CONTROL/HUMIDITY", "F:1;F:4",
                     "|t[s]:FSC uptime"
@@ -926,5 +947,5 @@
         fFSC.SetVerbose(!conf.Get<bool>("quiet"));
 
-        const string fname1 = conf.Get<string>("sesnor-pos-file");
+        const string fname1 = conf.Get<string>("sensor-pos-file");
         const auto v1 = ReadVector(fname1);
         if (v1.size() != 31)
