diff -Nbru -X excludes wview-5.20.2-orig/common/datadefs.h wview-5.20.2/common/datadefs.h
--- wview-5.20.2-orig/common/datadefs.h	2012-03-06 13:16:10.000000000 +0100
+++ wview-5.20.2/common/datadefs.h	2013-03-10 17:10:46.076809627 +0100
@@ -237,9 +237,11 @@
     float               outTemp;                /* ! degrees F            */
     uint16_t            inHumidity;             /* ! percent              */
     uint16_t            outHumidity;            /* ! percent              */
-    uint16_t            windSpeed;              /* ! mph                  */
+	// jo's-te923-hack: make windSpeed float
+    float               windSpeed;              /* ! mph                  */
     uint16_t            windDir;                /* ! degrees              */
-    uint16_t            windGust;               /* ! mph                  */
+	// jo's-te923-hack: make windGust float
+    float               windGust;               /* ! mph                  */
     uint16_t            windGustDir;            /* ! degrees              */
     float               rainRate;               /* ! in/hr                */
     float               sampleRain;             /* ! inches               */
@@ -260,7 +262,7 @@
     float               monthET;                /* inches                 */
     float               yearET;                 /* inches                 */
     float               intervalAvgWCHILL;      /* degrees F              */
-    uint16_t            intervalAvgWSPEED;      /* mph                    */
+    float	            intervalAvgWSPEED;      /* mph                    */
     uint16_t            yearRainMonth;          /* 1-12 Rain Start Month  */
 
     // --- The following may or may not be supported for a given station ---
diff -Nbru -X excludes wview-5.20.2-orig/common/datafeed.c wview-5.20.2/common/datafeed.c
--- wview-5.20.2-orig/common/datafeed.c	2012-02-24 15:38:06.000000000 +0100
+++ wview-5.20.2/common/datafeed.c	2013-03-10 17:08:43.056827521 +0100
@@ -44,6 +44,10 @@
     uint32_t    p;
     uint32_t    sign;
 
+	// jo's-te923-hack: make htonf ARCHIVE_VALUE_NULL-aware
+	if (f <= -100000.0)
+		f = -32767.0;
+		
     if (f < 0)
     {
         sign = 1;
@@ -70,6 +74,10 @@
         f = -f;
     } // sign bit set
 
+	// jo's-te923-hack: make ntohf ARCHIVE_VALUE_NULL-aware
+	if (f <= -32767.0)
+		f = -100000.0;
+	
     return f;
 }
 // end of slurped code
@@ -202,6 +210,7 @@
 int datafeedConvertLOOP_HTON(LOOP_PKT* dest, LOOP_PKT* src)
 {
     uint16_t*         tempshort;
+	int               i;
 
     dest->barometer                     = htonf(src->barometer);
     dest->stationPressure               = htonf(src->stationPressure);
@@ -211,9 +220,9 @@
 
     dest->inHumidity                    = htons(src->inHumidity);
     dest->outHumidity                   = htons(src->outHumidity);
-    dest->windSpeed                     = htons(src->windSpeed);
+    dest->windSpeed                     = htonf(src->windSpeed);
     dest->windDir                       = htons(src->windDir);
-    dest->windGust                      = htons(src->windGust);
+    dest->windGust                      = htonf(src->windGust);
     dest->windGustDir                   = htons(src->windGustDir);
 
     dest->rainRate                      = htonf(src->rainRate);
@@ -238,7 +247,7 @@
     dest->yearET                        = htonf(src->yearET);
     dest->intervalAvgWCHILL             = htonf(src->intervalAvgWCHILL);
 
-    dest->intervalAvgWSPEED             = htons(src->intervalAvgWSPEED);
+    dest->intervalAvgWSPEED             = htonf(src->intervalAvgWSPEED);
     dest->yearRainMonth                 = htons(src->yearRainMonth);
     dest->rxCheckPercent                = htons(src->rxCheckPercent);
     dest->tenMinuteAvgWindSpeed         = htons(src->tenMinuteAvgWindSpeed);
@@ -257,12 +266,16 @@
     dest->leafTemp1                     = htonf(src->leafTemp1);
     dest->leafTemp2                     = htonf(src->leafTemp2);
 
-    tempshort = (uint16_t*)&(dest->extraHumid1);
-    *tempshort = swapShortHTON(&dest->extraHumid1);
-    tempshort = (uint16_t*)&(dest->soilMoist1);
-    *tempshort = swapShortHTON(&dest->soilMoist1);
-    tempshort = (uint16_t*)&(dest->leafWet1);
-    *tempshort = swapShortHTON(&dest->leafWet1);
+    
+	// jo's-te923-hack: do not modify byteorder of uint8_t values
+	dest->extraHumid1 = src->extraHumid1;
+	dest->extraHumid2 = src->extraHumid2;
+
+	dest->soilMoist1 = src->soilMoist1;
+	dest->soilMoist2 = src->soilMoist2;
+
+	dest->leafWet1 = src->leafWet1;
+	dest->leafWet2 = src->leafWet2;
 
     dest->wxt510Hail                    = htonf(src->wxt510Hail);
     dest->wxt510Hailrate                = htonf(src->wxt510Hailrate);
@@ -277,16 +290,19 @@
     dest->wxt510Rain                    = htonf(src->wxt510Rain);
     dest->wmr918Pool                    = htonf(src->wmr918Pool);
 
-    tempshort = (uint16_t*)&(dest->wmr918Humid3);
-    *tempshort = swapShortHTON(&dest->wmr918Humid3);
-    tempshort = (uint16_t*)&(dest->wmr918WindBatteryStatus);
-    *tempshort = swapShortHTON(&dest->wmr918WindBatteryStatus);
-    tempshort = (uint16_t*)&(dest->wmr918OutTempBatteryStatus);
-    *tempshort = swapShortHTON(&dest->wmr918OutTempBatteryStatus);
-    tempshort = (uint16_t*)&(dest->wmr918poolTempBatteryStatus);
-    *tempshort = swapShortHTON(&dest->wmr918poolTempBatteryStatus);
-    tempshort = (uint16_t*)&(dest->wmr918extra2BatteryStatus);
-    *tempshort = swapShortHTON(&dest->wmr918extra2BatteryStatus);
+    // jo's-te923-hack: do not modify byte order of uint8_t values
+    dest->wmr918Humid3			= src->wmr918Humid3;
+    dest->wmr918WindBatteryStatus	= src->wmr918WindBatteryStatus;
+    dest->wmr918OutTempBatteryStatus	= src->wmr918OutTempBatteryStatus;
+    dest->wmr918poolTempBatteryStatus	= src->wmr918poolTempBatteryStatus;
+    dest->wmr918extra2BatteryStatus	= src->wmr918extra2BatteryStatus;
+
+	// jo's-te923-hack: transmit extra sensors
+	for (i = 0; i < WVIEW_NUM_EXTRA_SENSORS; i++) {
+		dest->extraTemp[i] = htonf(src->extraTemp[i]);
+		dest->extraHumidity[i] = htons(src->extraHumidity[i]);
+		dest->extraTempBatteryStatus[i] = src->extraTempBatteryStatus[i];
+	}
 
     return OK;
 }
