diff --git a/VIPSWeb/settings.py b/VIPSWeb/settings.py
index c9b565924da3b8ac4a06decfb7d7065d4d572fe4..82b3c51d07f4a6fae87b5d18d07fdf92b613a835 100755
--- a/VIPSWeb/settings.py
+++ b/VIPSWeb/settings.py
@@ -140,6 +140,7 @@ INSTALLED_APPS = (
     'applefruitmoth',
     'fusarium',
     'security',
+    'mock',
     'VIPSWeb'
 )
 
diff --git a/VIPSWeb/static/js/util.js b/VIPSWeb/static/js/util.js
index 27915a66bac343008d5835284f5783a446459c75..9aa3d20a870d2fb16fc7b682442da0d4de2222df 100755
--- a/VIPSWeb/static/js/util.js
+++ b/VIPSWeb/static/js/util.js
@@ -319,4 +319,34 @@ function getMultipleSelectedValues(list)
 		}
 	}
 	return retVal;
+}
+
+function getJSON(ambiguousVar)
+{
+	try
+	{
+		// Is it a JSON string?
+		return JSON.parse(ambiguousVar);
+	}
+	catch(e)
+	{
+		return isDict(ambiguousVar) ? ambiguousVar : null; 
+	}
+}
+
+function isDict(v){
+	return typeof v==='object' && v!==null && !(v instanceof Array) && !(v instanceof Date);
+}
+
+function getUnixTimestampFromJSON(ambiguousValue)
+{
+	var possibleDateObject = new Date(ambiguousValue);
+	if(possibleDateObject.getTime() === NaN && typeof parseInt(ambiguousValue) === "number")
+	{
+		return parseInt(ambiguousValue);
+	}
+	else
+	{
+		return possibleDateObject.getTime();
+	}
 }
\ No newline at end of file
diff --git a/VIPSWeb/urls.py b/VIPSWeb/urls.py
index 869c91385c82ab07dd643391985713b2d0dcaf51..07f1a92f61f484ae2ecad72b40eebf8c206c2131 100755
--- a/VIPSWeb/urls.py
+++ b/VIPSWeb/urls.py
@@ -56,6 +56,7 @@ else:
         url(r'^security/', include('security.urls', namespace = "security")),
         url(r'^fusarium/', include('fusarium.urls', namespace = "fusarium")),
         url(r'^applefruitmoth/', include('applefruitmoth.urls', namespace = "applefruitmoth")),
+        url(r'^mock/', include('mock.urls', namespace = "mock")),
         # Uncomment the next line to enable the admin:
         url(r'^admin/', include(admin.site.urls)),
         url(r'^tinymce/', include('tinymce.urls')),
diff --git a/forecasts/static/forecasts/js/forecasts.js b/forecasts/static/forecasts/js/forecasts.js
index 7853faa1a9294c8943b8a038fa3cd5e81db89735..0753c1aed6834b104208f727c51a0bf8e5345d78 100755
--- a/forecasts/static/forecasts/js/forecasts.js
+++ b/forecasts/static/forecasts/js/forecasts.js
@@ -244,8 +244,8 @@ function getWarningStatusPlotBandData(forecastResults)
 	if (forecastResults != null && forecastResults.length >=2)
 	{
 		// Replace with Moment.js
-		var start = forecastResults[0]["validTimeStart"];
-		var end = forecastResults[1]["validTimeStart"];
+		var start = getUnixTimestampFromJSON(forecastResults[0]["validTimeStart"]);
+		var end = getUnixTimestampFromJSON(forecastResults[1]["validTimeStart"]);
 		
 		bandOffset = (end - start) / 2;
 		//console.log("bandOffset=" + bandOffset);
@@ -259,13 +259,13 @@ function getWarningStatusPlotBandData(forecastResults)
 			if(plotBand != null)
 			{
 				// Moment.js needed!
-			    plotBand["to"] = forecastResult["validTimeStart"] - bandOffset;
+			    plotBand["to"] = getUnixTimestampFromJSON(forecastResult["validTimeStart"]) - bandOffset;
 			    plotBands.push(plotBand);
 			}
 			plotBand = {
 		         "color": warningStatuses[forecastResult["warningStatus"]].color,
 		         // Moment.js!!
-		         "from" : forecastResult["validTimeStart"] - bandOffset
+		         "from" : getUnixTimestampFromJSON(forecastResult["validTimeStart"]) - bandOffset
 	        };
 		}
 		previousForecastResult = forecastResult;
