diff --git a/static/js/bmcApp.js b/static/js/bmcApp.js
index fb641ab..f1e02c7 100644
--- a/static/js/bmcApp.js
+++ b/static/js/bmcApp.js
@@ -71,6 +71,19 @@
   }
 ]);
 
+app.directive('fileInput', ['$parse', function ($parse) {
+    return {
+        restrict: 'A',
+        link: function (scope, element, attributes) {
+            element.bind('change', function () {
+                $parse(attributes.fileInput)
+                .assign(scope,element[0].files)
+                scope.$apply()
+            });
+        }
+    };
+}]);
+
 app.run([
   '$rootScope', '$cookieStore', '$state', 'AuthenticationService', '$http',
   '$templateCache',
diff --git a/static/js/dbusWebsocketFactory.js b/static/js/dbusWebsocketFactory.js
new file mode 100644
index 0000000..716f2df
--- /dev/null
+++ b/static/js/dbusWebsocketFactory.js
@@ -0,0 +1,20 @@
+angular.module('bmcApp').factory('dbusWebsocketService', [
+  '$location',
+  function($location) {
+    return {
+      start: function(dbus_namespace, callback) {
+        var url = '/dbus_monitor?path_namespace=' + dbus_namespace;
+        var host = $location.host();
+        var port = 18080;
+        var protocol = 'wss://';
+        if ($location.protocol() === 'http') {
+          protocol = 'ws://';
+        }
+        var websocket = new WebSocket(protocol + host + ':' + port + url);
+        websocket.onopen = function() {};
+        websocket.onclose = function() {};
+        websocket.onmessage = function(evt) { callback(evt); };
+      }
+    }
+  }
+]);
\ No newline at end of file
diff --git a/static/js/fwupdateController.js b/static/js/fwupdateController.js
index d5eab07..e33a30f 100644
--- a/static/js/fwupdateController.js
+++ b/static/js/fwupdateController.js
@@ -1,86 +1,87 @@
 angular.module('bmcApp').controller('fwupdateController', [
   '$scope', '$http', '$uibModal', '$state',
   function($scope, $http, $uibModal, $state) {
-    $scope.upload = function(files) {
-      r = new FileReader();
-      r.onload = function(e) {
-        get_image_info = function(buffer) {
-          image_info = {'valid' : false}
-          var expected = '*SignedImage*\0\0\0'
+    $scope.files = [];
+    $scope.$watch('files', function(newValue, oldValue) {
+      if (newValue.length > 0) {
+        console.log('Loading firware file ' + $scope.files[0]);
+        r = new FileReader();
+        r.onload = function(e) {
+          get_image_info = function(buffer) {
+            image_info = {'valid' : false};
+            var expected = '*SignedImage*\0\0\0';
 
-          var dv1 = new Int8Array(e.target.result, 0, 16);
+            var dv1 = new Int8Array(e.target.result, 0, 16);
 
-          for (var i = 0; i != expected.length; i++) {
-            if (dv1[i] != expected.charCodeAt(i)) {
+            for (var i = 0; i != expected.length; i++) {
+              if (dv1[i] != expected.charCodeAt(i)) {
+                return image_info;
+              }
+            }
+            image_info['valid'] = true;
+            var generation = new Int8Array(e.target.result, 16, 17)[0];
+            image_info['generation'] = generation;
+            if ((generation < 4) ||
+                (generation > 5)) {  // not VLN generation header
+
               return image_info;
+            } else {
+              var version_minor = new Uint16Array(e.target.result, 20, 22)[0];
+              image_info['major_version'] =
+                  new Uint8Array(e.target.result, 28, 29)[0];
+              image_info['submajor_version'] =
+                  new Uint8Array(e.target.result, 29, 30)[0].toString(16);
+              var version_minor2 = new Uint16Array(e.target.result, 30, 32)[0];
+              image_info['sha1_version'] =
+                  ('0000' + version_minor2.toString(16)).substr(-4) +
+                  ('0000' + version_minor.toString(16)).substr(-4);
             }
-          }
-          image_info['valid'] = true;
-          var generation = new Int8Array(e.target.result, 16, 17)[0];
-          image_info['generation'] = generation;
-          if ((generation < 4) ||
-              (generation > 5)) {  // not VLN generation header
-
             return image_info;
-          } else {
-            var version_minor = new Uint16Array(e.target.result, 20, 22)[0];
-            image_info['major_version'] =
-                new Uint8Array(e.target.result, 28, 29)[0];
-            image_info['submajor_version'] =
-                new Uint8Array(e.target.result, 29, 30)[0].toString(16);
-            var version_minor2 = new Uint16Array(e.target.result, 30, 32)[0];
-            image_info['sha1_version'] =
-                ('0000' + version_minor2.toString(16)).substr(-4) +
-                ('0000' + version_minor.toString(16)).substr(-4);
+          };
+          var image_info = get_image_info(e.target.result);
+          $scope.image_info = image_info;
+
+          var objectSelectionModal = $uibModal.open({
+            templateUrl : 'static/partial-fwupdateconfirm.html',
+            controller : function($scope) {
+              $scope.image_info = image_info;
+              $scope.file_to_load = file_to_load;
+              // The function that is called for modal closing (positive button)
+
+              $scope.okModal = function() {
+                // Closing the model with result
+                objectSelectionModal.close($scope.selection);
+                $http({
+                  method : 'POST',
+                  url : '/intel/firmwareupload',
+                  data : e.target.result,
+                  transformRequest : [],
+                  headers : {'Content-Type' : 'application/octet-stream'}
+                })
+                    .then(
+                        function successCallback(response) {
+                          console.log('Success uploaded. Response: ' +
+                                      response.data)
+                        },
+                        function errorCallback(response) {
+                          console.log('Error status: ' + response.status)
+                        });
+              };
+
+              // The function that is called for modal dismissal(negative
+              // button)
+
+              $scope.dismissModal = function() {
+                objectSelectionModal.dismiss();
+              };
             }
-          return image_info;
+          });
         };
-        var image_info = get_image_info(e.target.result);
-        $scope.image_info = image_info;
+        var file_to_load = $scope.files[0];
+        $scope.file_to_load = $scope.files[0];
+        r.readAsArrayBuffer($scope.files[0]);
+      }
+    });
 
-        var objectSelectionModal = $uibModal.open({
-          templateUrl : 'static/partial-fwupdateconfirm.html',
-          controller : function($scope) {
-            $scope.image_info = image_info;
-            $scope.file_to_load = file_to_load;
-            // The function that is called for modal closing (positive button)
-
-            $scope.okModal = function() {
-              // Closing the model with result
-              objectSelectionModal.close($scope.selection);
-              $http({
-                method : 'POST',
-                url : '/intel/firmwareupload',
-                data : e.target.result,
-                transformRequest : [],
-                headers : {'Content-Type' : 'application/octet-stream'}
-              })
-                  .then(
-                      function successCallback(response) {
-                        console.log('Success uploaded. Response: ' +
-                                    response.data)
-                      },
-                      function errorCallback(response) {
-                        console.log('Error status: ' + response.status)
-                      });
-            };
-
-            // The function that is called for modal dismissal(negative button)
-
-            $scope.dismissModal = function() {
-              objectSelectionModal.dismiss();
-            };
-
-          }
-
-        });
-      };
-      var file_to_load = files[0];
-      $scope.file_to_load = file_to_load;
-      r.readAsArrayBuffer(files[0]);
-
-    };
-
-    $scope.filename = '';
   }
 ]);
\ No newline at end of file
diff --git a/static/js/fwupdateconfirmController.js b/static/js/fwupdateconfirmController.js
deleted file mode 100644
index 845e73d..0000000
--- a/static/js/fwupdateconfirmController.js
+++ /dev/null
@@ -1,5 +0,0 @@
-angular.module('bmcApp').controller('fwupdateconfirmController', [
-  '$scope', '$stateParams',function($scope, $stateParams) {
-    $scope.filename = $stateParams.filename;
-  }
-]);
\ No newline at end of file
diff --git a/static/js/sensorController.js b/static/js/sensorController.js
index 3943192..272dfee 100644
--- a/static/js/sensorController.js
+++ b/static/js/sensorController.js
@@ -1,59 +1,37 @@
-angular.module('bmcApp')
-    .controller(
-        'sensorController',
-        [
-          '$scope', '$http', '$location', 'websocketService',
-          function($scope, $http, $location, websocketService) {
-            $scope.smartTablePageSize = 10;
-            $scope.next_id = 0;
-            websocketService.start('/dbus_monitor', function(evt) {
-              var obj = JSON.parse(evt.data);
+angular.module('bmcApp').controller('sensorController', [
+  '$scope', '$http', '$location', 'dbusWebsocketService',
+  function($scope, $http, $location, dbusWebsocketService) {
+    $scope.smartTablePageSize = 10;
+    $scope.next_id = 0;
+    dbusWebsocketService.start('/xyz/openbmc_project/sensors', function(evt) {
+      var obj = JSON.parse(evt.data);
 
-              $scope.$apply(function() {
-                for (var sensor_name in obj) {
-                  var found = false;
-                  for (var sensor_index in $scope.rowCollection) {
-                    var sensor_object = $scope.rowCollection[sensor_index];
-                    if (sensor_object.name === sensor_name) {
-                      sensor_object.value = obj[sensor_name];
-                      found = true;
-                      break;
-                    }
-                    }
-                  if (!found) {
-                    console.log(sensor_name + ' -> ' + obj[sensor_name]);
-                    $scope.next_id = $scope.next_id + 1;
+      $scope.$apply(function() {
+        for (var sensor_name in obj) {
+          var found = false;
+          for (var sensor_index in $scope.rowCollection) {
+            var sensor_object = $scope.rowCollection[sensor_index];
+            if (sensor_object.name === sensor_name) {
+              sensor_object.value = obj[sensor_name];
+              found = true;
+              break;
+            }
+          }
+          if (!found) {
+            console.log(sensor_name + ' -> ' + obj[sensor_name]);
+            $scope.next_id = $scope.next_id + 1;
 
-                    $scope.rowCollection.push({
-                      id : $scope.next_id,
-                      name : sensor_name,
-                      value : obj[sensor_name],
-                    });
-                  }
-                };
-              });
+            $scope.rowCollection.push({
+              id : $scope.next_id,
+              name : sensor_name,
+              value : obj[sensor_name],
             });
-
-            $scope.rowCollection = [];
-
           }
-        ])
-    .factory('websocketService', [
-      '$location',
-      function($location) {
-        return {
-          start: function(url, callback) {
-            var host = $location.host();
-            var port = 18080;
-            var protocol = 'wss://';
-            if ($location.protocol() === 'http') {
-              protocol = 'ws://';
-              }
-            var websocket = new WebSocket(protocol + host + ':' + port + url);
-            websocket.onopen = function() {};
-            websocket.onclose = function() {};
-            websocket.onmessage = function(evt) { callback(evt); };
-          }
-        }
-      }
-    ]);
\ No newline at end of file
+        };
+      });
+    });
+
+    $scope.rowCollection = [];
+
+  }
+]);