@@ -294,6 +310,7 @@
 int datafeedConvertLOOP_NTOH(LOOP_PKT* dest, LOOP_PKT* src)
 {
     uint16_t*         tempshort;
+	int               i;
 
     dest->barometer                     = ntohf(src->barometer);
     dest->stationPressure               = ntohf(src->stationPressure);
@@ -303,9 +320,9 @@
 
     dest->inHumidity                    = ntohs(src->inHumidity);
     dest->outHumidity                   = ntohs(src->outHumidity);
-    dest->windSpeed                     = ntohs(src->windSpeed);
+    dest->windSpeed                     = ntohf(src->windSpeed);
     dest->windDir                       = ntohs(src->windDir);
-    dest->windGust                      = ntohs(src->windGust);
+    dest->windGust                      = ntohf(src->windGust);
     dest->windGustDir                   = ntohs(src->windGustDir);
 
     dest->rainRate                      = ntohf(src->rainRate);
@@ -330,7 +347,7 @@
     dest->yearET                        = ntohf(src->yearET);
     dest->intervalAvgWCHILL             = ntohf(src->intervalAvgWCHILL);
 
-    dest->intervalAvgWSPEED             = ntohs(src->intervalAvgWSPEED);
+    dest->intervalAvgWSPEED             = ntohf(src->intervalAvgWSPEED);
     dest->yearRainMonth                 = ntohs(src->yearRainMonth);
     dest->rxCheckPercent                = ntohs(src->rxCheckPercent);
     dest->tenMinuteAvgWindSpeed         = ntohs(src->tenMinuteAvgWindSpeed);
@@ -350,12 +367,15 @@
     dest->leafTemp1                     = ntohf(src->leafTemp1);
     dest->leafTemp2                     = ntohf(src->leafTemp2);
 
-    tempshort = (uint16_t*)&(dest->extraHumid1);
-    *tempshort = swapShortNTOH(&dest->extraHumid1);
-    tempshort = (uint16_t*)&(dest->soilMoist1);
-    *tempshort = swapShortNTOH(&dest->soilMoist1);
-    tempshort = (uint16_t*)&(dest->leafWet1);
-    *tempshort = swapShortNTOH(&dest->leafWet1);
+	// jo's-te923-hack: do not modify byte order of uint8_t values
+	dest->extraHumid1 = src->extraHumid1;
+	dest->extraHumid2 = src->extraHumid2;
+
+	dest->soilMoist1 = src->soilMoist1;
+	dest->soilMoist2 = src->soilMoist2;
+
+	dest->leafWet1 = src->leafWet1;
+	dest->leafWet2 = src->leafWet2;
 
     dest->wxt510Hail                    = ntohf(src->wxt510Hail);
     dest->wxt510Hailrate                = ntohf(src->wxt510Hailrate);
@@ -370,16 +390,20 @@
     dest->wxt510Rain                    = ntohf(src->wxt510Rain);
     dest->wmr918Pool                    = ntohf(src->wmr918Pool);
 
-    tempshort = (uint16_t*)&(dest->wmr918Humid3);
-    *tempshort = swapShortNTOH(&dest->wmr918Humid3);
-    tempshort = (uint16_t*)&(dest->wmr918WindBatteryStatus);
-    *tempshort = swapShortNTOH(&dest->wmr918WindBatteryStatus);
-    tempshort = (uint16_t*)&(dest->wmr918OutTempBatteryStatus);
-    *tempshort = swapShortNTOH(&dest->wmr918OutTempBatteryStatus);
-    tempshort = (uint16_t*)&(dest->wmr918poolTempBatteryStatus);
-    *tempshort = swapShortNTOH(&dest->wmr918poolTempBatteryStatus);
-    tempshort = (uint16_t*)&(dest->wmr918extra2BatteryStatus);
-    *tempshort = swapShortNTOH(&dest->wmr918extra2BatteryStatus);
+    // jo's-te923-hack: do not modify byte order of uint8_t values
+    dest->wmr918Humid3			= src->wmr918Humid3;
+    dest->wmr918WindBatteryStatus	= src->wmr918WindBatteryStatus;
+    dest->wmr918OutTempBatteryStatus	= src->wmr918OutTempBatteryStatus;
+    dest->wmr918poolTempBatteryStatus	= src->wmr918poolTempBatteryStatus;
+    dest->wmr918extra2BatteryStatus	= src->wmr918extra2BatteryStatus;
+
+
+	// jo's-te923-hack: receive extra sensors
+	for (i = 0; i < WVIEW_NUM_EXTRA_SENSORS; i++) {
+		dest->extraTemp[i] = ntohf(src->extraTemp[i]);
+		dest->extraHumidity[i] = ntohs(src->extraHumidity[i]);
+		dest->extraTempBatteryStatus[i] = src->extraTempBatteryStatus[i];
+	}
 
     return OK;
 }
@@ -394,16 +418,9 @@
 
     for (index = 0; index < DATA_INDEX_MAX; index ++)
     {
-        // Workaround needed because htonf/ntohf don't support -100000.
-        if (src->value[index] <= ARCHIVE_VALUE_NULL)
-        {
-            dest->value[index]  = -32767.0;
-        }
-        else
-        {
+	// jo's-te923-hack: htonf now supports ARCHIVE_VALUE_NULL 
             dest->value[index]  = htonf(src->value[index]);
         }
-    }
 
     return OK;
 }
@@ -418,16 +435,9 @@
 
     for (index = 0; index < DATA_INDEX_MAX; index ++)
     {
-        // Workaround needed because htonf/ntohf don't support -100000.
-        if (src->value[index] <= -32767.0)
-        {
-            dest->value[index]  = ARCHIVE_VALUE_NULL;
-        }
-        else
-        {
+	// jo's-te923-hack: htonf now supports ARCHIVE_VALUE_NULL 
             dest->value[index]  = ntohf(src->value[index]);
         }
-    }
 
     return OK;
 }
diff -Nbru -X excludes wview-5.20.2-orig/common/dbsqlite.c wview-5.20.2/common/dbsqlite.c
--- wview-5.20.2-orig/common/dbsqlite.c	2012-03-12 12:58:25.000000000 +0100
+++ wview-5.20.2/common/dbsqlite.c	2013-02-16 14:45:24.929021355 +0100
@@ -132,7 +132,9 @@
     noConversion,
     wvutilsConvertRainINToMetric,
     noConversion,
-    noConversion,
+    // jo's-te923-hack: UV holds temp diff
+    //noConversion,
+	wvutilsConvertDeltaFToC,
     wvutilsConvertFToC,
     wvutilsConvertFToC,
     wvutilsConvertFToC,
@@ -185,7 +187,9 @@
     noConversion,
     wvutilsConvertRainMetricToIN,
     noConversion,
-    noConversion,
+    // jo's-te923-hack: UV holds temp diff
+    //noConversion,
+	wvutilsConvertDeltaCToF,
     wvutilsConvertCToF,
     wvutilsConvertCToF,
     wvutilsConvertCToF,
diff -Nbru -X excludes wview-5.20.2-orig/common/dbsqliteHiLow.c wview-5.20.2/common/dbsqliteHiLow.c
--- wview-5.20.2-orig/common/dbsqliteHiLow.c	2012-02-24 13:53:03.000000000 +0100
+++ wview-5.20.2/common/dbsqliteHiLow.c	2013-03-05 18:29:17.413302391 +0100
@@ -592,7 +592,7 @@
               hilowInsertData(pkt->dateTime - (60*pkt->interval), type, pkt->value[DATA_INDEX_ET], 0);
         break;
     case SENSOR_UV:
-        if (pkt->value[DATA_INDEX_UV] >= 0 && pkt->value[DATA_INDEX_UV] < 100)
+        //if (pkt->value[DATA_INDEX_UV] >= 0 && pkt->value[DATA_INDEX_UV] < 100)
             hilowInsertData(pkt->dateTime - (60*pkt->interval), type, pkt->value[DATA_INDEX_UV], 0);
         break;
     case SENSOR_SOLRAD:
@@ -658,7 +658,7 @@
             hilowInsertData(timestamp, type, pkt->sampleET, 0);
         break;
     case SENSOR_UV:
-        if (pkt->UV < 100)
+        //if (pkt->UV < 100)
             hilowInsertData(timestamp, type, pkt->UV, 0);
         break;
     case SENSOR_SOLRAD:
diff -Nbru -X excludes wview-5.20.2-orig/common/heatindex.h wview-5.20.2/common/heatindex.h
--- wview-5.20.2-orig/common/heatindex.h	1970-01-01 01:00:00.000000000 +0100
+++ wview-5.20.2/common/heatindex.h	2012-10-28 14:58:18.203601245 +0100
@@ -0,0 +1,99 @@
+/* file generated from wxMaxima
+ *
+ * this array contains limiting temperatures for wind chill calculations
+ * for humidities from 10 to 100
+ */
+
+static float heatindexlimit[] = {
+    138.19346937188052,
+    130.71112871002023,
+    125.36122235263734,
+    121.2899509684118,
+    118.04741946685907,
+    115.37347613000468,
+    113.10691670234678,
+    111.14235042550037,
+    109.4078600433651,
+    107.85261705566363,
+    106.43962712756846,
+    105.14128229584483,
+    103.93652708123456,
+    102.80899232337934,
+    101.74573040208486,
+    100.73633584005592,
+    99.772319455569047,
+    98.846653077926035,
+    97.953431060111072,
+    97.087612745609007,
+    96.244821227515246,
+    95.42118073009965,
+    94.613179174584218,
+    93.817544706386158,
+    93.031125408151141,
+    92.250759848988963,
+    91.473121524554031,
+    90.694510133025588,
+    89.910541007040138,
+    89.115635563712388,
+    88.302097077792169,
+    87.45822663525658,
+    86.563834712668552,
+    85.576619468955514,
+    82.873937989246528,
+    82.587493460995091,
+    82.302746750460742,
+    82.019510054810013,
+    81.737612846804211,
+    81.456899879898998,
+    81.177229462981444,
+    80.8984719631556,
+    80.620508502160305,
+    80.34322981781358,
+    80.066535266607815,
+    79.790331947447413,
+    79.514533929698331,
+    79.239061571337814,
+    78.963840915164909,
+    78.688803152834694,
+    78.413884147986238,
+    78.139024010995129,
+    77.864166718940368,
+    77.589259775270577,
+    77.314253904408261,
+    77.039102777174264,
+    76.763762763458217,
+    76.488192709028226,
+    76.212353733770399,
+    75.936209048990762,
+    75.659723791707549,
+    75.38286487411311,
+    75.105600846606677,
+    74.827901772986621,
+    74.549739116558158,
+    74.271085636053783,
+    73.991915290390665,
+    73.712203151397986,
+    73.431925323742632,
+    73.15105887136653,
+    72.869581749822203,
+    72.967682969681618,
+    74.131717181774505,
+    74.610993913754214,
+    74.938988006904836,
+    75.190567254439841,
+    75.394775682563974,
+    75.566382842473985,
+    75.714056396246519,
+    75.84336509624849,
+    75.958118921712526,
+    76.06104833894149,
+    76.154181341771093,
+    76.239067573996095,
+    76.316918894046793,
+    76.388701427664216,
+    76.455198036398713,
+    76.51705199509739,
+    76.574798317363303,
+    76.628886720007756,
+    76.679698782650576,
+};
diff -Nbru -X excludes wview-5.20.2-orig/common/sysdefs.h wview-5.20.2/common/sysdefs.h
--- wview-5.20.2-orig/common/sysdefs.h	2012-03-12 12:58:25.000000000 +0100
+++ wview-5.20.2/common/sysdefs.h	2013-03-07 19:11:22.190956122 +0100
@@ -237,6 +237,8 @@
 extern int wvutilsToggleVerbosity (void);
 extern void wvutilsLogEvent (int priority, char *format, ...);
 
