incremental
diff --git a/static/js/fwupdateController.js b/static/js/fwupdateController.js
new file mode 100644
index 0000000..ceacd8a
--- /dev/null
+++ b/static/js/fwupdateController.js
@@ -0,0 +1,83 @@
+angular.module('bmcApp').controller('fwupdateController', [
+  '$scope', '$http', '$uibModal',
+  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'
+
+          var dv1 = new Int8Array(e.target.result, 0, 16);
+
+          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);
+            }
+          return image_info;
+        };
+        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
+                  .post(
+                      '/intel/firmwareupload', data = e.target.result,
+                      {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