@@ -275,7 +275,7 @@ function getWarningStatusPlotBandData(forecastResults)
 	if(plotBand != null && plotBand["to"] == null)
 	{
 		// Moment.js!!!
-		plotBand.to = forecastResults[forecastResults.length -1]["validTimeStart"] + bandOffset;
+		plotBand.to = getUnixTimestampFromJSONforecastResults([forecastResults.length -1]["validTimeStart"]) + bandOffset;
 		plotBands.push(plotBand);
 	}
 	
@@ -305,11 +305,12 @@ function getHighChartsSeries(forecastResults, yAxisList, parameterList)
 	for(var i in forecastResults)
 	{
 		var forecastResult = forecastResults[i];
+		var allValues = getJSON(forecastResult["allValues"]);
 		for(var j in parameterList)
 		{
 			var parameter = parameterList[j];
-			var value = parseFloat(forecastResult["allValues"][parameter.key]);
-			chartSeries.series[parameter.key].data.push([forecastResult.validTimeStart,value]);
+			var value = parseFloat(allValues[parameter.key]);
+			chartSeries.series[parameter.key].data.push([getUnixTimestampFromJSON(forecastResult.validTimeStart),value]);
 		}
 	}
 	
diff --git a/roughage/static/roughage/js/nutrition.js b/roughage/static/roughage/js/nutrition.js
index 256940b0e85ab5817a93018d57c9510c416f0f8e..b24922462ba0c1947efedf3e22ac3f5440a71fc6 100755
--- a/roughage/static/roughage/js/nutrition.js
+++ b/roughage/static/roughage/js/nutrition.js
@@ -193,7 +193,8 @@ var renderNutritionModelResults = function(data,textStatus, jqXHR)
 	for(var i in charts)
 	{
 		var lines = [{key: charts[i].key, type: "spline", color: "red", name: charts[i].name, showInLegend: false, yAxis: 0}];
-		if(data[0].keys.indexOf(charts[i].key + normalValueKeySuffix) >= 0)
+		
+		if(getJSON(data[0].keys).indexOf(charts[i].key + normalValueKeySuffix) >= 0)
 		{
 			lines.push({key: charts[i].key + normalValueKeySuffix, type: "spline", color: "green", name: charts[i].name + "_NORMAL", showInLegend: true, yAxis: 0})
 		}
@@ -340,7 +341,7 @@ function renderResultTable(tableId, data)
 {
 	var theTable=document.getElementById(tableId);
 	//console.log(data);
-	var headingData = data[0].keys;
+	var headingData = getJSON(data[0].keys);
 	var headerRowHTML =   "<thead>"
 	                    + "	<tr>"
 	                    + "		<th>" + gettext("Date") + "</th>";
@@ -355,9 +356,10 @@ function renderResultTable(tableId, data)
 	for(var i=0; i<data.length; i++)
 	{
 		dataRowsHTML += "<tr><td>" + moment.tz(data[i].validTimeStart, "Europe/Oslo").format("YYYY-MM-DD") + "</td>";
+		var allValues = getJSON(data[i].allValues);
 		for(var j=0;j<headingData.length;j++)
 		{
-			dataRowsHTML += "<td>" + data[i].allValues[headingData[j]] + "</td>";
+			dataRowsHTML += "<td>" + allValues[headingData[j]] + "</td>";
 		}
 		dataRowsHTML += "</tr>";
 	}