+// jo's-te923-hack: calculate temperature difference from windchill difference
+extern float wvutilsCalculateWindUnchill (float windchill, float windspeed);
 extern float wvutilsCalculateHeatIndex (float temp, float humidity);
 extern float wvutilsCalculateWindChill (float temp, float windspeed);
 extern float wvutilsCalculateDewpoint (float temp, float humidity);
@@ -249,6 +251,7 @@
 extern float wvutilsConvertFToC (float fahrenValue);
 extern float wvutilsConvertCToF (float celsiusValue);
 extern float wvutilsConvertDeltaFToC (float fahrenValue);
+extern float wvutilsConvertDeltaCToF (float celsiusValue);
 extern float wvutilsConvertMPHToKPH (float mph);
 extern float wvutilsConvertMPHToMPS (float mph);
 extern float wvutilsConvertMPHToKnots (float mph);
diff -Nbru -X excludes wview-5.20.2-orig/common/wvutils.c wview-5.20.2/common/wvutils.c
--- wview-5.20.2-orig/common/wvutils.c	2012-03-06 17:34:28.000000000 +0100
+++ wview-5.20.2/common/wvutils.c	2013-03-10 14:19:01.751830702 +0100
@@ -47,6 +47,7 @@
 #include <sysdefs.h>
 #include <services.h>
 #include <beaufort.h>
+#include <heatindex.h>
 
 #ifndef BUILD_UTILITIES
 #include <wvconfig.h>
@@ -151,11 +152,38 @@
 float wvutilsCalculateHeatIndex (float temp, float humidity)
 {
     double      T1, T2, T3, T4, T5, T6, T7, T8, T9, result;
+	float		tlim;
+	int			humint;
 
     if (temp <= ARCHIVE_VALUE_NULL || humidity <= ARCHIVE_VALUE_NULL)
         return ARCHIVE_VALUE_NULL;
 
-    if (temp < 75.0)
+// jo's-te923-hack: switching from HI = T to the calculated value
+// at 75 F makes the heat index discontinuous. A detailed investigation
+// of the heat index formula yields:
+// the function can be divided in three parts, depending on the humidity
+// - for very low humidities (H < 44.6%), the calculated heat index and the
+// temperature intersect at a certain point above 82 F
+// - for medium humidities (44.6% < H < 81%), there is no intersection
+// between these two curves. In the range 73 F - 82 F there is a point where
+// the difference becomes minimal.
+// - for higher humidities (H > 81%) there is again an intersection in the
+// range 73 F - 77 F.
+// The calulation of these special points is somewhat difficult in
+// algebraic terms. There are numerical estimates for 10% <= H <= 100% 
+// in heatindex.h. Using these numbers as the switching point from HI = T
+// to the calculated value makes the function partly continuous and
+// minimizes the step where it cannot be made continuous.
+// Limits calculated using wxMaxima and stored in common/heatindex.h
+	
+	humint = humidity - 10;
+	if (humint < 0)
+		humint = 0;
+	if (humint > 90)
+		humint = 90;
+	
+	tlim = heatindexlimit[humint];
+    if (temp < tlim)
     {
         return temp;
     }
@@ -179,25 +207,106 @@
     return (float)result;
 }
 
+// jo's-te923-hack: The wind chill is discontinuous if the formula
+// is applied for values of temperature and windspeed strictly in the
+// range T < 50 F, v > 3mph only.
+// Extending the range to the point where WC = T makes the function
+// continuous in both arguments. Finding these points isn't too hard
+// in algebraic terms, so they are calculated.
+
+#define WC_C1 35.74
+#define WC_C2 0.6215
+#define WC_C3 35.75
+#define WC_C4 0.4275
+#define WC_E 0.16
+
+// jo's-te923-hack: minimal windspeed for given temperature for windchill calculation
+static float vlimit (float t)
+{
+	return pow((WC_C1 - (1 - WC_C2) * t)/(WC_C3 - WC_C4 * t), 1/WC_E);
+}
+
+// jo's-te923-hack: maximum temperature for given windspeed for windchill calculation
+static float tlimit (float v)
+{
+	return (WC_C1 - WC_C3 * pow(v, WC_E))/(1 - WC_C2 - WC_C4 * pow(v, WC_E));
+}
+
+// jo's-te923-hack: 
+// Calculate temperature from windchill and windspeed
+
+float wvutilsCalculateWindUnchill(float windchill, float windspeed)
+{
+	double	result, ve;
+	float	vlim, wlim;
+
+	if (windchill <= ARCHIVE_VALUE_NULL || windspeed <= ARCHIVE_VALUE_NULL)
+		return ARCHIVE_VALUE_NULL;
+
+	if (windchill >= 50.0 && windspeed < 3.0)
+		return windchill;
+	
+	if (windchill < 50.0) {
+		vlim = vlimit(windchill);
+		if (windspeed < vlim) {
+			return windchill;
+		}
+	}
+	if (windspeed >= 3.0) {
+		wlim = tlimit(windspeed);
+		if (windchill > wlim) {
+			return windchill;
+		}
+	}
+	ve = pow(windspeed, WC_E);
+	result = (windchill + WC_C3 * ve - WC_C1) /	(WC_C4 * ve + WC_C2);
+
+	if (result < windchill)
+		result = windchill;
+
+	if (! WV_UTILS_VALID(result))
+	{
+		return ARCHIVE_VALUE_NULL;
+	}
+
+    return (float)result;
+
+}
+
 //  calculate the wind chill
