incremental
diff --git a/static/js/bmcApp.js b/static/js/bmcApp.js
new file mode 100644
index 0000000..dfd4d4b
--- /dev/null
+++ b/static/js/bmcApp.js
@@ -0,0 +1,313 @@
+'use strict';
+angular.module('Authentication', []);
+var app = angular.module('bmcApp', [
+  'Authentication', 'ngCookies', 'ui.bootstrap', 'ui.router', 'restangular',
+  'ngSanitize', 'ngWebSocket'
+]);
+
+
+app.controller('MainCtrl', function($scope, Restangular) {
+
+});
+
+app.run(['$rootScope', '$cookieStore', '$state', 'Restangular', 'AuthenticationService',
+  function($rootScope, $cookieStore, $state, Restangular, AuthenticationService) {
+    if ($rootScope.globals == undefined){
+        $rootScope.globals = {};
+    }
+    
+    // keep user logged in after page refresh
+    AuthenticationService.RestoreCredientials();
+
+    $rootScope.$on(
+        '$stateChangeStart',
+        function(event, toState, toParams, fromState, fromParams, options) {
+          // redirect to login page if not logged in
+          if (toState.name !== 'login' && !$rootScope.globals.currentUser) {
+            // If logged out and transitioning to a logged in page:
+            event.preventDefault();
+            $state.go('login');
+          }
+        });
+
+    // RestangularProvider.setDefaultHttpFields({cache: true});
+    Restangular.setErrorInterceptor(function(response) {
+      if (response.status == 401) {
+        console.log("Login required... ");
+
+        var invalidate_reason = "Your user was logged out.";
+        var continue_promise_chain = false;
+
+        // if we're attempting to log in, we need to
+        // continue the promise chain to make sure the user is informed
+        if ($state.current.name === "login") {
+          invalidate_reason = "Your username and password was incorrect";
+          continue_promise_chain = true
+        } else {
+          $state.after_login_state = $state.current.name;
+          $state.go('login');
+        }
+        AuthenticationService.ClearCredentials(invalidate_reason);
+
+        return continue_promise_chain;  // stop the promise chain
+      } else if (response.status == 404) {
+        console.log("Resource not available...");
+      } else {
+        console.log(
+            "Response received with HTTP error code: " + response.status);
+      }
+
+    });
+
+  }
+]);
+
+app.config(function(RestangularProvider) {
+  // set the base url for api calls on our RESTful services
+  var newBaseUrl = "";
+
+  var deployedAt = window.location.href.substring(0, window.location.href);
+  newBaseUrl = deployedAt + "/restui";
+
+  RestangularProvider.setBaseUrl(newBaseUrl);
+});
+
+app.config(function($stateProvider, $urlRouterProvider) {
+
+  $urlRouterProvider.otherwise('/systeminfo');
+
+  $stateProvider
+      // nested list with just some random string data
+      .state('login', {
+        url: '/login',
+        templateUrl: 'login.html',
+        controller: 'LoginController',
+      })
+      // systeminfo view ========================================
+      .state(
+          'systeminfo',
+          {url: '/systeminfo', templateUrl: 'partial-systeminfo.html'})
+
+
+      // HOME STATES AND NESTED VIEWS ========================================
+      .state(
+          'eventlog', {url: '/eventlog', templateUrl: 'partial-eventlog.html'})
+
+
+      .state(
+          'kvm', {url: '/kvm', templateUrl: 'partial-kvm.html'})
+
+      // ABOUT PAGE AND MULTIPLE NAMED VIEWS =================================
+      .state('about', {url: '/about', templateUrl: 'partial-fruinfo.html'})
+
+      // nested list with custom controller
+      .state('about.list', {
+        url: '/list',
+        templateUrl: 'partial-home-list.html',
+        controller: function($scope) {
+          $scope.dogs = ['Bernese', 'Husky', 'Goldendoodle'];
+        }
+      })
+
+
+});
+
+app.controller('PaginationDemoCtrl', function($scope, $log) {
+  $scope.totalItems = 64;
+  $scope.currentPage = 4;
+
+  $scope.setPage = function(pageNo) { $scope.currentPage = pageNo; };
+
+  $scope.pageChanged = function() {
+    $log.log('Page changed to: ' + $scope.currentPage);
+  };
+
+  $scope.maxSize = 5;
+  $scope.bigTotalItems = 175;
+  $scope.bigCurrentPage = 1;
+});
+
+angular
+    .module('Authentication')
+
+    .controller('LoginController', [
+      '$scope', '$rootScope', '$location', '$state', 'AuthenticationService',
+      function($scope, $rootScope, $location, $state, AuthenticationService) {
+        $scope.logoutreason = AuthenticationService.logoutreason;
+
+        $scope.login = function() {
+          $scope.dataLoading = true;
+          AuthenticationService.Login(
+              $scope.username, $scope.password,
+              function(response) {
+                AuthenticationService.SetCredentials(
+                    $scope.username, response.token);
+                if (typeof $state.after_login_state === "undefined") {
+                  $state.after_login_state = "systeminfo";
+                }
+                $state.go($state.after_login_state);
+                delete $state.after_login_state;
+
+              },
+              function(response) {
+                if (response.status === 401) {
+                  // reset login status
+                  AuthenticationService.ClearCredentials(
+                      "Username or Password is incorrect");
+                }
+                $scope.logoutreason = AuthenticationService.logoutreason;
+                $scope.error = response.message;
+                $scope.dataLoading = false;
+              });
+        };
+      }
+    ]);
+
+angular
+    .module('Authentication')
+
+    .factory(
+        'AuthenticationService',
+        [
+          'Restangular', '$cookieStore', '$rootScope', '$timeout',
+          function(Restangular, $cookieStore, $rootScope, $timeout) {
+            var service = {};
+
+            service.Login = function(
+                username, password, success_callback, fail_callback) {
+
+              var user = {"username": username, "password": password};
+              Restangular.all("login").post(user).then(
+                  success_callback, fail_callback);
+            };
+
+            service.SetCredentials = function(username, token) {
+              $rootScope.globals["currentUser"] = {username: username, authdata: token};
+              Restangular.setDefaultHeaders(
+                  {'Authorization': 'Token ' + token});
+              $cookieStore.put('globals', $rootScope.globals);
+            };
+
+            service.ClearCredentials = function(reason) {
+              $rootScope.globals["currentUser"] = null;
+              if (reason !== null) {
+                service.logoutreason = reason;
+              }
+              $cookieStore.remove('globals');
+              Restangular.setDefaultHeaders({});
+            };
+
+            service.RestoreCredientials = function() {
+              var globals = $cookieStore.get('globals') || {};
+              if (globals.currentUser) {
+                service.SetCredentials(
+                    globals.currentUser.username, globals.currentUser.authdata);
+              }
+            };
+
+            service.logoutreason = "";
+            return service;
+          }
+        ])
+
+    .factory('Websocket_URI', 
+        function($rootScope, $http) {
+          var loc = window.location, websocket_uri;
+          if (loc.protocol === "https:") {
+            websocket_uri = "wss:";
+          } else {
+            websocket_uri = "ws:";
+          }
+          websocket_uri += "//" + loc.hostname + ":9000";
+          // Append the authentication token
+          websocket_uri += "?token="
+          websocket_uri += $rootScope.globals["currentUser"]["authdata"]
+          var methods = {
+            uri: websocket_uri
+          }
+          return methods;
+        })
+    .factory('Base64', function() {
+      /* jshint ignore:start */
+
+      var keyStr =
+          'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+      return {
+        encode: function(input) {
+          var output = "";
+          var chr1, chr2, chr3 = "";
+          var enc1, enc2, enc3, enc4 = "";
+          var i = 0;
+
+          do {
+            chr1 = input.charCodeAt(i++);
+            chr2 = input.charCodeAt(i++);
+            chr3 = input.charCodeAt(i++);
+
+            enc1 = chr1 >> 2;
+            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+            enc4 = chr3 & 63;
+
+            if (isNaN(chr2)) {
+              enc3 = enc4 = 64;
+            } else if (isNaN(chr3)) {
+              enc4 = 64;
+            }
+
+            output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
+                keyStr.charAt(enc3) + keyStr.charAt(enc4);
+            chr1 = chr2 = chr3 = "";
+            enc1 = enc2 = enc3 = enc4 = "";
+          } while (i < input.length);
+
+          return output;
+        },
+
+        decode: function(input) {
+          var output = "";
+          var chr1, chr2, chr3 = "";
+          var enc1, enc2, enc3, enc4 = "";
+          var i = 0;
+
+          // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+          var base64test = /[^A-Za-z0-9\+\/\=]/g;
+          if (base64test.exec(input)) {
+            window.alert(
+                "There were invalid base64 characters in the input text.\n" +
+                "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
+                "Expect errors in decoding.");
+          }
+          input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+          do {
+            enc1 = keyStr.indexOf(input.charAt(i++));
+            enc2 = keyStr.indexOf(input.charAt(i++));
+            enc3 = keyStr.indexOf(input.charAt(i++));
+            enc4 = keyStr.indexOf(input.charAt(i++));
+
+            chr1 = (enc1 << 2) | (enc2 >> 4);
+            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+            chr3 = ((enc3 & 3) << 6) | enc4;
+
+            output = output + String.fromCharCode(chr1);
+
+            if (enc3 != 64) {
+              output = output + String.fromCharCode(chr2);
+            }
+            if (enc4 != 64) {
+              output = output + String.fromCharCode(chr3);
+            }
+
+            chr1 = chr2 = chr3 = "";
+            enc1 = enc2 = enc3 = enc4 = "";
+
+          } while (i < input.length);
+
+          return output;
+        }
+      };
+
+      /* jshint ignore:end */
+    });