diff --git a/src/js/app.js b/src/js/app.js
index f19efae..7ba15cd 100644
--- a/src/js/app.js
+++ b/src/js/app.js
@@ -37,6 +37,10 @@
         'redirectTo': '/login'
       });
  }])
+ .config(['$httpProvider', function($httpProvider){
+     //console.log($httpProvider.interceptors);
+     $httpProvider.interceptors.push('apiInterceptor');
+ }])
  .run(['$rootScope', '$location', 'dataService', 'userModel',
     function($rootScope, $location, dataService, userModel){
     $rootScope.dataService = dataService;
@@ -71,5 +75,10 @@
             dataService.showNavigation = false;
         }
     });
+
+    $rootScope.$on('timedout-user', function(){
+      sessionStorage.removeItem('LOGIN_ID');
+      $location.path('/login');
+    });
     }
  ]);
diff --git a/src/js/controllers.js b/src/js/controllers.js
index 1c2dd82..03318e4 100644
--- a/src/js/controllers.js
+++ b/src/js/controllers.js
@@ -10,15 +10,21 @@
     }; 
     $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;
-            }
+            userModel.login(username, password, function(status, unreachable){
+                if(status){
+                    $scope.$emit('user-logged-in',{});
+                    $window.location.hash = '#/system-overview';
+                }else{
+                    if(!unreachable){
+                       $scope.error = true;
+                   }
+               };
+            });
         }
     }
  }])
@@ -75,34 +81,25 @@
     };
     $scope.warmReboot = function(){
         //@TODO:show progress
-        dataService.loading = true;
+        dataService.setBootingState();
         APIUtils.hostPowerOff(function(response){
             if(response){
-                dataService.setPowerOffState();
                 APIUtils.hostPowerOn(function(response){
                     if(response){
                         dataService.setPowerOnState();
                     }else{
                         //@TODO:show error message
                     }
-                    //@TODO:hide progress, set proper server state
-                    dataService.loading = false;
                 });
             }else{
-                //@TODO:hide progress & show error message
-                dataService.loading = false;
             }
         });
     };
     $scope.testState = function(){
-        //@TODO:show progress
-        dataService.loading = true;
-
         $timeout(function(){
             dataService.setPowerOffState();
             $timeout(function(){
                 dataService.setPowerOnState();
-                dataService.loading = false;
             }, 2000);
         }, 1000);
     };
@@ -127,14 +124,12 @@
 
     $scope.orderlyShutdown = function(){
         //@TODO:show progress
-        dataService.loading = true;
         APIUtils.hostPowerOff(function(response){
             if(response){
                 dataService.setPowerOffState();
             }else{
                 //@TODO:hide progress & show error message
             }
-            dataService.loading = false;
         });
     };
     $scope.orderlyShutdownConfirm = function(){
diff --git a/src/js/directives.js b/src/js/directives.js
index 913d686..801f67d 100644
--- a/src/js/directives.js
+++ b/src/js/directives.js
@@ -10,35 +10,44 @@
         'scope': {
             'path': '='
         },
-        'controller': ['$scope','dataService', 'userModel', '$location', function($scope, dataService, userModel, $location){
-            $scope.server_status = 01;
+        'controller': ['$rootScope', '$scope','dataService', 'userModel', '$location', function($rootScope, $scope, dataService, userModel, $location){
             $scope.dataService = dataService;
 
             $scope.loadServerStatus = function(){
-                $scope.dataService.loading = true;
-                APIUtils.login(function(){
-                    APIUtils.getHostState(function(status){
-                        if(status == 'xyz.openbmc_project.State.Host.HostState.Off'){
-                            dataService.setPowerOffState();
-                        }else if(status == 'xyz.openbmc_project.State.Host.HostState.Running'){
-                            dataService.setPowerOnState();
-                        }else{
-                            dataService.setBootingState();
-                        }
-                        dataService.loading = false;
-                    });
+
+                APIUtils.getHostState(function(status){
+                    if(status == 'xyz.openbmc_project.State.Host.HostState.Off'){
+                        dataService.setPowerOffState();
+                    }else if(status == 'xyz.openbmc_project.State.Host.HostState.Running'){
+                        dataService.setPowerOnState();
+                    }else{
+                        dataService.setBootingState();
+                    }
                 });
             }
             $scope.loadServerStatus();
 
             $scope.logout = function(){
-                userModel.logout();
-                $location.path('/logout');
-            };
+                userModel.logout(function(status, error){
+                    if(status){
+                       $location.path('/logout');
+                    }else{
+                        console.log(error);
+                    }
+                });
+            }
 
             $scope.refresh = function(){
                 $scope.loadServerStatus();
             }
+
+            var loginListener = $rootScope.$on('user-logged-in', function(event, arg){
+                $scope.loadServerStatus();
+            });
+
+            $scope.$on('$destroy', function(){
+                loginListener();
+            });
         }]
     };
  }])