+// jo's-te923-hack: extend calculations
 float wvutilsCalculateWindChill (float temp, float windspeed)
 {
-    double      T1, T2, T3, T4;
-    double      result;
+    double      result, ve;
+	float		vlim, tlim;
 
     if (temp <= ARCHIVE_VALUE_NULL || windspeed <= ARCHIVE_VALUE_NULL) 
         return ARCHIVE_VALUE_NULL;
 
-    if (temp >= 50.0 || windspeed <= 3.0)
+	if (temp >= 50.0 && windspeed < 3.0)
+		return temp;
+	
+	if (temp < 50.0 ) {
+		vlim = vlimit(temp);
+		if (windspeed < vlim)
     {
         return temp;
     }
+	}
+	if (windspeed >= 3.0) {
+		tlim = tlimit(windspeed);
+		if (temp > tlim)
+		{
+			return temp;
+		}
+	}
+
+	ve = pow(windspeed, WC_E);
+	result = WC_C1 + WC_C2 * temp - WC_C3 * ve +
+		WC_C4 * temp * ve;
 
-    T1 = 35.74;
-    T2 = 0.6215 * temp;
-    T3 = -1.0 * (35.75 * pow (windspeed, 0.16));
-    T4 = 0.4275 * temp * pow (windspeed, 0.16);
-    result = T1 + T2 + T3 + T4;
+	if (result > temp)
+		result = temp;
 
 	if (! WV_UTILS_VALID(result))
 	{
@@ -448,6 +557,20 @@
     return retVal;
 }
 
+// jo's-te923-hack: for sake of completeness reverse conversation
+float wvutilsConvertDeltaCToF (float celsiusValue)
+{
+    float      retVal;
+    
+    if (celsiusValue <= ARCHIVE_VALUE_NULL) 
+        return ARCHIVE_VALUE_NULL;
+    
+    retVal = celsiusValue * 9.0;
+    retVal /= 5.0;
+    
+    return retVal;
+}
+
 float wvutilsConvertINHGToHPA (float inches)
 {
     float      retVal;
@@ -935,61 +1058,62 @@
     return flbuffer;
 }
 
+// jo's-te923-hack: add numerical beaufort numbers
 char *wvutilsConvertToBeaufortScale (int windSpeed)
 {
     static char         beaufortBfr[32];
 
     if (windSpeed == Beaufort_Calm)
     {
-        sprintf (beaufortBfr, "Calm");
+        sprintf (beaufortBfr, "0 / Calm");
     }
     else if (windSpeed <= Beaufort_LightAir)
     {
-        sprintf (beaufortBfr, "Light Air");
+        sprintf (beaufortBfr, "1 / Light Air");
     }
     else if (windSpeed <= Beaufort_LightBreeze)
     {
-        sprintf (beaufortBfr, "Light Breeze");
+        sprintf (beaufortBfr, "2 / Light Breeze");
     }
     else if (windSpeed <= Beaufort_GentleBreeze)
     {
-        sprintf (beaufortBfr, "Gentle Breeze");
+        sprintf (beaufortBfr, "3 / Gentle Breeze");
     }
     else if (windSpeed <= Beaufort_ModerateBreeze)
     {
-        sprintf (beaufortBfr, "Moderate Breeze");
+        sprintf (beaufortBfr, "4 / Moderate Breeze");
     }
     else if (windSpeed <= Beaufort_FreshBreeze)
     {
-        sprintf (beaufortBfr, "Fresh Breeze");
+        sprintf (beaufortBfr, "5 / Fresh Breeze");
     }
     else if (windSpeed <= Beaufort_StrongBreeze)
     {
-        sprintf (beaufortBfr, "Strong Breeze");
+        sprintf (beaufortBfr, "6 / Strong Breeze");
     }
     else if (windSpeed <= Beaufort_NearGale)
     {
-        sprintf (beaufortBfr, "Near Gale");
+        sprintf (beaufortBfr, "7 / Near Gale");
     }
     else if (windSpeed <= Beaufort_Gale)
     {
-        sprintf (beaufortBfr, "Gale");
+        sprintf (beaufortBfr, "8 / Gale");
     }
     else if (windSpeed <= Beaufort_SevereGale)
     {
-        sprintf (beaufortBfr, "Severe Gale");
+        sprintf (beaufortBfr, "9 / Severe Gale");
     }
     else if (windSpeed <= Beaufort_Storm)
     {
-        sprintf (beaufortBfr, "Storm");
+        sprintf (beaufortBfr, "10 / Storm");
     }
     else if (windSpeed <= Beaufort_ViolentStorm)
     {
-        sprintf (beaufortBfr, "Violent Storm");
+        sprintf (beaufortBfr, "11 / Violent Storm");
     }
     else // if (windSpeed <= Beaufort_Hurricane)
     {
-        sprintf (beaufortBfr, "Hurricane");
+        sprintf (beaufortBfr, "12 / Hurricane");
     }
    
     return beaufortBfr;
diff -Nbru -X excludes wview-5.20.2-orig/debian/init.d wview-5.20.2/debian/init.d
--- wview-5.20.2-orig/debian/init.d	2012-02-24 16:42:45.000000000 +0100
+++ wview-5.20.2/debian/init.d	2012-10-28 17:53:56.579198916 +0100
@@ -68,9 +68,16 @@
     done
 }
 
+cleanup_shm() {
+       ipcs -m |grep '^0x0001f001' >/dev/null && ipcrm -M 0x0001f001
+       ipcs -m |grep '^0x0001f003' >/dev/null && ipcrm -M 0x0001f003
+       ipcs -m |grep '^0x0ff00002' >/dev/null && ipcrm -M 0x0ff00002
+}
+
 case "$1" in
   start)
 	wait_for_time_set
+	cleanup_shm
 
 	echo "Starting wview daemons:"
 
diff -Nbru -X excludes wview-5.20.2-orig/htmlgenerator/htmlGenerate.c wview-5.20.2/htmlgenerator/htmlGenerate.c
--- wview-5.20.2-orig/htmlgenerator/htmlGenerate.c	2012-03-12 12:58:25.000000000 +0100
+++ wview-5.20.2/htmlgenerator/htmlGenerate.c	2013-03-22 18:50:50.871286746 +0100
@@ -723,6 +723,8 @@
     return batteryStatus;
 }
 
