diff --git a/static/js/bmcApp.js b/static/js/bmcApp.js
index 64a480a..d4282ba 100644
--- a/static/js/bmcApp.js
+++ b/static/js/bmcApp.js
@@ -11,9 +11,9 @@
 ]);
 
 
-app.controller('MainCtrl', function($scope) {
+app.controller('MainCtrl', ['$scope', function($scope) {
 
-});
+}]);
 
 app.service('loginInterceptor', ["$injector",
   function($injector) {
@@ -37,7 +37,7 @@
           }
           AuthenticationService.ClearCredentials(invalidate_reason);
         }
-
+        return response;
     };
 }])
 
@@ -45,7 +45,7 @@
     $httpProvider.interceptors.push('loginInterceptor');
 }]);
 
-app.directive('windowSize', function ($window) {
+app.directive('windowSize', ['$window', function ($window) {
   return function (scope, element) {
     var w = angular.element($window);
     scope.getWindowDimensions = function () {
@@ -69,7 +69,7 @@
         scope.$apply();
     });
   }
-});
+}]);
 
 app.run(['$rootScope', '$cookieStore', '$state', '$resource', 'AuthenticationService',
   function($rootScope, $cookieStore, $state, $resource, AuthenticationService) {
@@ -103,7 +103,7 @@
       // nested list with just some random string data
       .state('login', {
         url: '/login',
-        templateUrl: 'static/login.html',
+        templateUrl: 'static/partial-login.html',
         controller: 'LoginController',
       })
       // systeminfo view ========================================
@@ -120,6 +120,9 @@
       .state(
           'kvm', {url: '/kvm', templateUrl: 'static/partial-kvm.html'})
 
+      .state(
+          'ipmi', {url: '/ipmi', templateUrl: 'static/partial-ipmi.html'})
+
       // ABOUT PAGE AND MULTIPLE NAMED VIEWS =================================
       .state('about', {url: '/about', templateUrl: 'static/partial-fruinfo.html'})
 
@@ -192,89 +195,4 @@
             service.logoutreason = "";
             return service;
           }
-        ])
-
-    .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 */
-    });
+        ]);