@@ -53,8 +62,7 @@
         },
         'controller': ['$scope', 'dataService', function($scope, dataService){
             $scope.$watch('showNavigation', function(){
-                var paddingTop = 0;
-                $scope.toggle = false;
+                var padingTop = 0;
                 $scope.firstLevel = 'overview';
                 $scope.secondLevel = 'system_overview';
                 if($scope.showNavigation){
@@ -63,7 +71,6 @@
                 dataService.bodyStyle = {'padding-top': paddingTop + 'px'};
                 $scope.navStyle = {'top': paddingTop + 'px'};
             });
-
         }]
     };
  })
@@ -92,7 +99,7 @@
             scope.$watch('confirm', function(){
                 if(scope.confirm){
                     $timeout(function(){
-                        angular.element(e[0].parentNode).css({'min-height': e[0].querySelector('.inline__confirm').offsetHeight + 'px'});
+                        angular.element(e[0].parentNode).css({'min-height': e[0].querySelector('.power__confirm').offsetHeight + 'px'});
                     }, 0);
                 }else{
                     angular.element(e[0].parentNode).css({'min-height': 0+ 'px'});
diff --git a/src/js/services.js b/src/js/services.js
index dbf8dc4..23bfffb 100644
--- a/src/js/services.js
+++ b/src/js/services.js
@@ -10,52 +10,50 @@
 **/
 angular
  .module('app.services', [])
- .service('dataService', ['APIUtils', function(APIUtils){
-    this.app_version = "openBMC V.0.0.1";
-    this.server_health = 'Error';
-    this.server_state = 'Unreachable';
-    this.server_status = -2;
-    this.chassis_state = 'On';
-    this.server_id = "Server 9.3.164.147";
-    this.last_updated = new Date();
-    
-    this.loading = false;
-    this.loading_message = "";
-    this.showNavigation = false;
-    this.bodyStyle = {};
-    this.path = '';
+ .service('apiInterceptor', ['$q', '$rootScope', 'dataService', function($q, $rootScope, dataService){
+    return {
+        'request': function(config){
+            dataService.server_unreachable = false;
+            dataService.loading = true;
+            return config;
+        },
+        'response': function(response){
+            dataService.loading = false;
+            dataService.last_updated = new Date();
 
-    this.setPowerOnState = function(){
-        this.server_state = APIUtils.HOST_STATE_TEXT.on;
-        this.server_status = APIUtils.HOST_STATE.on;
-    },
+            if(response == null){
+                dataService.server_unreachable = true;
+            }
 
-    this.setPowerOffState = function(){
-        this.server_state = APIUtils.HOST_STATE_TEXT.off;
-        this.server_status = APIUtils.HOST_STATE.off;
-    },
+            if(response && response.status == 'error' &&
+               dataService.path != '/login'){
+                $rootScope.$emit('timedout-user', {});
+            }
 
-    this.setBootingState = function(){
-        this.server_state = APIUtils.HOST_STATE_TEXT.booting;
-        this.server_status = APIUtils.HOST_STATE.booting;
-    },
-
-    this.setUnreachableState = function(){
-        this.server_state = APIUtils.HOST_STATE_TEXT.unreachable;
-        this.server_status = APIUtils.HOST_STATE.unreachable;
-    }
+            return response;
+        },
+        'responseError': function(rejection){
+            dataService.server_unreachable = true;
+            dataService.loading = false;
+            return $q.reject(rejection);
+        }
+    };
  }])
- .factory('APIUtils', ['$http', function($http){
-    var SERVICE = {
+ .service('Constants', function(){
+    return {
         LOGIN_CREDENTIALS: {
-            username: "root",
-            password: "0penBmc",
+            username: "test",
+            password: "testpass",
         },
         API_CREDENTIALS: {
-            user: 'root',
-            password: '0penBmc',
             host: 'https://9.3.164.147'
         },
+        API_RESPONSE: {
+            ERROR_STATUS: 'error',
+            ERROR_MESSAGE: '401 Unauthorized',
+            SUCCESS_STATUS: 'ok',
+            SUCCESS_MESSAGE: '200 OK'
+        },
         CHASSIS_POWER_STATE: {
             on: 'On',
             off: 'Off'
@@ -71,7 +69,53 @@
             off: -1,
             booting: 0,
             unreachable: -2
-        },
+        }
+    };
+ })
+ .service('dataService', ['Constants', function(Constants){
+    this.app_version = "openBMC V.0.0.1";
+    this.server_health = 'Error';
+    this.server_state = 'Unreachable';
+    this.server_status = -2;
+    this.chassis_state = 'On';
+    this.server_id = "Server 9.3.164.147";
+    this.last_updated = new Date();
+
+    this.loading = false;
+    this.server_unreachable = false;
+    this.loading_message = "";
+    this.showNavigation = false;
+    this.bodyStyle = {};
+    this.path = '';
+
+    this.setPowerOnState = function(){
+        this.server_state = Constants.HOST_STATE_TEXT.on;
+        this.server_status = Constants.HOST_STATE.on;
+    },
+
+    this.setPowerOffState = function(){
+        this.server_state = Constants.HOST_STATE_TEXT.off;
+        this.server_status = Constants.HOST_STATE.off;
+    },
+
+    this.setBootingState = function(){
+        this.server_state = Constants.HOST_STATE_TEXT.booting;
+        this.server_status = Constants.HOST_STATE.booting;
+    },
+
+    this.setUnreachableState = function(){
+        this.server_state = Constants.HOST_STATE_TEXT.unreachable;
+        this.server_status = Constants.HOST_STATE.unreachable;
+    }
+ }])
+ .factory('APIUtils', ['$http', 'Constants', function($http, Constants){
+    var SERVICE = {
+        LOGIN_CREDENTIALS: Constants.LOGIN_CREDENTIALS,
+        API_CREDENTIALS: Constants.API_CREDENTIALS,
+        API_RESPONSE: Constants.API_RESPONSE,
+        CHASSIS_POWER_STATE: Constants.CHASSIS_POWER_STATE,
+        HOST_STATE_TEXT: Constants.HOST_STATE,
+        HOST_STATE: Constants.HOST_STATE,
         getChassisState: function(callback){
           $http({
             method: 'GET',
@@ -106,7 +150,7 @@
             console.log(error);
           });
         },
-        login: function(callback){
+        login: function(username, password, callback){
           $http({
             method: 'POST',
             url: SERVICE.API_CREDENTIALS.host + "/login",
@@ -115,12 +159,36 @@
                 'Content-Type': 'application/json'
             },
             withCredentials: true,
-            data: JSON.stringify({"data": [SERVICE.API_CREDENTIALS.user, SERVICE.API_CREDENTIALS.password]})
+            data: JSON.stringify({"data": [username, password]})
           }).success(function(response){
             if(callback){
                 callback(response);
             }
           }).error(function(error){
+            if(callback){
+                callback(null, true);
+            }
+            console.log(error);
+          });
+        },
+        logout: function(callback){
+          $http({
+            method: 'POST',
+            url: SERVICE.API_CREDENTIALS.host + "/logout",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({"data": []})
+          }).success(function(response){
+            if(callback){
+                callback(response);
+            }
+          }).error(function(error){
+            if(callback){
+                callback(null, error);
+            }
             console.log(error);
           });
         },
@@ -279,25 +347,33 @@
  }])
  .factory('userModel',['APIUtils',function(APIUtils){
     return {
-        login : function(username, password){
-            if(username == APIUtils.LOGIN_CREDENTIALS.username &&
-               password == APIUtils.LOGIN_CREDENTIALS.password){
-                sessionStorage.setItem('LOGIN_ID', username);
-                return true;
-            }else{
-                return false;
-            }
+        login : function(username, password, callback){
+            APIUtils.login(username, password, function(response, error){
+                if(response && 
+                   response.status == APIUtils.API_RESPONSE.SUCCESS_STATUS){
+                    sessionStorage.setItem('LOGIN_ID', username);
+                    callback(true);
+                }else{
+                    callback(false, error);
+                }
+            });
         },
         isLoggedIn : function(){
             if(sessionStorage.getItem('LOGIN_ID') === null){
                 return false;
             }
-
             return true;
         },
-        logout : function(){
-            sessionStorage.removeItem('LOGIN_ID');
-            return true;
+        logout : function(callback){
+            APIUtils.logout(function(response, error){
+                if(response &&
+                   response.status == APIUtils.API_RESPONSE.SUCCESS_STATUS){
+                    sessionStorage.removeItem('LOGIN_ID');
+                    callback(true);
+                }else{
+                    callback(false, error);
+                }
+            });
         }
     };
  }]);