+// jo's-te923-hack: changed rain related values to 1 digit after point
+// and added some ARCHIVE_VALUE_NULL checks
 static void computeTag (HTML_MGR_ID id, char *tag, int len, char *store)
 {
     time_t          ntime;
@@ -811,6 +813,7 @@
         wvstrncpy (store, buildTimeTag (id->sunset), HTML_MAX_LINE_LENGTH);
         break;
     case 12:
+		if (id->loopStore.outTemp > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f",
@@ -820,8 +823,14 @@
         {
             sprintf (store, "%.1f", id->loopStore.outTemp);
         }
+		}
+		else
+		{
+			sprintf (store, "---");
+		}
         break;
     case 13:
+		if (id->loopStore.windchill > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f",
@@ -831,11 +840,17 @@
         {
             sprintf (store, "%.1f", id->loopStore.windchill);
         }
+		}
+		else
+		{
+			sprintf (store, "---");
+		}
         break;
     case 14:
         sprintf (store, "%d", id->loopStore.outHumidity);
         break;
     case 15:
+	    if (id->loopStore.outTemp > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f",
@@ -845,6 +860,11 @@
         {
             sprintf (store, "%.1f", id->loopStore.heatindex);
         }
+		}
+		else
+		{
+			sprintf (store, "---");
+		}
         break;
     case 16:
         tempfloat = (float)id->loopStore.windDir + 11.24;
@@ -854,11 +874,16 @@
         sprintf (store, "%s", buildWindDirString(tempInt));
         break;
     case 17:
+		if (id->loopStore.windSpeed > ARCHIVE_VALUE_NULL) {
         sprintf (store, 
                  "%.1f",
                  wvutilsGetWindSpeed((float)id->loopStore.windSpeed));
+		} else {
+			sprintf (store, "---");
+		}
         break;
     case 18:
+		if (id->loopStore.dewpoint > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f",
@@ -867,6 +892,12 @@
         else
         {
             sprintf (store, "%.1f", id->loopStore.dewpoint);
+				
+    		}
+		}
+		else
+		{
+			sprintf (store, "---");
         }
         break;
     case 19:
@@ -883,7 +914,7 @@
     case 20:
         if (id->isMetricUnits)
         {
-            sprintf (store, "%.2f",
+            sprintf (store, "%.1f",
                      wvutilsConvertRainINToMetric(id->loopStore.rainRate));
         }
         else
@@ -895,7 +926,7 @@
         if (id->isMetricUnits)
         {
             strcpy (store,
-                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.dayRain), 2));
+                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.dayRain), 1));
         }
         else
         {
@@ -906,7 +937,7 @@
         if (id->isMetricUnits)
         {
             strcpy (store,
-                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.monthRain), 2));
+                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.monthRain), 1));
         }
         else
         {
@@ -917,7 +948,7 @@
         if (id->isMetricUnits)
         {
             strcpy (store,
-                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.stormRain), 2));
+                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.stormRain), 1));
         }
         else
         {
@@ -928,7 +959,7 @@
         if (id->isMetricUnits)
         {
             strcpy (store,
-                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.yearRain), 2));
+                    wvutilsPrintFloat(wvutilsConvertRainINToMetric(id->loopStore.yearRain), 1));
         }
         else
         {
@@ -1046,7 +1077,7 @@
     case 43:
         if (id->isMetricUnits)
         {
-            sprintf (store, "%.2f",
+            sprintf (store, "%.1f",
                      wvutilsConvertRainINToMetric(sensorGetDailyHigh(sensors->sensor, SENSOR_RAINRATE)));
         }
         else
@@ -1193,7 +1224,7 @@
     case 60:
         if (id->isMetricUnits)
         {
-            sprintf (store, "%.2f",
+            sprintf (store, "%.1f",
                      wvutilsConvertRainINToMetric(sensorGetHigh(&sensors->sensor[STF_MONTH][SENSOR_RAINRATE])));
         }
         else
@@ -1306,7 +1337,7 @@
     case 72:
         if (id->isMetricUnits)
         {
-            sprintf (store, "%.2f",
+            sprintf (store, "%.1f",
                      wvutilsConvertRainINToMetric(sensorGetHigh(&sensors->sensor[STF_YEAR][SENSOR_RAINRATE])));
         }
         else
@@ -1321,7 +1352,14 @@
         sprintf (store, "%s", radSystemGetUpTimeSTR (WVIEW_SYSTEM_ID));
         break;
     case 75:
+	if (id->isMetricUnits)
+	{
+        	sprintf (store, "%.1f", wvutilsConvertDeltaFToC(id->loopStore.UV));
+	}
+	else
+	{
         sprintf (store, "%.1f", (float)id->loopStore.UV);
+	}
         break;
     case 76:
         if (id->isMetricUnits)
@@ -1338,6 +1376,8 @@
         sprintf (store, "%.0f", (float)id->loopStore.radiation);
         break;
     case 78:
+	// jo's-te923-hack: suppress NULL values
+	if (id->loopStore.extraTemp1 > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f",
@@ -1347,8 +1387,13 @@
         {
             sprintf (store, "%.0f", id->loopStore.extraTemp1);
         }
+	} else {
+		sprintf (store, "---");
+	}
         break;
     case 79:
+	// jo's-te923-hack: suppress NULL values
+	if (id->loopStore.extraTemp2 > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f",
@@ -1358,8 +1403,13 @@
         {
             sprintf (store, "%.0f", id->loopStore.extraTemp2);
         }
+	} else {
+		sprintf (store, "---");
+	}
         break;
     case 80:
+	// jo's-te923-hack: suppress NULL values
+	if (id->loopStore.extraTemp3 > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f",
@@ -1369,6 +1419,9 @@
         {
             sprintf (store, "%.0f", id->loopStore.extraTemp3);
         }
+	} else {
+		sprintf (store, "---");
+	}
         break;
     case 81:
         if (id->isMetricUnits)
@@ -1496,7 +1549,7 @@
     case 96:
         if (id->isMetricUnits)
         {
-            sprintf (store, "%.2f",
+            sprintf (store, "%.1f",
                      wvutilsConvertRainINToMetric(sensorGetCumulative(&sensors->sensor[STF_HOUR][SENSOR_RAIN])));
         }
         else
@@ -2057,7 +2110,7 @@
                                              id->mphaseFull));
         break;
     case 190:
-        sprintf (store, " kg/m^3");
+        sprintf (store, " kg/m&sup3;");
         break;
     case 191:
         sprintf (store, "%.3f",
@@ -2077,7 +2130,8 @@
         tempfloat *= 228;
         if (id->isMetricUnits)
         {
-            tempfloat = wvutilsConvertFeetToMeters (tempfloat);
+            tempfloat = floorf((wvutilsConvertFeetToMeters (tempfloat) + 25) / 50) * 50;
+			
         }
         sprintf (store, "%.0f", tempfloat);
         break;
@@ -2192,7 +2246,7 @@
         // intervalAvgWindSpeed
         sprintf (store, 
                  "%.1f",
-                 wvutilsGetWindSpeed((float)id->loopStore.intervalAvgWSPEED));
+                 wvutilsGetWindSpeed(id->loopStore.intervalAvgWSPEED));
         break;
     case 213:
         // stationPressure
@@ -2469,7 +2523,7 @@
 
     case 248:
         // <!--intervalAvgWindSpeed_ms-->
-        tempfloat = wvutilsConvertMPHToMPS ((float)id->loopStore.intervalAvgWSPEED);
+        tempfloat = wvutilsConvertMPHToMPS (id->loopStore.intervalAvgWSPEED);
         sprintf (store, "%.1f", tempfloat);
         break;
 
@@ -2787,7 +2841,7 @@
         // "<!--hiAllTimeRainRate-->",
         if (id->isMetricUnits)
         {
-            sprintf (store, "%.2f",
+            sprintf (store, "%.1f",
                      wvutilsConvertRainINToMetric(sensorGetHigh(&sensors->sensor[STF_ALL][SENSOR_RAINRATE])));
         }
         else
@@ -2965,6 +3019,8 @@
         break;
     case 320:
        // "<!--genExtraTemp1-->",
+		// jo's-te923-hack: suppress NULL values
+		if (id->loopStore.extraTemp[0] > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f", wvutilsConvertFToC(id->loopStore.extraTemp[0]));
@@ -2974,9 +3030,14 @@
         {
             sprintf (store, "%.1f", id->loopStore.extraTemp[0]);
         }
+		} else {
+			sprintf (store, "---");
+		}
         break;
     case 321:
        // "<!--genExtraTemp2-->",
+		// jo's-te923-hack: suppress NULL values
+		if (id->loopStore.extraTemp[1] > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f", wvutilsConvertFToC(id->loopStore.extraTemp[1]));
@@ -2986,18 +3047,26 @@
         {
             sprintf (store, "%.1f", id->loopStore.extraTemp[1]);
         }
+		} else {
+			sprintf (store, "---");
+		}
+
         break;
     case 322:
        // "<!--genExtraTemp3-->",
+		// jo's-te923-hack: suppress NULL values
+		if (id->loopStore.extraTemp[2] > ARCHIVE_VALUE_NULL) {
         if (id->isMetricUnits)
         {
             sprintf (store, "%.1f", wvutilsConvertFToC(id->loopStore.extraTemp[2]));
-
         }
         else
         {
             sprintf (store, "%.1f", id->loopStore.extraTemp[2]);
         }
+		} else {
+			sprintf (store, "---");
+		}
         break;
     case 323:
        // "<!--genExtraTemp4-->",
@@ -3157,11 +3226,21 @@
         break;
     case 336:
         // "<!--genExtraHumidity1-->",
+		// jo's-te923-hack: suppress NULL values
+		if (id->loopStore.extraHumidity[0] > ARCHIVE_VALUE_NULL) {
         sprintf (store, "%d", id->loopStore.extraHumidity[0]);
+		} else {
+			sprintf (store, "---");
+		}
         break;
     case 337:
         // "<!--genExtraHumidity2-->",
+		// jo's-te923-hack: suppress NULL values
+		if (id->loopStore.extraHumidity[1] > ARCHIVE_VALUE_NULL) {
         sprintf (store, "%d", id->loopStore.extraHumidity[1]);
+		} else {
+			sprintf (store, "---");
+		}
         break;
     case 338:
         // "<!--genExtraHumidity3-->",
@@ -4965,8 +5044,8 @@
     char                *fname,
     int                 direction,              // 0-359 degrees
     int                 highDirection,          // 0-359 degrees
-    int                 speed,
-    int                 highSpeed,
+    float               speed,
+    float               highSpeed,
     char                *title
 )
 {
@@ -5025,7 +5104,11 @@
     gdImageFilledEllipse (im, (plotPrefs.dialImageWidth/2), (plotPrefs.dialImageWidth/2),
                           plotPrefs.dialCtrDiameter, plotPrefs.dialCtrDiameter, centercolor);
 
-    sprintf (text, "%02d", (int)wvutilsGetWindSpeed((float)speed));
+	if (speed > ARCHIVE_VALUE_NULL) {
+	    sprintf (text, "%3.1f", wvutilsGetWindSpeed((float)speed));
+	} else {
+		sprintf (text, "---");
+	}
 
     // center it
     angle = plotPrefs.dialDiameter - (gdFontGiant->w * strlen (text));
@@ -5034,7 +5117,7 @@
     if (angle < 0)
         angle = 0;
     gdImageString (im, gdFontGiant, (int)angle, (plotPrefs.dialImageWidth/2)+32, (uint8_t *)text, centertext);
-    sprintf (text, "%02d", (int)wvutilsGetWindSpeed((float)highSpeed));
+    sprintf (text, "%3.1f", wvutilsGetWindSpeed((float)highSpeed));
 
     // center it
     angle = plotPrefs.dialDiameter - (gdFontSmall->w * strlen (text));
diff -Nbru -X excludes wview-5.20.2-orig/htmlgenerator/htmlGenerate.h wview-5.20.2/htmlgenerator/htmlGenerate.h
--- wview-5.20.2-orig/htmlgenerator/htmlGenerate.h	2012-03-06 13:16:10.000000000 +0100
+++ wview-5.20.2/htmlgenerator/htmlGenerate.h	2013-03-22 18:10:56.701198167 +0100
@@ -234,6 +234,8 @@
 
 #define CHART_MAX_TEMP(x)       (x ? (float)15.0 : (float)60.0)
 #define CHART_MIN_TEMP(x)       (x ? (float)0.0 : (float)40.0)
+#define CHART_MAX_DIFFTEMP(x)       (x ? (float)5.0 : (float)10.0)
+#define CHART_MIN_DIFFTEMP(x)       (x ? (float)-5.0 : (float)-10.0)
 extern int htmlGenPngChart
 (
     char            *fname,
@@ -330,8 +332,8 @@
     char            *fname,
     int             direction,               // 0 - 359 degrees
     int             highDirection,           // 0-359 degrees
-    int             speed,
-    int             highSpeed,
+    float           speed,
+    float           highSpeed,
     char            *title
 );
 
diff -Nbru -X excludes wview-5.20.2-orig/htmlgenerator/images.c wview-5.20.2/htmlgenerator/images.c
--- wview-5.20.2-orig/htmlgenerator/images.c	2012-03-06 17:15:14.000000000 +0100
+++ wview-5.20.2/htmlgenerator/images.c	2013-02-16 14:53:19.411338352 +0100
@@ -4109,24 +4109,43 @@
 
 // first a few buckets for common extended items
 
+// jo's-te923-hack: UV holds temp diff
 static int generateUV (HTML_IMG *img)
 {
     char        temp[256];
 
     sprintf (temp, "%s/%s", img->mgrWork->imagePath, img->fname);
 
+	if (img->mgrWork->isMetricUnits)
+	{
+    	return (htmlGenPngBucket (temp,
+                      1,
+                      wvutilsConvertDeltaFToC(img->mgrWork->loopStore.UV),
+                      wvutilsConvertDeltaFToC(sensorGetDailyLow(img->mgrWork->hilowStore.sensor, SENSOR_UV)),
+                      wvutilsConvertDeltaFToC(sensorGetDailyHigh(img->mgrWork->hilowStore.sensor, SENSOR_UV)),
+                      img->title,
+                      img->units,
+                      img->decimalPlaces,
+                      -10.0,
+                      20.0,
+                      img->mgrWork->dateFormat,
+                      img->mgrWork->isDualUnits));
+	}
+	else
+	{
     return (htmlGenPngBucket (temp,
                       0,
-                      (float)img->mgrWork->loopStore.UV,
-                      (float)GLB_HILOW_NONE,
-                      (float)GLB_HILOW_NONE,
+                          img->mgrWork->loopStore.UV,
+                          sensorGetDailyLow(img->mgrWork->hilowStore.sensor, SENSOR_UV),
+                          sensorGetDailyHigh(img->mgrWork->hilowStore.sensor, SENSOR_UV),
                       img->title,
                       img->units,
                       img->decimalPlaces,
-                      0.0,
-                      4.0,
+                          -20.0,
+                          40.0,
                       img->mgrWork->dateFormat,
                       img->mgrWork->isDualUnits));
+	}
 }
 
 static int generateRadiation (HTML_IMG *img)
@@ -4401,6 +4420,7 @@
 }
 
 
+// jo's-te923-hack: UV holds temp diff
 static int generateUVDay (HTML_IMG *img)
 {
     int         i, j;
@@ -4427,8 +4447,8 @@
                      img->mgrWork->isMetricUnits,
                      img->mgrWork->dayValues[DATA_INDEX_UV],
                      6,
-                     0,
-                     5,
+                     CHART_MIN_DIFFTEMP(img->mgrWork->isMetricUnits),
+                     CHART_MAX_DIFFTEMP(img->mgrWork->isMetricUnits),
                      1.0,
                      labels,
                      DAILY_NUM_VALUES(img->mgrWork),
@@ -4437,9 +4457,10 @@
                      img->units,
                      img->decimalPlaces,
                      img->mgrWork->dateFormat,
-                     0));
+                     img->mgrWork->isDualUnits));
 }
 
