diff --git a/src/js/controllers.js b/src/js/controllers.js
index e19f2e9..1b5df0f 100644
--- a/src/js/controllers.js
+++ b/src/js/controllers.js
@@ -1,164 +1,185 @@
- angular
- .module('app.controllers', [])
-   .controller('loginController', ['$scope', '$window', 'APIUtils', 'dataService', 'userModel', function($scope, $window, APIUtils, dataService, userModel){
-    $scope.dataService = dataService;
+angular
+    .module('app.controllers', [])
+    .controller('loginController', ['$scope', '$window', 'APIUtils', 'dataService', 'userModel', function ($scope, $window, APIUtils, dataService, userModel) {
+        $scope.dataService = dataService;
 
-    $scope.tryLogin = function(username, password, event){
-        if(event.keyCode === 13){
-            $scope.login(username, password);
-        }
-    };
-    $scope.login = function(username, password){
-        $scope.error = false;
-        if(!username || username == "" ||
-           !password || password == ""){
-            return false;
-        }else{
-            if(userModel.login(username, password)){
-                $window.location.hash = '#/system-overview';
-            }else{
-                $scope.error = true;
+        $scope.tryLogin = function (username, password, event) {
+            if (event.keyCode === 13) {
+                $scope.login(username, password);
+            }
+        };
+        $scope.login = function (username, password) {
+            $scope.error = false;
+            if (!username || username == "" || !password || password == "") {
+                return false;
+            } else {
+                if (userModel.login(username, password)) {
+                    $window.location.hash = '#/system-overview';
+                } else {
+                    $scope.error = true;
+                }
             }
         }
-    }
- }])
- .controller('dashboardController', ['$scope', 'dataService', function($scope, dataService){
-    $scope.dataService = dataService;
- }])
- .controller('systemOverviewController', ['$scope', 'dataService', function($scope, dataService){
-    $scope.dataService = dataService;
- }])
- .controller('unitIDController', ['$scope', 'dataService', function($scope, dataService){
-    $scope.dataService = dataService;
- }])
- .controller('bmcRebootController', ['$scope', 'dataService', function($scope, dataService){
-    $scope.dataService = dataService;
- }])
-  .controller('powerOperationsController', ['$scope', 'APIUtils', 'dataService', function($scope, APIUtils, dataService){
-    $scope.dataService = dataService;
-    $scope.confirm = false;
-    $scope.power_confirm = false;
-    $scope.warmboot_confirm = false;
-    $scope.coldboot_confirm = false;
-    $scope.orderly_confirm = false;
-    $scope.immediately_confirm = false;
+    }])
+    .controller('dashboardController', ['$scope', 'dataService', function ($scope, dataService) {
+        $scope.dataService = dataService;
+    }])
+    .controller('systemOverviewController', ['$scope', 'dataService', function ($scope, dataService) {
+        $scope.dataService = dataService;
+    }])
+    .controller('unitIDController', ['$scope', 'dataService', function ($scope, dataService) {
+        $scope.dataService = dataService;
+    }])
+    .controller('bmcRebootController', ['$scope', 'dataService', function ($scope, dataService) {
+        $scope.dataService = dataService;
+        $scope.bmcReboot_confirm = false;
 
-    //@TODO: call api and get proper state
-    $scope.toggleState = function(){
-        dataService.server_state = (dataService.server_state == 'On') ? 'Off': 'On';
-    };
-
-    $scope.togglePower = function(){
-        var method = (dataService.server_state == 'On') ? 'chassisPowerOff' : 'chassisPowerOn';
-         //@TODO: show progress or set class orange
-        APIUtils[method](function(response){
-            //update state based on response
-            //error case?
-            if(response == null){
-                console.log("Failed request.");
-            }else{
-                dataService.server_state = response;
+        // BMC reboot
+        $scope.bmcReboot = function () {
+            //@TODO:show progress
+            APIUtils.bmcReboot(function (response) {
+                if (response) {
+                    //@TODO: set proper server state
+                } else {
+                    //@TODO:show error message
+                }
+                //@TODO:hide progress
+            });
+        };
+        $scope.bmcRebootConfirm = function () {
+            if ($scope.confirm) {
+                return;
             }
-        });
-    }
-    $scope.powerOnConfirm = function(){
-        if($scope.confirm) {
-            return;
-        }
-        $scope.confirm = true;
-        $scope.power_confirm = true;
-    };
-    $scope.warmReboot = function(){
-        //@TODO:show progress
-        APIUtils.hostPowerOff(function(response){
-            if(response){
-                APIUtils.hostPowerOn(function(response){
-                    if(response){
+            $scope.confirm = true;
+            $scope.bmcReboot_confirm = true;
+        };
+    }])
+    .controller('powerOperationsController', ['$scope', 'APIUtils', 'dataService', function ($scope, APIUtils, dataService) {
+        $scope.dataService = dataService;
+        $scope.confirm = false;
+        $scope.power_confirm = false;
+        $scope.warmboot_confirm = false;
+        $scope.coldboot_confirm = false;
+        $scope.orderly_confirm = false;
+        $scope.immediately_confirm = false;
 
-                    }else{
-                        //@TODO:show error message
-                    }
-                    //@TODO:hide progress, set proper server state
-                });
-            }else{
-                //@TODO:hide progress & show error message
+        //@TODO: call api and get proper state
+        $scope.toggleState = function () {
+            dataService.server_state = (dataService.server_state == 'On') ? 'Off' : 'On';
+        };
+
+        $scope.togglePower = function () {
+            var method = (dataService.server_state == 'On') ? 'chassisPowerOff' : 'chassisPowerOn';
+            //@TODO: show progress or set class orange
+            APIUtils[method](function (response) {
+                //update state based on response
+                //error case?
+                if (response == null) {
+                    console.log("Failed request.");
+                } else {
+                    dataService.server_state = response;
+                }
+            });
+        }
+        $scope.powerOnConfirm = function () {
+            if ($scope.confirm) {
+                return;
             }
-        });
-    };
-    $scope.warmRebootConfirm = function(){
-        if($scope.confirm) {
-            return;
-        }
-        $scope.confirm = true;
-        $scope.warmboot_confirm = true;
-    };
+            $scope.confirm = true;
+            $scope.power_confirm = true;
+        };
+        $scope.warmReboot = function () {
+            //@TODO:show progress
+            APIUtils.hostPowerOff(function (response) {
+                if (response) {
+                    APIUtils.hostPowerOn(function (response) {
+                        if (response) {
 
-    $scope.coldReboot = function(){
-        //@TODO:show progress
-        APIUtils.chassisPowerOff(function(response){
-            if(response){
-                APIUtils.chassisPowerOn(function(response){
-                    if(response){
-
-                    }else{
-                        //@TODO:show error message
-                    }
-                    //@TODO:hide progress, set proper server state
-                });
-            }else{
-                //@TODO:hide progress & show error message
+                        } else {
+                            //@TODO:show error message
+                        }
+                        //@TODO:hide progress, set proper server state
+                    });
+                } else {
+                    //@TODO:hide progress & show error message
+                }
+            });
+        };
+        $scope.warmRebootConfirm = function () {
+            if ($scope.confirm) {
+                return;
             }
-        });
-    };
-    $scope.coldRebootConfirm = function(){
-        if($scope.confirm) {
-            return;
-        }
-        $scope.confirm = true;
-        $scope.coldboot_confirm = true;
-    };
+            $scope.confirm = true;
+            $scope.warmboot_confirm = true;
+        };
 
-    $scope.orderlyShutdown = function(){
-        //@TODO:show progress
-        APIUtils.hostPowerOff(function(response){
-            if(response){
-                APIUtils.chassisPowerOff(function(response){
-                    if(response){
+        $scope.coldReboot = function () {
+            //@TODO:show progress
+            APIUtils.chassisPowerOff(function (response) {
+                if (response) {
+                    APIUtils.chassisPowerOn(function (response) {
+                        if (response) {
 
-                    }else{
-                        //@TODO:show error message
-                    }
-                    //@TODO:hide progress, set proper server state
-                });
-            }else{
-                //@TODO:hide progress & show error message
+                        } else {
+                            //@TODO:show error message
+                        }
+                        //@TODO:hide progress, set proper server state
+                    });
+                } else {
+                    //@TODO:hide progress & show error message
+                }
+            });
+        };
+        $scope.coldRebootConfirm = function () {
+            if ($scope.confirm) {
+                return;
             }
-        });
-    };
-    $scope.orderlyShutdownConfirm = function(){
-        if($scope.confirm) {
-            return;
-        }
-        $scope.confirm = true;
-        $scope.orderly_confirm = true;
-    };
+            $scope.confirm = true;
+            $scope.coldboot_confirm = true;
+        };
 
-    $scope.immediateShutdown = function(){
-        //@TODO:show progress
-        APIUtils.chassisPowerOff(function(response){
-            if(response){
-                //@TODO: set proper server state
-            }else{
-                //@TODO:show error message
+        $scope.orderlyShutdown = function () {
+            //@TODO:show progress
+            APIUtils.hostPowerOff(function (response) {
+                if (response) {
+                    APIUtils.chassisPowerOff(function (response) {
+                        if (response) {
+
+                        } else {
+                            //@TODO:show error message
+                        }
+                        //@TODO:hide progress, set proper server state
+                    });
+                } else {
+                    //@TODO:hide progress & show error message
+                }
+            });
+        };
+        $scope.orderlyShutdownConfirm = function () {
+            if ($scope.confirm) {
+                return;
             }
-            //@TODO:hide progress
-        });
-    };
-    $scope.immediateShutdownConfirm = function(){
-        if($scope.confirm) {
-            return;
-        }
-        $scope.confirm = true;
-        $scope.immediately_confirm = true;
-    };
- }]);
+            $scope.confirm = true;
+            $scope.orderly_confirm = true;
+        };
+
+        $scope.immediateShutdown = function () {
+            //@TODO:show progress
+            APIUtils.chassisPowerOff(function (response) {
+                if (response) {
+                    //@TODO: set proper server state
+                } else {
+                    //@TODO:show error message
+                }
+                //@TODO:hide progress
+            });
+        };
+        $scope.immediateShutdownConfirm = function () {
+            if ($scope.confirm) {
+                return;
+            }
+            $scope.confirm = true;
+            $scope.immediately_confirm = true;
+        };
+
+    }]);
