diff --git a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/java/org/eclipse/om2m/sdt/home/monitoring/util/FileUtil.java b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/java/org/eclipse/om2m/sdt/home/monitoring/util/FileUtil.java
index fbe2b93..242c0ce 100644
--- a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/java/org/eclipse/om2m/sdt/home/monitoring/util/FileUtil.java
+++ b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/java/org/eclipse/om2m/sdt/home/monitoring/util/FileUtil.java
@@ -11,21 +11,15 @@
 import java.io.InputStreamReader;
 import java.net.URL;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.eclipse.om2m.sdt.home.monitoring.servlet.HomeServlet;
 import org.osgi.framework.BundleContext;
 
 
 public class FileUtil {
 
-	private static Log LOGGER = LogFactory.getLog(HomeServlet.class);
-
 	public static String getFileAsString(final String path,BundleContext context) {
 		String res = "";
 		if (context != null) {				
 			URL url = context.getBundle().getResource(path);
-			LOGGER.info("url ="+url);
 			BufferedReader br = null;
 			try {
 				br = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
@@ -33,7 +27,6 @@
 					res += br.readLine();
 				}
 			} catch (Exception e) {		
-				e.printStackTrace();
 			} finally {
 				try { br.close(); } 
 				catch (Exception ignored) {}
diff --git a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/resources/webapps/js/app.js b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/resources/webapps/js/app.js
index 21dc8cd..3e93db9 100644
--- a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/resources/webapps/js/app.js
+++ b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.applications/org.eclipse.om2m.sdt.home.monitoring/src/main/resources/webapps/js/app.js
@@ -9,25 +9,26 @@
 	var timerForNotifications = null;
 	
 	$scope.imgModules = {
-			'temperature':'temp.jpg',
-			'noise':'noise.jpg',
-			'relativeHumidity':'humidity.png',
-			'atmosphericPressureSensor':'pressure.jpg',
-			'extendedCarbonDioxideSensor':'co2.png',
-			'contactSensor':'open_door_35.png',
-			'motionSensor':'motion_sensor.png',
-			'energyConsumption': 'power_consumption.png'
+		'temperature':'temp.jpg',
+		'noise':'noise.jpg',
+		'relativeHumidity':'humidity.png',
+		'atmosphericPressureSensor':'pressure.jpg',
+		'extendedCarbonDioxideSensor':'co2.png',
+		'contactSensor':'open_door_35.png',
+		'motionSensor':'motion_sensor.png',
+		'energyConsumption': 'power_consumption.png'
 	};
 	
 	$scope.moduleFilterDefinition = {
-			'temperature':'curT0',
-			'noise':'noise',
-			'relativeHumidity':'relHy',
-			'atmosphericPressureSensor':'atmPe',
-			'extendedCarbonDioxideSensor':'cDeVe',
-			'contactSensor':'alarm',
-			'motionSensor':'alarm',
-			'energyConsumption':'power'
+		'temperature':'curT0',
+		'noise':'noise',
+		'relativeHumidity':'relHy',
+		'atmosphericPressureSensor':'atmPe',
+		'extendedCarbonDioxideSensor':'cDeVe',
+		'contactSensor':'alarm',
+		'motionSensor':'alarm',
+		'energyConsumption':'power',
+		'numberValue': 'numVe'
 	};
 	
 	$scope.datapointsNamePerModule = {
@@ -45,7 +46,8 @@
 		"energyConsumption" : ["volte", "currt", "power"],
 		"lock" : ["dooLk", "opeOy"],
 		"battery" : ["discg", "charg", "level", "capay"],
-		"doorStatus": ["dooSt"]
+		"doorStatus": ["dooSt"],
+		"numberValue": ["numVe"]
 	};
 
 	$scope.devices = {};
@@ -69,9 +71,9 @@
 	
 	$scope.load = function() {
 		var req = {
-				method: 'GET',
-				url: $scope.urlBase + '/Home_Monitoring_Application/in-cse/context',
-				params: {sessionId: $scope.sessionId}
+			method: 'GET',
+			url: $scope.urlBase + '/Home_Monitoring_Application/in-cse/context',
+			params: {sessionId: $scope.sessionId}
 		};
 		$http(req).success(function (response, status, headers, config)  {
 			$scope.cseContext = response;
@@ -88,19 +90,19 @@
 	// default polling interval in ms
 	var defaultModulePolling = 180000;
 
-	// blacklist module  polling interval in ms
-	var blModules = ["runMode","streaming","colour","colourSaturation","faultDetection"];
-
-	// fast polling interval in ms
-	var fastModulePolling = 3000;
-	var fastModules = ["binarySwitch","energyConsumption","lock"];
+//	// blacklist module  polling interval in ms
+//	var blModules = ["runMode","streaming","colour","colourSaturation","faultDetection"];
+//
+//	// fast polling interval in ms
+//	var fastModulePolling = 3000;
+//	var fastModules = ["binarySwitch","energyConsumption","lock"];
 	
 	$scope.getDevicesAsArray = function() {
 		return Object.values($scope.devices);
 	};
 	
 	$scope.getModulesFromDevice = function(device) {
-		console.log("getModules called");
+		console.log("getModules for " + device.name);
 		return Object.values(device.modules);
 	};
 
@@ -109,10 +111,7 @@
 	};
 
 	$scope.switchFilter = function (module) {
-		if (!((module.name === 'binarySwitch') || (module.name === 'lock'))) {
-			return false;
-		}
-		return true; 
+		return (module.name === 'binarySwitch') || (module.name === 'lock');
 	};
 
 	//filter to remove any device which contains a streaming module from the display device list
@@ -126,14 +125,14 @@
 	/*************************************************/
 	$scope.getDevices = function() {
 		var req = {
-				method: 'GET',
-				url: $scope.urlBase + '/' + $scope.cseContext 
-					+ '?fu=1&drt=2&lbl=object.type/device',
-				headers: {
-					'Content-Type': 'application/json',
-					'Accept': 'application/json',
-					'X-M2M-Origin': $scope.credentials
-				}
+			method: 'GET',
+			url: $scope.urlBase + '/' + $scope.cseContext 
+				+ '?fu=1&drt=2&lbl=object.type/device',
+			headers: {
+				'Content-Type': 'application/json',
+				'Accept': 'application/json',
+				'X-M2M-Origin': $scope.credentials
+			}
 		};
 		$http(req).success(function (response, status, headers, config)  {
 			
@@ -153,14 +152,14 @@
 				var deviceRi = newDevices[i];
 				
 				var getDeviceReq = {
-						method: 'GET',
-						url: $scope.urlBase + '/~' + deviceRi + '?rcn=7',
-						headers: {
-							'Content-Type': 'application/json',
-							'Accept': 'application/json',
-							'X-M2M-Origin': $scope.credentials
-						}, 
-						deviceRi: deviceRi // add device ri in request
+					method: 'GET',
+					url: $scope.urlBase + '/~' + deviceRi + '?rcn=7',
+					headers: {
+						'Content-Type': 'application/json',
+						'Accept': 'application/json',
+						'X-M2M-Origin': $scope.credentials
+					}, 
+					deviceRi: deviceRi // add device ri in request
 				};
 
 				$http(getDeviceReq).success(function (response, status, headers, config)  {
@@ -201,7 +200,6 @@
 					// add new device in devices list
 					$scope.devices[deviceRi] = device;
 
-
 					// get all the modules for the given device
 					$scope.getModules(device);
 				}).error(function (response, status, headers, config) {
@@ -221,15 +219,15 @@
 	$scope.getModules = function (device) {
 		
 		var getModulesRiReq = {
-				method: 'GET',
-				url: $scope.urlBase + '/' + $scope.cseContext 
-				+ '?fu=1&drt=2&lbl=object.type/module&lbl=device.id/' + device.id,
-				headers: {
-					'Content-Type': 'application/json',
-					'Accept': 'application/json',
-					'X-M2M-Origin': $scope.credentials
-				},
-				device: device
+			method: 'GET',
+			url: $scope.urlBase + '/' + $scope.cseContext 
+			+ '?fu=1&drt=2&lbl=device.id/' + device.id,
+			headers: {
+				'Content-Type': 'application/json',
+				'Accept': 'application/json',
+				'X-M2M-Origin': $scope.credentials
+			},
+			device: device
 		};
 		
 		$http(getModulesRiReq).success(function (response, status, headers, config)  {
@@ -256,14 +254,14 @@
 	$scope.getModule = function (device, moduleRi) {
 		
 		var getModuleReq = {
-				method: 'GET',
-				url: $scope.urlBase + '/~' + moduleRi + '?rcn=7',
-				headers: {
-					'Content-Type': 'application/json',
-					'Accept': 'application/json',
-					'X-M2M-Origin':$scope.credentials
-				},
-				device: device
+			method: 'GET',
+			url: $scope.urlBase + '/~' + moduleRi + '?rcn=7',
+			headers: {
+				'Content-Type': 'application/json',
+				'Accept': 'application/json',
+				'X-M2M-Origin':$scope.credentials
+			},
+			device: device
 		};
 		
 		$http(getModuleReq).success(function (response, status, headers, config)  {
@@ -283,7 +281,7 @@
 			module.id = id;
 			module.ri = root.ri;
 			module.name = moduleName;
-			module.img = 'images/'+$scope.getImageModule(moduleName);
+			module.img = 'images/' + $scope.getImageModule(moduleName);
 			// fill the class with the module name to define the text color. see css file.
 			module.colorClass = tab[tab.length -1];
 
@@ -295,8 +293,6 @@
 				module.isReadOnly = false;
 			}
 			
-			
-
 			// create the attributes
 			var dpNames = $scope.datapointsNamePerModule[module.name];
 			if (dpNames) {
@@ -307,14 +303,11 @@
 				);
 			}
 			
-
 			var propName = $scope.getPropValueModule(moduleName);
 			if (propName) {
 				module.value = module.datapoints[propName].value;	
 			}
 			 
-
-
 			if (module.name === 'streaming') {
 				var index = $scope.getCamModuleIndex(module.id);
 				if (index == -1) {
@@ -344,15 +337,15 @@
 	
 	$scope.createSubscription = function(toBeSubscribedResource) {
 		req = {
-				method : 'POST',
-				url : $scope.urlBase + '/Home_Monitoring_Application/in-cse/context',
-				data : {
-							resourceId:toBeSubscribedResource,
-							sessionId: $scope.sessionId
-						},
-				headers : {
-					'Content-Type' : 'application/json'
-				}
+			method : 'POST',
+			url : $scope.urlBase + '/Home_Monitoring_Application/in-cse/context',
+			data : {
+				resourceId:toBeSubscribedResource,
+				sessionId: $scope.sessionId
+			},
+			headers : {
+				'Content-Type' : 'application/json'
+			}
 		};
 		// don't care about response
 		$http(req);
@@ -361,104 +354,94 @@
 	
 	$scope.getNotifications = function() {
 		req = {
-				method : 'GET',
-				url : $scope.urlBase + '/Home_Monitoring_Application/in-cse/context/notifications',
-				params: {sessionId: $scope.sessionId},
-				headers : {
-					'Accept' : 'application/json'
-				}
+			method : 'GET',
+			url : $scope.urlBase + '/Home_Monitoring_Application/in-cse/context/notifications',
+			params: {sessionId: $scope.sessionId},
+			headers : {
+				'Accept' : 'application/json'
+			}
 		};
 		
 		$http(req).success(
-				function(response, status, headers, config) {
-					// for each notification --> update device & module model
-					 var notifications = response;
-					 // notifications is an array
-					notifications.forEach(
-							function(notification) {
-								console.log(notification);
-								var sgn = notification["m2m:sgn"];
-								var nev = null;
-								if (sgn !== null) {
-									nev = sgn["m2m:nev"];
-								}
-								var rep = null;
-								if (nev != null) {
-									rep = nev["m2m:rep"];
-								}
-								
-								var moduleRep = null;
-								if (rep != null) {
-									var key = $scope.getRootKey(rep);
-									moduleRep = rep[key];
-								}
-								
-								if (moduleRep != null) {
-									var internalModule = $scope.getModuleByRi(moduleRep.ri, moduleRep.pi);
-									console.log(internalModule);
-									
-									
-									var propValueModule = $scope.getPropValueModule(internalModule.name);
-									if (propValueModule) {
-										var value = moduleRep[propValueModule];
-										if (internalModule.value) {
-											internalModule.value = value;
-										}
-									}
-									
-									if (moduleRep.powSe) {
-										console.log('powSe value:' + moduleRep.powSe);
-										var datapoints = internalModule.datapoints;
-										var powSeValue = (moduleRep.powSe === 'true');
-										datapoints.powSe.value = powSeValue;
-										if (internalModule.state != powSeValue) {
-											internalModule.state = powSeValue;
-										}
-										
-										console.log('powSe updated!!!!!!!!!!!!!!!!!');
-									}
-									
-									if (moduleRep.dooLk) {
-										console.log('dooLk value:' + moduleRep.dooLk);
-										var datapoints = internalModule.datapoints;
-										var dooLkValue = (moduleRep.dooLk ==='true');
-										datapoints.dooLk.value = dooLkValue;
-										if (internalModule.state != dooLkValue) {
-											internalModule.state = dooLkValue;
-										}
-									}
-									
-									// put background red
-									// here we need to be carefull with device = moduleRep.pi
-									// as we have announced device.
-									device = $scope.getDeviceByRi(moduleRep.pi);
-									if (device) {
-										
-
-											$scope.removeColor(device);													
-											
-									}
-									
-									
+			function(response, status, headers, config) {
+				// for each notification --> update device & module model
+				var notifications = response;
+				// notifications is an array
+				notifications.forEach(
+					function(notification) {
+						console.log(notification);
+						var sgn = notification["m2m:sgn"];
+						var nev = null;
+						if (sgn !== null) {
+							nev = sgn["m2m:nev"];
+						}
+						var rep = null;
+						if (nev != null) {
+							rep = nev["m2m:rep"];
+						}
+						
+						var moduleRep = null;
+						if (rep != null) {
+							var key = $scope.getRootKey(rep);
+							moduleRep = rep[key];
+						}
+						
+						if (moduleRep != null) {
+							var internalModule = $scope.getModuleByRi(moduleRep.ri, moduleRep.pi);
+							console.log(internalModule);
+							
+							var propValueModule = $scope.getPropValueModule(internalModule.name);
+							if (propValueModule) {
+								var value = moduleRep[propValueModule];
+								if (internalModule.value) {
+									internalModule.value = value;
 								}
 							}
-						);
-				}
+							
+							if (moduleRep.powSe) {
+								console.log('powSe value:' + moduleRep.powSe);
+								var datapoints = internalModule.datapoints;
+								var powSeValue = (moduleRep.powSe === 'true');
+								datapoints.powSe.value = powSeValue;
+								if (internalModule.state != powSeValue) {
+									internalModule.state = powSeValue;
+								}
+								console.log('powSe updated!!!!!!!!!!!!!!!!!');
+							}
+							
+							if (moduleRep.dooLk) {
+								console.log('dooLk value:' + moduleRep.dooLk);
+								var datapoints = internalModule.datapoints;
+								var dooLkValue = (moduleRep.dooLk ==='true');
+								datapoints.dooLk.value = dooLkValue;
+								if (internalModule.state != dooLkValue) {
+									internalModule.state = dooLkValue;
+								}
+							}
+							
+							// put background red
+							// here we need to be carefull with device = moduleRep.pi
+							// as we have announced device.
+							device = $scope.getDeviceByRi(moduleRep.pi);
+							if (device) {
+								$scope.removeColor(device);													
+							}
+						}
+					}
+				);
+			}
 		);
 	}
 	
 	$scope.removeColor = function(d) {
-		
-		d.isUpdated=true;
+		d.isUpdated = true;
 		// remove background after 1,5s
-		
 		$timeout(
 				function() {
 					d.isUpdated = false;
 				}, 
 				1500
 		);
-		
 	}
 	
 	// called when the user clicks on the witch widget in the HMI
@@ -474,66 +457,67 @@
 				var lk = switchModule.state;
 				// switch on/off
 				req = {
-						method : 'PUT',
-						url : switchModule.url,
-						data : '{\"hd:lock\": {\"dooLk\": \"' + lk + '\"}}',
-						headers : {
-							'Content-Type' : 'application/json',
-							'X-M2M-Origin' : $scope.credentials
-						},
-						valueToBeSet: lk,
-						currentSwitch: switchModule
+					method : 'PUT',
+					url : switchModule.url,
+					data : '{\"hd:lock\": {\"dooLk\": \"' + lk + '\"}}',
+					headers : {
+						'Content-Type' : 'application/json',
+						'X-M2M-Origin' : $scope.credentials
+					},
+					valueToBeSet: lk,
+					currentSwitch: switchModule
 				};
 				$http(req).success(function(response, status, headers, config) {
-						console.log("binary lock state changed");
-						
-						// config = switchModule
-						config.currentSwitch.hideSpinning = true;
-						if (config.currentSwitch.state !== config.valueToBeSet) {
-							config.currentSwitch.state = config.valueToBeSet;	
-						}
-						
-						var datapoints = config.currentSwitch.datapoints;
-						datapoints.dooLk.value = config.valueToBeSet;
-						console.log("door lock state changed");
-						
-					}).error(function(response, status, headers, config) {
-						console.log("error on lock state change action");
-						config.currentSwitch.hideSpinning = true;
-						config.currentSwitch.state = !config.valueToBeSet;
-						
-					});
+					console.log("binary lock state changed");
+					
+					// config = switchModule
+					config.currentSwitch.hideSpinning = true;
+					if (config.currentSwitch.state !== config.valueToBeSet) {
+						config.currentSwitch.state = config.valueToBeSet;	
+					}
+					
+					var datapoints = config.currentSwitch.datapoints;
+					datapoints.dooLk.value = config.valueToBeSet;
+					console.log("door lock state changed");
+					
+				}).error(function(response, status, headers, config) {
+					console.log("error on lock state change action");
+					config.currentSwitch.hideSpinning = true;
+					config.currentSwitch.state = !config.valueToBeSet;
+					
+				});
 			}			
 		} else if (switchModule.name === 'binarySwitch') {
 			switchModule.newState = switchModule.state;
 			req = {
-					method : 'PUT',
-					url : switchModule.url,
-					data : '{\"hd:binSh\": {\"powSe\": \"' + switchModule.state + '\"}}',
-					headers : {
-						'Content-Type' : 'application/json',
-						'X-M2M-Origin' : $scope.credentials
-					}, 
-					valueToBeSet : switchModule.state,
-					currentSwitch : switchModule
-					
+				method : 'PUT',
+				url : switchModule.url,
+				data : '{\"hd:binSh\": {\"powSe\": \"' + switchModule.state + '\"}}',
+				headers : {
+					'Content-Type' : 'application/json',
+					'X-M2M-Origin' : $scope.credentials
+				}, 
+				valueToBeSet : switchModule.state,
+				currentSwitch : switchModule
 			};
 			$http(req).success(
-					function(response, status, headers, config) {
-						// binarySwitchModule.state = !binarySwitchModule.state;
-						config.currentSwitch.hideSpinning = true;
-						if (config.currentSwitch.state !== config.valueToBeSet) {
-							config.currentSwitch.state = config.valueToBeSet;	
-						}
-						
-						var datapoints = config.currentSwitch.datapoints;
-						datapoints.powSe.value = config.valueToBeSet;
-						console.log("binary switch state changed");
-					}).error(function(response, status, headers, config) {
-							config.currentSwitch.hideSpinning = true;
-							config.currentSwitch.state = !config.valueToBeSet;
-							console.log("error on binary switch state change action");
-						});
+				function(response, status, headers, config) {
+					// binarySwitchModule.state = !binarySwitchModule.state;
+					config.currentSwitch.hideSpinning = true;
+					if (config.currentSwitch.state !== config.valueToBeSet) {
+						config.currentSwitch.state = config.valueToBeSet;	
+					}
+					
+					var datapoints = config.currentSwitch.datapoints;
+					datapoints.powSe.value = config.valueToBeSet;
+					console.log("binary switch state changed");
+				})
+				.error(function(response, status, headers, config) {
+					config.currentSwitch.hideSpinning = true;
+					config.currentSwitch.state = !config.valueToBeSet;
+					console.log("error on binary switch state change action");
+				}
+			);
 		}
 	}
 
@@ -782,12 +766,12 @@
 	
 	var init = function () {
 		var req = {
-				method: 'GET',
-				url: '../security/cred',
-				params : {sessionId: $scope.sessionId},
-				headers: {
-					'Content-Type': 'application/json'
-				}
+			method: 'GET',
+			url: '../security/cred',
+			params : {sessionId: $scope.sessionId},
+			headers: {
+				'Content-Type': 'application/json'
+			}
 		};
 		$http(req).success(function (response, status, headers, config)  {
 			$scope.credentials = response.credentials;