+// jo's-te923-hack: UV holds temp diff
 static int generateUVWeek (HTML_IMG *img)
 {
     int         i, skipNo;
@@ -4492,8 +4513,8 @@
                      img->mgrWork->isMetricUnits,
                      &img->mgrWork->weekValues[DATA_INDEX_UV][skipNo],
                      7,
-                     0,
-                     5,
+                     CHART_MIN_DIFFTEMP(img->mgrWork->isMetricUnits),
+                     CHART_MAX_DIFFTEMP(img->mgrWork->isMetricUnits),
                      1.0,
                      labels,
                      WEEKLY_NUM_VALUES-skipNo,
@@ -4502,9 +4523,10 @@
                      img->units,
                      img->decimalPlaces,
                      img->mgrWork->dateFormat,
-                     0));
+                     img->mgrWork->isDualUnits));
 }
 
+// jo's-te923-hack: UV holds temp diff
 static int generateUVMonth (HTML_IMG *img)
 {
     int         i, skipNo;
@@ -4557,8 +4579,8 @@
                      img->mgrWork->isMetricUnits,
                      &img->mgrWork->monthValues[DATA_INDEX_UV][skipNo],
                      14,
-                     0,
-                     5,
+                     CHART_MIN_DIFFTEMP(img->mgrWork->isMetricUnits),
+                     CHART_MAX_DIFFTEMP(img->mgrWork->isMetricUnits),
                      1.0,
                      labels,
                      MONTHLY_NUM_VALUES-skipNo,
@@ -4567,9 +4589,10 @@
                      img->units,
                      img->decimalPlaces,
                      img->mgrWork->dateFormat,
-                     0));
+                     img->mgrWork->isDualUnits));
 }
 
+// jo's-te923-hack: UV holds temp diff
 static int generateUVYear (HTML_IMG *img)
 {
     int         i;
@@ -4598,8 +4621,8 @@
                      img->mgrWork->isMetricUnits,
                      img->mgrWork->yearValues[DATA_INDEX_UV],
                      4,
-                     0,
-                     5,
+                     CHART_MIN_DIFFTEMP(img->mgrWork->isMetricUnits),
+                     CHART_MAX_DIFFTEMP(img->mgrWork->isMetricUnits),
                      1.0,
                      labels,
                      YEARLY_NUM_VALUES,
@@ -4608,7 +4631,7 @@
                      img->units,
                      img->decimalPlaces,
                      img->mgrWork->dateFormat,
-                     0));
+                     img->mgrWork->isDualUnits));
 }
 
 
diff -Nbru -X excludes wview-5.20.2-orig/stations/common/computedData.c wview-5.20.2/stations/common/computedData.c
--- wview-5.20.2-orig/stations/common/computedData.c	2012-02-24 14:42:33.000000000 +0100
+++ wview-5.20.2/stations/common/computedData.c	2013-03-10 16:28:21.232210602 +0100
@@ -757,7 +757,7 @@
     windAvg = sensorGetAvg (&work->sensors.sensor[STF_HOUR][SENSOR_WSPEED]);
     tempAvg = sensorGetAvg (&work->sensors.sensor[STF_HOUR][SENSOR_OUTTEMP]);
     work->loopPkt.intervalAvgWCHILL = wvutilsCalculateWindChill(tempAvg, windAvg);
-    work->loopPkt.intervalAvgWSPEED = (uint16_t)windAvg;
+    work->loopPkt.intervalAvgWSPEED = windAvg;
 
 
     return;
@@ -773,7 +773,7 @@
     windAvg = sensorGetAvg (&work->sensors.sensor[STF_INTERVAL][SENSOR_WSPEED]);
     tempAvg = sensorGetAvg (&work->sensors.sensor[STF_INTERVAL][SENSOR_OUTTEMP]);
     work->loopPkt.intervalAvgWCHILL = wvutilsCalculateWindChill(tempAvg, windAvg);
-    work->loopPkt.intervalAvgWSPEED = (uint16_t)windAvg;
+    work->loopPkt.intervalAvgWSPEED = windAvg;
 
 
     return;
@@ -810,7 +810,8 @@
 
     if (work->loopPkt.sampleET > ARCHIVE_VALUE_NULL)
         sensorUpdate (&sample[SENSOR_ET], work->loopPkt.sampleET);
-    if (work->loopPkt.UV != 0xFFFF)
+    // jo's-te923-hack: UV holds temp diff
+    if (work->loopPkt.UV > ARCHIVE_VALUE_NULL)
         sensorUpdate (&sample[SENSOR_UV], (float)work->loopPkt.UV);
     if (work->loopPkt.radiation != 0xFFFF)
         sensorUpdate (&sample[SENSOR_SOLRAD], (float)work->loopPkt.radiation);
@@ -960,26 +961,39 @@
     // These are conditional based on loop data being populated:
     if (work->loopPkt.radiation != 0xFFFF)
         ArcRecStore.value[DATA_INDEX_radiation]      = (float)sensorGetAvg (&sample[SENSOR_SOLRAD]);
-    if (work->loopPkt.UV != 0xFFFF)
+    if (work->loopPkt.UV > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_UV]             = (float)sensorGetAvg (&sample[SENSOR_UV]);
-    if (work->loopPkt.sampleET != ARCHIVE_VALUE_NULL)
+    if (work->loopPkt.sampleET > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_ET]             = (float)sensorGetCumulative (&sample[SENSOR_ET]);
-    if (work->loopPkt.wxt510Hail != ARCHIVE_VALUE_NULL)
+    if (work->loopPkt.wxt510Hail > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_hail]           = (float)sensorGetCumulative (&sample[SENSOR_HAIL]);
-    if (work->loopPkt.wxt510Hailrate != ARCHIVE_VALUE_NULL)
+    if (work->loopPkt.wxt510Hailrate > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_hailrate]       = (float)sensorGetHigh (&sample[SENSOR_HAILRATE]);
 
