diff --git a/app/server-control/controllers/power-operations-controller.js b/app/server-control/controllers/power-operations-controller.js
index 06fb371..4ae732f 100644
--- a/app/server-control/controllers/power-operations-controller.js
+++ b/app/server-control/controllers/power-operations-controller.js
@@ -9,302 +9,329 @@
 window.angular && (function(angular) {
   'use strict';
 
-  angular
-    .module('app.serverControl')
-    .controller('powerOperationsController', [
-      '$scope',
-      'APIUtils',
-      'dataService',
-      'Constants',
-      '$timeout',
-      '$interval',
-      '$interpolate',
-      '$q',
-      function($scope, APIUtils, dataService, Constants, $timeout,
-        $interval, $interpolate, $q) {
-        $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;
-        $scope.loading = false;
+  angular.module('app.serverControl').controller('powerOperationsController', [
+    '$scope', 'APIUtils', 'dataService', 'Constants', '$timeout', '$interval',
+    '$interpolate', '$q',
+    function(
+        $scope, APIUtils, dataService, Constants, $timeout, $interval,
+        $interpolate, $q) {
+      $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;
+      $scope.loading = false;
 
-        var pollChassisStatusTimer = undefined;
-        var pollHostStatusTimer = undefined;
-        var pollStartTime = null;
+      var pollChassisStatusTimer = undefined;
+      var pollHostStatusTimer = undefined;
+      var pollStartTime = null;
 
-        //@TODO: call api and get proper state
-        $scope.toggleState = function() {
-          dataService.server_state = (dataService.server_state == 'Running') ? 'Off' : 'Running';
-        };
+      //@TODO: call api and get proper state
+      $scope.toggleState = function() {
+        dataService.server_state =
+            (dataService.server_state == 'Running') ? 'Off' : 'Running';
+      };
 
-        $scope.powerOn = function() {
-          $scope.loading = true;
-          dataService.setUnreachableState();
-          APIUtils.hostPowerOn().then(function(response) {
-            return response;
-          }).then(function(lastStatus) {
-            pollStartTime = new Date();
-            return pollHostStatusTillOn();
-          }).then(function(hostState) {
-            $scope.loading = false;
-          }).catch(function(error) {
-            dataService.activateErrorModal({
-              title: Constants.MESSAGES.POWER_OP.POWER_ON_FAILED,
-              description: error.statusText ?
-                $interpolate(Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)({
-                  status: error.status,
-                  description: error.statusText
-                }) : error
+      $scope.powerOn = function() {
+        $scope.loading = true;
+        dataService.setUnreachableState();
+        APIUtils.hostPowerOn()
+            .then(function(response) {
+              return response;
+            })
+            .then(function(lastStatus) {
+              pollStartTime = new Date();
+              return pollHostStatusTillOn();
+            })
+            .then(function(hostState) {
+              $scope.loading = false;
+            })
+            .catch(function(error) {
+              dataService.activateErrorModal({
+                title: Constants.MESSAGES.POWER_OP.POWER_ON_FAILED,
+                description: error.statusText ?
+                    $interpolate(
+                        Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
+                        {status: error.status, description: error.statusText}) :
+                    error
+              });
+              $scope.loading = false;
             });
-            $scope.loading = false;
-          });
-        };
-        $scope.powerOnConfirm = function() {
-          if ($scope.confirm) {
-            return;
-          }
-          $scope.confirm = true;
-          $scope.power_confirm = true;
-        };
-
-        function setHostState(state) {
-          if (state == Constants.HOST_STATE_TEXT.off_code) {
-            dataService.setPowerOffState();
-          }
-          else if (state == Constants.HOST_STATE_TEXT.on_code) {
-            dataService.setPowerOnState();
-          }
-          else {
-            dataService.setErrorState();
-          }
+      };
+      $scope.powerOnConfirm = function() {
+        if ($scope.confirm) {
+          return;
         }
+        $scope.confirm = true;
+        $scope.power_confirm = true;
+      };
 
-        function pollChassisStatusTillOff() {
-          var deferred = $q.defer();
-          pollChassisStatusTimer = $interval(function() {
-            var now = new Date();
-            if ((now.getTime() - pollStartTime.getTime()) >= Constants.TIMEOUT.CHASSIS_OFF) {
-              $interval.cancel(pollChassisStatusTimer);
-              pollChassisStatusTimer = undefined;
-              deferred.reject(new Error(Constants.MESSAGES.POLL.CHASSIS_OFF_TIMEOUT));
-            }
-            APIUtils.getChassisState().then(function(state) {
-              if (state === Constants.CHASSIS_POWER_STATE.off_code) {
+      function setHostState(state) {
+        if (state == Constants.HOST_STATE_TEXT.off_code) {
+          dataService.setPowerOffState();
+        } else if (state == Constants.HOST_STATE_TEXT.on_code) {
+          dataService.setPowerOnState();
+        } else {
+          dataService.setErrorState();
+        }
+      }
+
+      function pollChassisStatusTillOff() {
+        var deferred = $q.defer();
+        pollChassisStatusTimer = $interval(function() {
+          var now = new Date();
+          if ((now.getTime() - pollStartTime.getTime()) >=
+              Constants.TIMEOUT.CHASSIS_OFF) {
+            $interval.cancel(pollChassisStatusTimer);
+            pollChassisStatusTimer = undefined;
+            deferred.reject(
+                new Error(Constants.MESSAGES.POLL.CHASSIS_OFF_TIMEOUT));
+          }
+          APIUtils.getChassisState()
+              .then(function(state) {
+                if (state === Constants.CHASSIS_POWER_STATE.off_code) {
+                  $interval.cancel(pollChassisStatusTimer);
+                  pollChassisStatusTimer = undefined;
+                  deferred.resolve(state);
+                }
+              })
+              .catch(function(error) {
                 $interval.cancel(pollChassisStatusTimer);
                 pollChassisStatusTimer = undefined;
-                deferred.resolve(state);
-              }
-            }).catch(function(error) {
-              $interval.cancel(pollChassisStatusTimer);
-              pollChassisStatusTimer = undefined;
-              deferred.reject(error);
-            });
-          }, Constants.POLL_INTERVALS.POWER_OP);
+                deferred.reject(error);
+              });
+        }, Constants.POLL_INTERVALS.POWER_OP);
 
-          return deferred.promise;
-        }
-
-        function pollHostStatusTillOn() {
-          var deferred = $q.defer();
-          pollHostStatusTimer = $interval(function() {
-            var now = new Date();
-            if ((now.getTime() - pollStartTime.getTime()) >= Constants.TIMEOUT.HOST_ON) {
-              $interval.cancel(pollHostStatusTimer);
-              pollHostStatusTimer = undefined;
-              deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT));
-            }
-            APIUtils.getHostState().then(function(state) {
-              setHostState(state);
-              if (state === Constants.HOST_STATE_TEXT.on_code) {
-                $interval.cancel(pollHostStatusTimer);
-                pollHostStatusTimer = undefined;
-                deferred.resolve(state);
-              }
-              else if (state === Constants.HOST_STATE_TEXT.error_code) {
-                $interval.cancel(pollHostStatusTimer);
-                pollHostStatusTimer = undefined;
-                deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
-              }
-            }).catch(function(error) {
-              $interval.cancel(pollHostStatusTimer);
-              pollHostStatusTimer = undefined;
-              deferred.reject(error);
-            });
-          }, Constants.POLL_INTERVALS.POWER_OP);
-
-          return deferred.promise;
-        }
-
-        function pollHostStatusTillOff() {
-          var deferred = $q.defer();
-          pollHostStatusTimer = $interval(function() {
-            var now = new Date();
-            if ((now.getTime() - pollStartTime.getTime()) >= Constants.TIMEOUT.HOST_OFF) {
-              $interval.cancel(pollHostStatusTimer);
-              pollHostStatusTimer = undefined;
-              deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT));
-            }
-            APIUtils.getHostState().then(function(state) {
-              setHostState(state);
-              if (state === Constants.HOST_STATE_TEXT.off_code) {
-                $interval.cancel(pollHostStatusTimer);
-                pollHostStatusTimer = undefined;
-                deferred.resolve(state);
-              }
-            }).catch(function(error) {
-              $interval.cancel(pollHostStatusTimer);
-              pollHostStatusTimer = undefined;
-              deferred.reject(error);
-            });
-          }, Constants.POLL_INTERVALS.POWER_OP);
-
-          return deferred.promise;
-        }
-        $scope.warmReboot = function() {
-          $scope.loading = true;
-          dataService.setUnreachableState();
-          APIUtils.hostReboot().then(function(response) {
-            return response;
-          }).then(function(lastStatus) {
-            pollStartTime = new Date();
-            return pollHostStatusTillOff();
-          }).then(function(hostState) {
-            pollStartTime = new Date();
-            return pollHostStatusTillOn();
-          }).then(function(hostState) {
-            $scope.loading = false;
-          }).catch(function(error) {
-            dataService.activateErrorModal({
-              title: Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED,
-              description: error.statusText ?
-                $interpolate(Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)({
-                  status: error.status,
-                  description: error.statusText
-                }) : error
-            });
-            $scope.loading = false;
-          });
-        };
-        $scope.testState = function() {
-          $timeout(function() {
-            dataService.setPowerOffState();
-            $timeout(function() {
-              dataService.setPowerOnState();
-            }, 2000);
-          }, 1000);
-        };
-        $scope.warmRebootConfirm = function() {
-          if ($scope.confirm) {
-            return;
-          }
-          $scope.confirm = true;
-          $scope.warmboot_confirm = true;
-        };
-
-        $scope.coldReboot = function() {
-          $scope.loading = true;
-          dataService.setUnreachableState();
-          APIUtils.chassisPowerOff().then(function(state) {
-            return state;
-          }).then(function(lastState) {
-            pollStartTime = new Date();
-            return pollChassisStatusTillOff();
-          }).then(function(chassisState) {
-            return APIUtils.hostPowerOn().then(function(hostState) {
-              return hostState;
-            });
-          }).then(function(hostState) {
-            pollStartTime = new Date();
-            return pollHostStatusTillOn();
-          }).then(function(state) {
-            $scope.loading = false;
-          }).catch(function(error) {
-            dataService.activateErrorModal({
-              title: Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED,
-              description: error.statusText ?
-                $interpolate(Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)({
-                  status: error.status,
-                  description: error.statusText
-                }) : error
-            });
-            $scope.loading = false;
-          });
-        };
-        $scope.coldRebootConfirm = function() {
-          if ($scope.confirm) {
-            return;
-          }
-          $scope.confirm = true;
-          $scope.coldboot_confirm = true;
-        };
-
-        $scope.orderlyShutdown = function() {
-          $scope.loading = true;
-          dataService.setUnreachableState();
-          APIUtils.hostPowerOff().then(function(response) {
-            return response;
-          }).then(function(lastStatus) {
-            pollStartTime = new Date();
-            return pollHostStatusTillOff();
-          }).then(function(hostState) {
-            pollStartTime = new Date();
-            return pollChassisStatusTillOff();
-          }).then(function(chassisState) {
-            $scope.loading = false;
-          }).catch(function(error) {
-            dataService.activateErrorModal({
-              title: Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED,
-              description: error.statusText ?
-                $interpolate(Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)({
-                  status: error.status,
-                  description: error.statusText
-                }) : error
-            });
-            $scope.loading = false;
-          });
-        };
-        $scope.orderlyShutdownConfirm = function() {
-          if ($scope.confirm) {
-            return;
-          }
-          $scope.confirm = true;
-          $scope.orderly_confirm = true;
-        };
-
-        $scope.immediateShutdown = function() {
-          $scope.loading = true;
-          dataService.setUnreachableState();
-          APIUtils.chassisPowerOff().then(function(response) {
-            return response;
-          }).then(function(lastStatus) {
-            pollStartTime = new Date();
-            return pollChassisStatusTillOff();
-          }).then(function(chassisState) {
-            dataService.setPowerOffState();
-            $scope.loading = false;
-          }).catch(function(error) {
-            dataService.activateErrorModal({
-              title: Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED,
-              description: error.statusText ?
-                $interpolate(Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)({
-                  status: error.status,
-                  description: error.statusText
-                }) : error
-            });
-            $scope.loading = false;
-          });
-        };
-        $scope.immediateShutdownConfirm = function() {
-          if ($scope.confirm) {
-            return;
-          }
-          $scope.confirm = true;
-          $scope.immediately_confirm = true;
-        };
+        return deferred.promise;
       }
-    ]);
+
+      function pollHostStatusTillOn() {
+        var deferred = $q.defer();
+        pollHostStatusTimer = $interval(function() {
+          var now = new Date();
+          if ((now.getTime() - pollStartTime.getTime()) >=
+              Constants.TIMEOUT.HOST_ON) {
+            $interval.cancel(pollHostStatusTimer);
+            pollHostStatusTimer = undefined;
+            deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT));
+          }
+          APIUtils.getHostState()
+              .then(function(state) {
+                setHostState(state);
+                if (state === Constants.HOST_STATE_TEXT.on_code) {
+                  $interval.cancel(pollHostStatusTimer);
+                  pollHostStatusTimer = undefined;
+                  deferred.resolve(state);
+                } else if (state === Constants.HOST_STATE_TEXT.error_code) {
+                  $interval.cancel(pollHostStatusTimer);
+                  pollHostStatusTimer = undefined;
+                  deferred.reject(
+                      new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
+                }
+              })
+              .catch(function(error) {
+                $interval.cancel(pollHostStatusTimer);
+                pollHostStatusTimer = undefined;
+                deferred.reject(error);
+              });
+        }, Constants.POLL_INTERVALS.POWER_OP);
+
+        return deferred.promise;
+      }
+
+      function pollHostStatusTillOff() {
+        var deferred = $q.defer();
+        pollHostStatusTimer = $interval(function() {
+          var now = new Date();
+          if ((now.getTime() - pollStartTime.getTime()) >=
+              Constants.TIMEOUT.HOST_OFF) {
+            $interval.cancel(pollHostStatusTimer);
+            pollHostStatusTimer = undefined;
+            deferred.reject(
+                new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT));
+          }
+          APIUtils.getHostState()
+              .then(function(state) {
+                setHostState(state);
+                if (state === Constants.HOST_STATE_TEXT.off_code) {
+                  $interval.cancel(pollHostStatusTimer);
+                  pollHostStatusTimer = undefined;
+                  deferred.resolve(state);
+                }
+              })
+              .catch(function(error) {
+                $interval.cancel(pollHostStatusTimer);
+                pollHostStatusTimer = undefined;
+                deferred.reject(error);
+              });
+        }, Constants.POLL_INTERVALS.POWER_OP);
+
+        return deferred.promise;
+      }
+      $scope.warmReboot = function() {
+        $scope.loading = true;
+        dataService.setUnreachableState();
+        APIUtils.hostReboot()
+            .then(function(response) {
+              return response;
+            })
+            .then(function(lastStatus) {
+              pollStartTime = new Date();
+              return pollHostStatusTillOff();
+            })
+            .then(function(hostState) {
+              pollStartTime = new Date();
+              return pollHostStatusTillOn();
+            })
+            .then(function(hostState) {
+              $scope.loading = false;
+            })
+            .catch(function(error) {
+              dataService.activateErrorModal({
+                title: Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED,
+                description: error.statusText ?
+                    $interpolate(
+                        Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
+                        {status: error.status, description: error.statusText}) :
+                    error
+              });
+              $scope.loading = false;
+            });
+      };
+      $scope.testState = function() {
+        $timeout(function() {
+          dataService.setPowerOffState();
+          $timeout(function() {
+            dataService.setPowerOnState();
+          }, 2000);
+        }, 1000);
+      };
+      $scope.warmRebootConfirm = function() {
+        if ($scope.confirm) {
+          return;
+        }
+        $scope.confirm = true;
+        $scope.warmboot_confirm = true;
+      };
+
+      $scope.coldReboot = function() {
+        $scope.loading = true;
+        dataService.setUnreachableState();
+        APIUtils.chassisPowerOff()
+            .then(function(state) {
+              return state;
+            })
+            .then(function(lastState) {
+              pollStartTime = new Date();
+              return pollChassisStatusTillOff();
+            })
+            .then(function(chassisState) {
+              return APIUtils.hostPowerOn().then(function(hostState) {
+                return hostState;
+              });
+            })
+            .then(function(hostState) {
+              pollStartTime = new Date();
+              return pollHostStatusTillOn();
+            })
+            .then(function(state) {
+              $scope.loading = false;
+            })
+            .catch(function(error) {
+              dataService.activateErrorModal({
+                title: Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED,
+                description: error.statusText ?
+                    $interpolate(
+                        Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
+                        {status: error.status, description: error.statusText}) :
+                    error
+              });
+              $scope.loading = false;
+            });
+      };
+      $scope.coldRebootConfirm = function() {
+        if ($scope.confirm) {
+          return;
+        }
+        $scope.confirm = true;
+        $scope.coldboot_confirm = true;
+      };
+
+      $scope.orderlyShutdown = function() {
+        $scope.loading = true;
+        dataService.setUnreachableState();
+        APIUtils.hostPowerOff()
+            .then(function(response) {
+              return response;
+            })
+            .then(function(lastStatus) {
+              pollStartTime = new Date();
+              return pollHostStatusTillOff();
+            })
+            .then(function(hostState) {
+              pollStartTime = new Date();
+              return pollChassisStatusTillOff();
+            })
+            .then(function(chassisState) {
+              $scope.loading = false;
+            })
+            .catch(function(error) {
+              dataService.activateErrorModal({
+                title: Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED,
+                description: error.statusText ?
+                    $interpolate(
+                        Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
+                        {status: error.status, description: error.statusText}) :
+                    error
+              });
+              $scope.loading = false;
+            });
+      };
+      $scope.orderlyShutdownConfirm = function() {
+        if ($scope.confirm) {
+          return;
+        }
+        $scope.confirm = true;
+        $scope.orderly_confirm = true;
+      };
+
+      $scope.immediateShutdown = function() {
+        $scope.loading = true;
+        dataService.setUnreachableState();
+        APIUtils.chassisPowerOff()
+            .then(function(response) {
+              return response;
+            })
+            .then(function(lastStatus) {
+              pollStartTime = new Date();
+              return pollChassisStatusTillOff();
+            })
+            .then(function(chassisState) {
+              dataService.setPowerOffState();
+              $scope.loading = false;
+            })
+            .catch(function(error) {
+              dataService.activateErrorModal({
+                title: Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED,
+                description: error.statusText ?
+                    $interpolate(
+                        Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
+                        {status: error.status, description: error.statusText}) :
+                    error
+              });
+              $scope.loading = false;
+            });
+      };
+      $scope.immediateShutdownConfirm = function() {
+        if ($scope.confirm) {
+          return;
+        }
+        $scope.confirm = true;
+        $scope.immediately_confirm = true;
+      };
+    }
+  ]);
 
 })(angular);