+	// jo's te923-hack: populate additional fields that are available from the te923
+	if (work->loopPkt.extraTemp[0] > ARCHIVE_VALUE_NULL)
+		ArcRecStore.value[DATA_INDEX_extraTemp1] = (float)work->loopPkt.extraTemp[0];
+	if (work->loopPkt.extraHumidity[0] > ARCHIVE_VALUE_NULL)
+		ArcRecStore.value[DATA_INDEX_extraHumid1] = (float)work->loopPkt.extraHumidity[0];
+	if (work->loopPkt.extraTemp[1] > ARCHIVE_VALUE_NULL)
+		ArcRecStore.value[DATA_INDEX_extraTemp2] = (float)work->loopPkt.extraTemp[1];
+	if (work->loopPkt.extraTemp[2] > ARCHIVE_VALUE_NULL)
+		ArcRecStore.value[DATA_INDEX_extraTemp3] = (float)work->loopPkt.extraTemp[2];
+	ArcRecStore.value[DATA_INDEX_outTempBatteryStatus] = work->loopPkt.outTempBatteryStatus;
+	ArcRecStore.value[DATA_INDEX_txBatteryStatus] = work->loopPkt.extraTempBatteryStatus[0];
+	ArcRecStore.value[DATA_INDEX_windBatteryStatus] = work->loopPkt.windBatteryStatus;
+	ArcRecStore.value[DATA_INDEX_rainBatteryStatus] = work->loopPkt.rainBatteryStatus;
 
     // Get a few directly from the last LOOP_PKT:
     if (work->loopPkt.rxCheckPercent != 0xFFFF)
         ArcRecStore.value[DATA_INDEX_rxCheckPercent] = (float)work->loopPkt.rxCheckPercent;
-    if (work->loopPkt.wxt510HeatingTemp != ARCHIVE_VALUE_NULL)
+    if (work->loopPkt.wxt510HeatingTemp > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_heatingTemp]    = (float)work->loopPkt.wxt510HeatingTemp;
-    if (work->loopPkt.wxt510HeatingVoltage != ARCHIVE_VALUE_NULL)
+    if (work->loopPkt.wxt510HeatingVoltage > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_heatingVoltage] = (float)work->loopPkt.wxt510HeatingVoltage;
-    if (work->loopPkt.wxt510SupplyVoltage != ARCHIVE_VALUE_NULL)
+    if (work->loopPkt.wxt510SupplyVoltage > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_supplyVoltage]  = (float)work->loopPkt.wxt510SupplyVoltage;
-    if (work->loopPkt.wxt510ReferenceVoltage != ARCHIVE_VALUE_NULL)
+    if (work->loopPkt.wxt510ReferenceVoltage > ARCHIVE_VALUE_NULL)
         ArcRecStore.value[DATA_INDEX_referenceVoltage] = (float)work->loopPkt.wxt510ReferenceVoltage;
     if (work->loopPkt.wmr918WindBatteryStatus != 0xFF)
         ArcRecStore.value[DATA_INDEX_windBatteryStatus] = (float)work->loopPkt.wmr918WindBatteryStatus;
diff -Nbru -X excludes wview-5.20.2-orig/stations/common/daemon.c wview-5.20.2/stations/common/daemon.c
--- wview-5.20.2-orig/stations/common/daemon.c	2012-03-06 13:16:10.000000000 +0100
+++ wview-5.20.2/stations/common/daemon.c	2013-02-18 20:21:12.385162398 +0100
@@ -29,6 +29,7 @@
 #include <sys/wait.h>
 #include <unistd.h>
 #include <signal.h>
+#include <utime.h>
 
 /*  ... Library include files
 */
@@ -72,6 +73,9 @@
         return OK;
     }
 
+	// jo's-te923-hack: touch pidfile as a heart beat
+	utime(wviewdWork.pidFile, NULL);
+
     // Adjust for calibrations:
     // DO NOT calibrate pressure here:
 
@@ -123,14 +127,15 @@
     computedDataStoreSample (&wviewdWork);
 
     // lose any trace amounts to avoid rounding up by sprintf:
+	// jo's-te923-hack: take one more digit for rain
     sampleRain = sensorGetCumulative(&wviewdWork.sensors.sensor[STF_INTERVAL][SENSOR_RAIN]);
-    sampleRain *= 100;
+    sampleRain *= 10000;
     sampleRain = floorf (sampleRain);
-    sampleRain /= 100;
+    sampleRain /= 10000;
     sampleET = sensorGetCumulative(&wviewdWork.sensors.sensor[STF_INTERVAL][SENSOR_ET]);
-    sampleET *= 1000;
+    sampleET *= 10000;
     sampleET = floorf (sampleET);
-    sampleET /= 1000;
+    sampleET /= 10000;
 
     // do some post-processing on the LOOP data:
     tempf = stormRainGet();
diff -Nbru -X excludes wview-5.20.2-orig/stations/common/station.c wview-5.20.2/stations/common/station.c
--- wview-5.20.2-orig/stations/common/station.c	2012-03-21 13:22:24.000000000 +0100
+++ wview-5.20.2/stations/common/station.c	2013-03-05 18:31:19.105821960 +0100
@@ -242,8 +242,8 @@
                         loop.loopData.sampleET = 0;
                     if (loop.loopData.radiation == 0xFFFF)
                         loop.loopData.radiation = 0;
-                    if (loop.loopData.UV < 0)
-                        loop.loopData.UV = 0;
+                    /*if (loop.loopData.UV < 0)
+                        loop.loopData.UV = 0;*/
                     if (loop.loopData.rxCheckPercent == 0xFFFF)
                         loop.loopData.rxCheckPercent = 0;
                     if (loop.loopData.wxt510Hail == ARCHIVE_VALUE_NULL)
@@ -529,7 +529,7 @@
 {
     work->loopPkt.sampleET                      = ARCHIVE_VALUE_NULL;
     work->loopPkt.radiation                     = 0xFFFF;
-    work->loopPkt.UV                            = -1;
+    work->loopPkt.UV                            = ARCHIVE_VALUE_NULL;
     work->loopPkt.rxCheckPercent                = 0xFFFF;
     work->loopPkt.wxt510Hail                    = ARCHIVE_VALUE_NULL;
     work->loopPkt.wxt510Hailrate                = ARCHIVE_VALUE_NULL;
diff -Nbru -X excludes wview-5.20.2-orig/stations/TE923/te923Protocol.c wview-5.20.2/stations/TE923/te923Protocol.c
--- wview-5.20.2-orig/stations/TE923/te923Protocol.c	2012-02-24 15:01:45.000000000 +0100
+++ wview-5.20.2/stations/TE923/te923Protocol.c	2013-03-20 21:33:37.456002554 +0100
@@ -68,6 +68,55 @@
     return ((int)((byte & 0xF0) >> 4) * 10 + (int)(byte & 0x0F));
 }
 
+// jo's-te923-hack: extract all the temp/humidity-decoding into one single
+// function
+static void decodeTempHum(uint8_t *val, uint8_t mask, float *temp, float *hum)
+{
+	int isInvalid = FALSE;
+	
+    if (bcdDecode(val[0] & 0x0F) > 9)
+    {
+		*temp = ARCHIVE_VALUE_NULL;
+        if (((val[0] & 0x0F) == 0x0C) || ((val[0] & 0x0F) == 0x0B))
+        {
+            isInvalid = TRUE;
+        }
+    }
+    else
+    {
+        if ((val[1] & mask) != mask)
+        {
+            *temp = ARCHIVE_VALUE_NULL;
+            isInvalid = TRUE;
+        }
+        else
+        {
+            *temp = (bcdDecode(val[0]) / 10.0) + (bcdDecode(val[1] & 0x0F) * 10.0);
+            if ((val[1] & 0x20) == 0x20)
+            {
+                *temp += 0.05;
+            }
+            if ((val[1] & 0x80) != 0x80)
+            {
+                *temp *= -1;
+            }
+            *temp = wvutilsConvertCToF(*temp);
+        }
+    }
+
+	if (hum == NULL)
+		return;
+
+    if (isInvalid || (bcdDecode(val[2] & 0x0F) > 9))
+    {
+		*hum = ARCHIVE_VALUE_NULL;
+    }
+    else
+    {
+		*hum = bcdDecode(val[2]);
+    }
+}
+
 static int readBlock (WVIEWD_WORK *work, int offset, uint8_t* buffer)
 {
     // Read data at offset 'offset':
@@ -133,6 +182,7 @@
     float*          pTemp;
     int             adr = 0x020001;
     uint8_t         buf[TE923_BUFLEN];
+    char            sbuf[2*TE923_BUFLEN + 1];
 
     if ((*(work->medium.usbhidInit))(&work->medium) != OK)
     {
@@ -158,6 +208,13 @@
         return ERROR;
     }
 
+	// jo's-te923-hack: log the station data to syslog
+	for (i = 0; i < TE923_BUFLEN; i++) {
+		sprintf(sbuf + 2*i, "%02X", buf[i]);
+	}
+	sbuf[2*TE923_BUFLEN] = '\0';
+	radMsgLog(PRI_STATUS, "station data: %s\n", sbuf);
+		
     // Loose the header byte:
     memmove(buf, buf + 1, TE923_BUFLEN-1);
 
@@ -165,79 +222,20 @@
     for (i = 0; i <= TE923_MAX_CHANNELS; i ++)
     {
         offset = i * 3;
-        isInvalid = FALSE;
-
-        if (bcdDecode(buf[0+offset] & 0x0F) > 9)
-        {
-            if (i == 0)
-            {
-                sensors->intemp = ARCHIVE_VALUE_NULL;
-            }
-            else
-            {
-                sensors->outtemp[i-1] = ARCHIVE_VALUE_NULL;
-            }
-            if (((buf[0+offset] & 0x0F) == 0x0C) || ((buf[0+offset] & 0x0F) == 0x0B))
-            {
-                isInvalid = TRUE;
-            }
-        }
-        else
-        {
-            if (((buf[1+offset] & 0x40) != 0x40) && i > 0)
-            {
-                sensors->outtemp[i-1] = ARCHIVE_VALUE_NULL;
-                isInvalid = TRUE;
-            }
-            else
-            {
-                if (i == 0)
-                {
-                    pTemp = &sensors->intemp;
-                }
-                else
-                {
-                    pTemp = &sensors->outtemp[i-1];
-                }
+		if (i == 0) {
+			decodeTempHum (buf + offset, 0, &sensors->intemp,
+			               &sensors->inhumidity);
             
-                *pTemp = (bcdDecode(buf[0+offset]) / 10.0) + (bcdDecode(buf[1+offset] & 0x0F) * 10.0);
-                if ((buf[1+offset] & 0x20) == 0x20)
-                {
-                    *pTemp += 0.05;
-                }
-                if ((buf[1+offset] & 0x80) != 0x80)
-                {
-                    *pTemp *= -1;
-                }
-                *pTemp = wvutilsConvertCToF(*pTemp);
-            }
-        }
+		} else {
+			decodeTempHum (buf + offset, 0x40, &sensors->outtemp[i - 1],
+						   &sensors->outhumidity[i - 1]);
 
-        if (isInvalid || (bcdDecode(buf[2+offset] & 0x0F) > 9))
-        {
-            if (i == 0)
-            {
-                sensors->inhumidity = ARCHIVE_VALUE_NULL;
-            }
-            else
-            {
-                sensors->outhumidity[i-1] = ARCHIVE_VALUE_NULL;
-            }
-        }
-        else
-        {
-            if (i == 0)
-            {
-                sensors->inhumidity = bcdDecode(buf[2+offset]);
-            }
-            else
-            {
-                sensors->outhumidity[i-1] = bcdDecode(buf[2+offset]);
-            }
         }
     }
 
+	// jo's-te923-hack: there is no UV sensor for the tfa nexus
     // decode value from UV sensor:
+    /*
     if ((buf[18] == 0xAA) && (buf[19] == 0x0A))
     {
         sensors->UV = ARCHIVE_VALUE_NULL;
@@ -252,6 +250,7 @@
                       bcdDecode((buf[18] & 0xF0) >> 4) +
                       bcdDecode(buf[19] & 0x0F) * 10.0;
     }
+	*/
 
     // decode pressure:
     if ((buf[21] & 0xF0) == 0xF0)
@@ -264,6 +263,9 @@
         sensors->pressure = wvutilsConvertHPAToINHG(sensors->pressure);
     }
 
+	// jo's-te923-hack: put the station's calculated windchill into channel 3
+	decodeTempHum(buf + 23, 0x40, &sensors->outtemp[2], NULL);
+		               
     // decode windgust:
     isInvalid = FALSE;
     if ((bcdDecode(buf[25] & 0xF0) > 90) || (bcdDecode(buf[25] & 0x0F) > 9))
@@ -472,6 +474,10 @@
     {
         dest->outTemp  = src->outtemp[0];
     }
+	else
+	{
+		dest->outTemp = ARCHIVE_VALUE_NULL;
+	}
 
     if (0 <= src->outhumidity[0] && src->outhumidity[0] <= 100)
     {
@@ -480,11 +486,14 @@
         dest->outHumidity  = (uint16_t)tempfloat;
     }
 
+    // jo's-te923-hack: windSpeed changed to float
     if (0 <= src->windAvgSpeed && src->windAvgSpeed <= 250)
     {
-        tempfloat = src->windAvgSpeed;
-        tempfloat += 0.5;
-        dest->windSpeed  = (uint16_t)tempfloat;
+        dest->windSpeed = src->windAvgSpeed;
+    }
+	else
+	{
+		dest->windSpeed = ARCHIVE_VALUE_NULL;
     }
 
     if (0 <= src->windDir && src->windDir <= 360)
@@ -497,9 +506,11 @@
 
     if (0 <= src->windGustSpeed && src->windGustSpeed <= 250)
     {
-        tempfloat = src->windGustSpeed;
-        tempfloat += 0.5;
-        dest->windGust       = (uint16_t)tempfloat;
+        dest->windGust       = src->windGustSpeed;
+    }
+	else
+	{
+		dest->windGust = ARCHIVE_VALUE_NULL;
     }
 
     if (0 <= src->rain)
@@ -551,6 +562,20 @@
     dest->inHumidity                    = (uint16_t)tempfloat;
     dest->UV                            = src->UV;
 
+
+    // jo's-te923-hack: calculate anemometer temp and UV as difference between
+	// anemometer temp and outtemp
+	if (src->outtemp[0] > ARCHIVE_VALUE_NULL && src->outtemp[2] > ARCHIVE_VALUE_NULL
+	 	   && src->windAvgSpeed > ARCHIVE_VALUE_NULL) {
+		// get windchill
+		src->outtemp[3] = wvutilsCalculateWindUnchill(src->outtemp[2], src->windAvgSpeed);
+		// get "UV"
+		dest->UV = src->outtemp[3] - src->outtemp[0];
+	} else {
+		dest->UV = ARCHIVE_VALUE_NULL;
+		src->outtemp[3] = ARCHIVE_VALUE_NULL;
+	}
+
     // Do the extras:
     for (i = 1; i < TE923_MAX_CHANNELS; i ++)
     {
@@ -559,6 +584,15 @@
         dest->extraTempBatteryStatus[i-1]   = src->statusSensor[i];
     }
 
+	// jo's-te923-hack: provide extra sensors
+	dest->extraTemp1 = src->outtemp[1];
+	dest->extraTemp2 = src->outtemp[2];
+	dest->extraTemp3 = src->outtemp[3];
+	dest->extraHumid1 = src->outhumidity[1];
+
+	// jo's-te923-hack: provide outTempBatteryStatus
+	dest->outTempBatteryStatus			= src->statusSensor[0];
+	
     dest->uvBatteryStatus               = src->statusUV;
     dest->windBatteryStatus             = src->statusWind;
     dest->rainBatteryStatus             = src->statusRain;
diff -Nbru -X excludes wview-5.20.2-orig/stations/Virtual/virtualProtocol.c wview-5.20.2/stations/Virtual/virtualProtocol.c
--- wview-5.20.2-orig/stations/Virtual/virtualProtocol.c	2012-02-24 13:45:40.000000000 +0100
+++ wview-5.20.2/stations/Virtual/virtualProtocol.c	2013-03-03 18:45:02.475560205 +0100
@@ -71,6 +71,7 @@
     ARCHIVE_PKT     archiveRecord;
     ARCHIVE_PKT     hostRecord;
     RADSOCK_ID      sockId = (*work->medium.getsocket)(&work->medium);
+	time_t			archtime;
 
     /* try to find the start frame (this blocks if the socket is empty) */
     retVal = datafeedSyncStartOfFrame(sockId);
@@ -110,13 +111,13 @@
 
             // Convert from network byte order:
             datafeedConvertArchive_NTOH(&hostRecord, &archiveRecord);
-
             virtualWork.data.archiveData = hostRecord;
 
             if (hostRecord.dateTime != 0)
             {
+				archtime = hostRecord.dateTime;
                 radMsgLog (PRI_STATUS, "VIRTUAL: RX archive from remote station: %s",
-                           ctime((const time_t*)(&hostRecord.dateTime))); 
+                           ctime(&archtime)); 
             }
 
             if (virtualWork.IsArchiveNeeded)
