diff --git a/app/common/directives/app-header.js b/app/common/directives/app-header.js
index 93d8fa8..31f683c 100644
--- a/app/common/directives/app-header.js
+++ b/app/common/directives/app-header.js
@@ -1,94 +1,98 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('appHeader', ['APIUtils', function (APIUtils) {
-            return {
-                'restrict': 'E',
-                'template': require('./app-header.html'),
-                'scope': {
-                   'path': '='
-                },
-                'controller': ['$rootScope', '$scope','dataService', 'userModel', '$location', '$route',
-                function($rootScope, $scope, dataService, userModel, $location, $route){
-                    $scope.dataService = dataService;
+  angular
+    .module('app.common.directives')
+    .directive('appHeader', ['APIUtils', function(APIUtils) {
+      return {
+        'restrict': 'E',
+        'template': require('./app-header.html'),
+        'scope': {
+          'path': '='
+        },
+        'controller': ['$rootScope', '$scope', 'dataService', 'userModel', '$location', '$route',
+          function($rootScope, $scope, dataService, userModel, $location, $route) {
+            $scope.dataService = dataService;
 
-                    $scope.loadServerHealth = function(){
-                        APIUtils.getLogs().then(function(result){
-                            dataService.updateServerHealth(result.data);
-                        });
-                    }
-
-                    $scope.loadServerStatus = function(){
-                        if(!userModel.isLoggedIn()){
-                            return;
-                        }
-                        APIUtils.getHostState().then(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.setErrorState();
-                            }
-                        }, function(error){
-                            dataService.activateErrorModal();
-                        });
-                    }
-
-                    $scope.loadNetworkInfo = function(){
-                        if(!userModel.isLoggedIn()){
-                            return;
-                        }
-                        APIUtils.getNetworkInfo().then(function(data){
-                            dataService.setNetworkInfo(data);
-                        });
-                    }
-
-                    function loadData(){
-                       $scope.loadServerStatus();
-                       $scope.loadNetworkInfo();
-                       $scope.loadServerHealth();
-                    }
-
-                    loadData();
-
-                    $scope.logout = function(){
-                        userModel.logout(function(status, error){
-                            if(status){
-                               $location.path('/logout');
-                            }else{
-                                console.log(error);
-                            }
-                        });
-                    }
-
-                    $scope.refresh = function(){
-                        //reload current page controllers and header
-                        loadData();
-                        $route.reload();
-                        //Add flash class to header timestamp on click of refresh
-                        var myEl = angular.element( document.querySelector( '.header__refresh' ) );
-                        myEl.addClass('flash');
-                        setTimeout(function () {
-                            myEl.removeClass("flash");
-                        },2000);
-
-                    }
-
-                    var loginListener = $rootScope.$on('user-logged-in', function(event, arg){
-                        loadData();
-                    });
-
-                    $scope.$on('$destroy', function(){
-                        loginListener();
-                    });
-
-                    $scope.multiRecent = function(){
-                        $scope.multi_server_recent = !$scope.multi_server_recent;
-                    };
-                }]
+            $scope.loadServerHealth = function() {
+              APIUtils.getLogs().then(function(result) {
+                dataService.updateServerHealth(result.data);
+              });
             };
-        }]);
+
+            $scope.loadServerStatus = function() {
+              if (!userModel.isLoggedIn()) {
+                return;
+              }
+              APIUtils.getHostState().then(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.setErrorState();
+                }
+              }, function(error) {
+                dataService.activateErrorModal();
+              });
+            };
+
+            $scope.loadNetworkInfo = function() {
+              if (!userModel.isLoggedIn()) {
+                return;
+              }
+              APIUtils.getNetworkInfo().then(function(data) {
+                dataService.setNetworkInfo(data);
+              });
+            };
+
+            function loadData() {
+              $scope.loadServerStatus();
+              $scope.loadNetworkInfo();
+              $scope.loadServerHealth();
+            }
+
+            loadData();
+
+            $scope.logout = function() {
+              userModel.logout(function(status, error) {
+                if (status) {
+                  $location.path('/logout');
+                }
+                else {
+                  console.log(error);
+                }
+              });
+            };
+
+            $scope.refresh = function() {
+              //reload current page controllers and header
+              loadData();
+              $route.reload();
+              //Add flash class to header timestamp on click of refresh
+              var myEl = angular.element(document.querySelector('.header__refresh'));
+              myEl.addClass('flash');
+              setTimeout(function() {
+                myEl.removeClass('flash');
+              }, 2000);
+
+            };
+
+            var loginListener = $rootScope.$on('user-logged-in', function(event, arg) {
+              loadData();
+            });
+
+            $scope.$on('$destroy', function() {
+              loginListener();
+            });
+
+            $scope.multiRecent = function() {
+              $scope.multi_server_recent = !$scope.multi_server_recent;
+            };
+          }
+        ]
+      };
+    }]);
 })(window.angular);
diff --git a/app/common/directives/app-navigation.js b/app/common/directives/app-navigation.js
index 02d3f2d..80d09ec 100644
--- a/app/common/directives/app-navigation.js
+++ b/app/common/directives/app-navigation.js
@@ -1,68 +1,75 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('appNavigation', function () {
-            return {
-                'restrict': 'E',
-                'template': require('./app-navigation.html'),
-                'scope': {
-                    'path': '=',
-                    'showNavigation': '='
-                },
-                'controller': ['$scope', '$location', 'dataService', function($scope, $location, dataService){
-                    $scope.dataService = dataService;
-                    $scope.showSubMenu = false;
-                    $scope.change = function(firstLevel){
-                        if(firstLevel != $scope.firstLevel) {
-                            $scope.firstLevel = firstLevel;
-                            $scope.showSubMenu = true;
-                        }else{
-                           $scope.showSubMenu = !$scope.showSubMenu;
-                        }
-                    };
-                    $scope.closeSubnav = function(){
-                        $scope.showSubMenu = false;
-                    };
-                    $scope.$watch('path', function(){
-                        var urlRoot = $location.path().split("/")[1];
-                        if(urlRoot != ""){
-                            $scope.firstLevel = urlRoot;
-                        }else{
-                            $scope.firstLevel = 'overview';
-                        }
-                        $scope.showSubMenu = false;
-                    });
-                    $scope.$watch('showNavigation', function(){
-                        var paddingTop = 0;
-                        var urlRoot = $location.path().split("/")[1];
-                        if(urlRoot != ""){
-                            $scope.firstLevel = urlRoot;
-                        }else{
-                            $scope.firstLevel = 'overview';
-                        }
+  angular
+    .module('app.common.directives')
+    .directive('appNavigation', function() {
+      return {
+        'restrict': 'E',
+        'template': require('./app-navigation.html'),
+        'scope': {
+          'path': '=',
+          'showNavigation': '='
+        },
+        'controller': ['$scope', '$location', 'dataService', function($scope, $location, dataService) {
+          $scope.dataService = dataService;
+          $scope.showSubMenu = false;
+          $scope.change = function(firstLevel) {
+            if (firstLevel != $scope.firstLevel) {
+              $scope.firstLevel = firstLevel;
+              $scope.showSubMenu = true;
+            }
+            else {
+              $scope.showSubMenu = !$scope.showSubMenu;
+            }
+          };
+          $scope.closeSubnav = function() {
+            $scope.showSubMenu = false;
+          };
+          $scope.$watch('path', function() {
+            var urlRoot = $location.path().split('/')[1];
+            if (urlRoot != '') {
+              $scope.firstLevel = urlRoot;
+            }
+            else {
+              $scope.firstLevel = 'overview';
+            }
+            $scope.showSubMenu = false;
+          });
+          $scope.$watch('showNavigation', function() {
+            var paddingTop = 0;
+            var urlRoot = $location.path().split('/')[1];
+            if (urlRoot != '') {
+              $scope.firstLevel = urlRoot;
+            }
+            else {
+              $scope.firstLevel = 'overview';
+            }
 
-                        if($scope.showNavigation){
-                            paddingTop = document.getElementById('header__wrapper').offsetHeight;
-                        }
-                        dataService.bodyStyle = {'padding-top': paddingTop + 'px'};
-                        $scope.navStyle = {'top': paddingTop + 'px'};
-                    });
-                }],
-                link: function(scope, element, attributes) {
-                    var rawNavElement = angular.element(element)[0];
-                    angular.element(window.document).bind('click', function(event){
-                       if (rawNavElement.contains(event.target))
-                           return;
-
-                       if(scope.showSubMenu){
-                           scope.$apply(function(){
-                              scope.showSubMenu = false;
-                           });
-                       }
-                   });
-                }
+            if ($scope.showNavigation) {
+              paddingTop = document.getElementById('header__wrapper').offsetHeight;
+            }
+            dataService.bodyStyle = {
+              'padding-top': paddingTop + 'px'
             };
-        });
+            $scope.navStyle = {
+              'top': paddingTop + 'px'
+            };
+          });
+        }],
+        link: function(scope, element, attributes) {
+          var rawNavElement = angular.element(element)[0];
+          angular.element(window.document).bind('click', function(event) {
+            if (rawNavElement.contains(event.target))
+              return;
+
+            if (scope.showSubMenu) {
+              scope.$apply(function() {
+                scope.showSubMenu = false;
+              });
+            }
+          });
+        }
+      };
+    });
 })(window.angular);
diff --git a/app/common/directives/confirm.js b/app/common/directives/confirm.js
index 5bb699a..a542783 100644
--- a/app/common/directives/confirm.js
+++ b/app/common/directives/confirm.js
@@ -1,39 +1,44 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('confirm', ['$timeout', function($timeout){
-            return {
-                'restrict': 'E',
-                'template': require('./confirm.html'),
-                'scope': {
-                   'title': '@',
-                   'message': '@',
-                   'confirm': '=',
-                   'callback': '='
-                },
-                'controller': ['$scope',function($scope){
-                    $scope.cancel = function(){
-                        $scope.confirm = false;
-                        $scope.$parent.confirm = false;
-                    };
-                    $scope.accept = function(){
-                        $scope.callback();
-                        $scope.cancel();
-                    }
-                }],
-                link: function(scope, e) {
-                    scope.$watch('confirm', function(){
-                        if(scope.confirm){
-                            $timeout(function(){
-                                angular.element(e[0].parentNode).css({'min-height': e[0].querySelector('.inline__confirm').offsetHeight + 'px'});
-                            }, 0);
-                        }else{
-                            angular.element(e[0].parentNode).css({'min-height': 0+ 'px'});
-                        }
-                    });
-                }
-            };
-        }]);
+  angular
+    .module('app.common.directives')
+    .directive('confirm', ['$timeout', function($timeout) {
+      return {
+        'restrict': 'E',
+        'template': require('./confirm.html'),
+        'scope': {
+          'title': '@',
+          'message': '@',
+          'confirm': '=',
+          'callback': '='
+        },
+        'controller': ['$scope', function($scope) {
+          $scope.cancel = function() {
+            $scope.confirm = false;
+            $scope.$parent.confirm = false;
+          };
+          $scope.accept = function() {
+            $scope.callback();
+            $scope.cancel();
+          };
+        }],
+        link: function(scope, e) {
+          scope.$watch('confirm', function() {
+            if (scope.confirm) {
+              $timeout(function() {
+                angular.element(e[0].parentNode).css({
+                  'min-height': e[0].querySelector('.inline__confirm').offsetHeight + 'px'
+                });
+              }, 0);
+            }
+            else {
+              angular.element(e[0].parentNode).css({
+                'min-height': 0 + 'px'
+              });
+            }
+          });
+        }
+      };
+    }]);
 })(window.angular);
diff --git a/app/common/directives/errors.js b/app/common/directives/errors.js
index 2c9b109..8123694 100644
--- a/app/common/directives/errors.js
+++ b/app/common/directives/errors.js
@@ -1,18 +1,18 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('errors', ['APIUtils', function (APIUtils) {
-            return {
-                'restrict': 'E',
-                'template': require('./errors.html'),
-                'scope': {
-                   'path': '='
-                },
-                'controller': ['$scope','dataService', function($scope, dataService){
-                    $scope.dataService = dataService;
-                }]
-            };
-        }]);
+  angular
+    .module('app.common.directives')
+    .directive('errors', ['APIUtils', function(APIUtils) {
+      return {
+        'restrict': 'E',
+        'template': require('./errors.html'),
+        'scope': {
+          'path': '='
+        },
+        'controller': ['$scope', 'dataService', function($scope, dataService) {
+          $scope.dataService = dataService;
+        }]
+      };
+    }]);
 })(window.angular);
diff --git a/app/common/directives/file.js b/app/common/directives/file.js
index 11adf8a..8ed6c2e 100644
--- a/app/common/directives/file.js
+++ b/app/common/directives/file.js
@@ -1,21 +1,21 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('file', function () {
-            return {
-                scope: {
-                    file: '='
-                },
-                link: function (scope, el, attrs) {
-                    el.bind('change', function (event) {
-                        var file = event.target.files[0];
-                        scope.file = file ? file : undefined;
-                        scope.$apply();
-                    });
-                }
-            };
-        });
+  angular
+    .module('app.common.directives')
+    .directive('file', function() {
+      return {
+        scope: {
+          file: '='
+        },
+        link: function(scope, el, attrs) {
+          el.bind('change', function(event) {
+            var file = event.target.files[0];
+            scope.file = file ? file : undefined;
+            scope.$apply();
+          });
+        }
+      };
+    });
 
-})(window.angular);
\ No newline at end of file
+})(window.angular);
diff --git a/app/common/directives/firmware-list.js b/app/common/directives/firmware-list.js
index 4cdf6d7..163df82 100644
--- a/app/common/directives/firmware-list.js
+++ b/app/common/directives/firmware-list.js
@@ -1,32 +1,32 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('firmwareList', ['APIUtils', function (APIUtils) {
-            return {
-                'restrict': 'E',
-                'template': require('./firmware-list.html'),
-                'scope': {
-                   'title': '@',
-                   'firmwares': '=',
-                   'filterBy': '=',
-                   'version': '='
-                },
-                'controller': ['$rootScope', '$scope','dataService', '$location', '$timeout', function($rootScope, $scope, dataService, $location, $timeout){
-                    $scope.dataService = dataService;
-                    $scope.activate = function(imageId, imageVersion, imageType){
-                        $scope.$parent.activateImage(imageId, imageVersion, imageType);
-                    }
+  angular
+    .module('app.common.directives')
+    .directive('firmwareList', ['APIUtils', function(APIUtils) {
+      return {
+        'restrict': 'E',
+        'template': require('./firmware-list.html'),
+        'scope': {
+          'title': '@',
+          'firmwares': '=',
+          'filterBy': '=',
+          'version': '='
+        },
+        'controller': ['$rootScope', '$scope', 'dataService', '$location', '$timeout', function($rootScope, $scope, dataService, $location, $timeout) {
+          $scope.dataService = dataService;
+          $scope.activate = function(imageId, imageVersion, imageType) {
+            $scope.$parent.activateImage(imageId, imageVersion, imageType);
+          };
 
-                    $scope.delete = function(imageId, imageVersion){
-                        $scope.$parent.deleteImage(imageId, imageVersion);
-                    }
+          $scope.delete = function(imageId, imageVersion) {
+            $scope.$parent.deleteImage(imageId, imageVersion);
+          };
 
-                    $scope.changePriority = function(imageId, imageVersion, from, to){
-                        $scope.$parent.changePriority(imageId, imageVersion, from, to);
-                    }
-                }]
-            };
-        }]);
+          $scope.changePriority = function(imageId, imageVersion, from, to) {
+            $scope.$parent.changePriority(imageId, imageVersion, from, to);
+          };
+        }]
+      };
+    }]);
 })(window.angular);
diff --git a/app/common/directives/index.js b/app/common/directives/index.js
index 1fed678..33155f4 100644
--- a/app/common/directives/index.js
+++ b/app/common/directives/index.js
@@ -1,9 +1,9 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives', [
-            'app.common.services'
-        ]);
+  angular
+    .module('app.common.directives', [
+      'app.common.services'
+    ]);
 
 })(window.angular);
diff --git a/app/common/directives/loader.js b/app/common/directives/loader.js
index b37a898..8edc128 100644
--- a/app/common/directives/loader.js
+++ b/app/common/directives/loader.js
@@ -1,16 +1,16 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('loader', function () {
-            return {
-                'restrict': 'E',
-                'template': require('./loader.html'),
-                scope: {
-                    loading: '='
-                }
-            };
-        });
+  angular
+    .module('app.common.directives')
+    .directive('loader', function() {
+      return {
+        'restrict': 'E',
+        'template': require('./loader.html'),
+        scope: {
+          loading: '='
+        }
+      };
+    });
 
 })(window.angular);
diff --git a/app/common/directives/log-event.js b/app/common/directives/log-event.js
index e858239..c48a3ee 100644
--- a/app/common/directives/log-event.js
+++ b/app/common/directives/log-event.js
@@ -1,41 +1,43 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('logEvent', ['APIUtils', function (APIUtils) {
-            return {
-                'restrict': 'E',
-                'template': require('./log-event.html'),
-                'scope': {
-                   'event': '=',
-                   'tmz': '=',
-                   'multiSelected': '='
-                },
-                'controller': ['$rootScope', '$scope','dataService', '$location', '$timeout', function($rootScope, $scope, dataService, $location, $timeout){
-                    $scope.dataService = dataService;
-                    $scope.copySuccess = function (event) {
-                        event.copied = true;
-                        $timeout(function(){
-                            event.copied = false;
-                        }, 5000);
-                    };
-                    $scope.copyFailed = function (err) {
-                        console.error('Error!', err);
-                    };
-                    $scope.resolveEvent = function(event){
-                        APIUtils.resolveLogs([{Id: event.Id}]).then(function(){
-                            event.Resolved = 1;
-                        });
-                    }
+  angular
+    .module('app.common.directives')
+    .directive('logEvent', ['APIUtils', function(APIUtils) {
+      return {
+        'restrict': 'E',
+        'template': require('./log-event.html'),
+        'scope': {
+          'event': '=',
+          'tmz': '=',
+          'multiSelected': '='
+        },
+        'controller': ['$rootScope', '$scope', 'dataService', '$location', '$timeout', function($rootScope, $scope, dataService, $location, $timeout) {
+          $scope.dataService = dataService;
+          $scope.copySuccess = function(event) {
+            event.copied = true;
+            $timeout(function() {
+              event.copied = false;
+            }, 5000);
+          };
+          $scope.copyFailed = function(err) {
+            console.error('Error!', err);
+          };
+          $scope.resolveEvent = function(event) {
+            APIUtils.resolveLogs([{
+              Id: event.Id
+            }]).then(function() {
+              event.Resolved = 1;
+            });
+          };
 
-                    $scope.accept = function(){
-                        $scope.event.selected = true;
-                        $timeout(function(){
-                            $scope.$parent.accept();
-                        }, 10);
-                    }
-                }]
-            };
-        }]);
+          $scope.accept = function() {
+            $scope.event.selected = true;
+            $timeout(function() {
+              $scope.$parent.accept();
+            }, 10);
+          };
+        }]
+      };
+    }]);
 })(window.angular);
diff --git a/app/common/directives/log-filter.js b/app/common/directives/log-filter.js
index 370e666..69bb8e3 100644
--- a/app/common/directives/log-filter.js
+++ b/app/common/directives/log-filter.js
@@ -1,50 +1,51 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('logFilter', ['APIUtils', function (APIUtils) {
-            return {
-                'restrict': 'E',
-                'template': require('./log-filter.html'),
-                'controller': ['$rootScope', '$scope','dataService', '$location', function($rootScope, $scope, dataService, $location){
-                    $scope.dataService = dataService;
-                    $scope.toggleSeverityAll = function(){
-                        $scope.selectedSeverity.all = !$scope.selectedSeverity.all;
+  angular
+    .module('app.common.directives')
+    .directive('logFilter', ['APIUtils', function(APIUtils) {
+      return {
+        'restrict': 'E',
+        'template': require('./log-filter.html'),
+        'controller': ['$rootScope', '$scope', 'dataService', '$location', function($rootScope, $scope, dataService, $location) {
+          $scope.dataService = dataService;
+          $scope.toggleSeverityAll = function() {
+            $scope.selectedSeverity.all = !$scope.selectedSeverity.all;
 
-                        if($scope.selectedSeverity.all){
-                            $scope.selectedSeverity.low = false;
-                            $scope.selectedSeverity.medium = false;
-                            $scope.selectedSeverity.high = false;
-                        }
-                    }
+            if ($scope.selectedSeverity.all) {
+              $scope.selectedSeverity.low = false;
+              $scope.selectedSeverity.medium = false;
+              $scope.selectedSeverity.high = false;
+            }
+          };
 
-                    $scope.toggleSeverity = function(severity){
-                        $scope.selectedSeverity[severity] = !$scope.selectedSeverity[severity];
+          $scope.toggleSeverity = function(severity) {
+            $scope.selectedSeverity[severity] = !$scope.selectedSeverity[severity];
 
-                        if(['high', 'medium', 'low'].indexOf(severity) > -1){
-                            if($scope.selectedSeverity[severity] == false &&
-                               (!$scope.selectedSeverity.low &&
-                                !$scope.selectedSeverity.medium &&
-                                !$scope.selectedSeverity.high
-                               )){
-                                $scope.selectedSeverity.all = true;
-                                return;
-                            }
-                        }
+            if (['high', 'medium', 'low'].indexOf(severity) > -1) {
+              if ($scope.selectedSeverity[severity] == false &&
+                (!$scope.selectedSeverity.low &&
+                  !$scope.selectedSeverity.medium &&
+                  !$scope.selectedSeverity.high
+                )) {
+                $scope.selectedSeverity.all = true;
+                return;
+              }
+            }
 
-                        if($scope.selectedSeverity.low &&
-                           $scope.selectedSeverity.medium &&
-                           $scope.selectedSeverity.high){
-                            $scope.selectedSeverity.all = true;
-                            $scope.selectedSeverity.low = false;
-                            $scope.selectedSeverity.medium = false;
-                            $scope.selectedSeverity.high = false;
-                        }else{
-                            $scope.selectedSeverity.all = false;
-                        }
-                    }
-                }]
-            };
-        }]);
+            if ($scope.selectedSeverity.low &&
+              $scope.selectedSeverity.medium &&
+              $scope.selectedSeverity.high) {
+              $scope.selectedSeverity.all = true;
+              $scope.selectedSeverity.low = false;
+              $scope.selectedSeverity.medium = false;
+              $scope.selectedSeverity.high = false;
+            }
+            else {
+              $scope.selectedSeverity.all = false;
+            }
+          };
+        }]
+      };
+    }]);
 })(window.angular);
diff --git a/app/common/directives/log-search-control.js b/app/common/directives/log-search-control.js
index c610c18..f262f5f 100644
--- a/app/common/directives/log-search-control.js
+++ b/app/common/directives/log-search-control.js
@@ -1,44 +1,46 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('logSearchControl', ['APIUtils', function (APIUtils) {
-            return {
-                'restrict': 'E',
-                'template': require('./log-search-control.html'),
-                'controller': ['$rootScope', '$scope','dataService', '$location', function($rootScope, $scope, dataService, $location){
-                    $scope.dataService = dataService;
-                    $scope.doSearchOnEnter = function (event) {
-                        var search = $scope.customSearch.replace(/^\s+/g,'').replace(/\s+$/g,'');
-                        if (event.keyCode === 13 &&
-                            search.length >= 2) {
-                            $scope.clearSearchItem();
-                            $scope.addSearchItem(search);
-                        }else{
-                            if(search.length == 0){
-                                $scope.clearSearchItem();
-                            }
-                        }
-                    };
+  angular
+    .module('app.common.directives')
+    .directive('logSearchControl', ['APIUtils', function(APIUtils) {
+      return {
+        'restrict': 'E',
+        'template': require('./log-search-control.html'),
+        'controller': ['$rootScope', '$scope', 'dataService', '$location', function($rootScope, $scope, dataService, $location) {
+          $scope.dataService = dataService;
+          $scope.doSearchOnEnter = function(event) {
+            var search = $scope.customSearch.replace(/^\s+/g, '').replace(/\s+$/g, '');
+            if (event.keyCode === 13 &&
+              search.length >= 2) {
+              $scope.clearSearchItem();
+              $scope.addSearchItem(search);
+            }
+            else {
+              if (search.length == 0) {
+                $scope.clearSearchItem();
+              }
+            }
+          };
 
-                    $scope.clear = function(){
-                        $scope.customSearch = "";
-                        $scope.clearSearchItem();
-                    }
+          $scope.clear = function() {
+            $scope.customSearch = '';
+            $scope.clearSearchItem();
+          };
 
-                    $scope.doSearchOnClick = function() {
-                        var search = $scope.customSearch.replace(/^\s+/g,'').replace(/\s+$/g,'');
-                        if (search.length >= 2) {
-                            $scope.clearSearchItem();
-                            $scope.addSearchItem(search);
-                        }else{
-                            if(search.length == 0){
-                                $scope.clearSearchItem();
-                            }
-                        }
-                    }
-                }]
-            };
-        }]);
+          $scope.doSearchOnClick = function() {
+            var search = $scope.customSearch.replace(/^\s+/g, '').replace(/\s+$/g, '');
+            if (search.length >= 2) {
+              $scope.clearSearchItem();
+              $scope.addSearchItem(search);
+            }
+            else {
+              if (search.length == 0) {
+                $scope.clearSearchItem();
+              }
+            }
+          };
+        }]
+      };
+    }]);
 })(window.angular);
diff --git a/app/common/directives/paginate.js b/app/common/directives/paginate.js
index e69de29..8b13789 100644
--- a/app/common/directives/paginate.js
+++ b/app/common/directives/paginate.js
@@ -0,0 +1 @@
+
diff --git a/app/common/directives/toggle-flag.js b/app/common/directives/toggle-flag.js
index 9c342b0..4a4e454 100644
--- a/app/common/directives/toggle-flag.js
+++ b/app/common/directives/toggle-flag.js
@@ -1,31 +1,31 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.directives')
-        .directive('toggleFlag', function ($document) {
-            return {
-                restrict: 'A',
-                link: function (scope, element, attrs) {
+  angular
+    .module('app.common.directives')
+    .directive('toggleFlag', function($document) {
+      return {
+        restrict: 'A',
+        link: function(scope, element, attrs) {
 
-                    function elementClick(e) {
-                        e.stopPropagation();
-                    }
+          function elementClick(e) {
+            e.stopPropagation();
+          }
 
-                    function documentClick(e) {
-                        scope[attrs.toggleFlag] = false;
-                        scope.$apply();
-                    }
+          function documentClick(e) {
+            scope[attrs.toggleFlag] = false;
+            scope.$apply();
+          }
 
-                    element.on('click', elementClick);
-                    $document.on('click', documentClick);
+          element.on('click', elementClick);
+          $document.on('click', documentClick);
 
-                    // remove event handlers when directive is destroyed
-                    scope.$on('$destroy', function () {
-                        element.off('click', elementClick);
-                        $document.off('click', documentClick);
-                    });
-                }
-            };
-        });
-})(window.angular);
\ No newline at end of file
+          // remove event handlers when directive is destroyed
+          scope.$on('$destroy', function() {
+            element.off('click', elementClick);
+            $document.off('click', documentClick);
+          });
+        }
+      };
+    });
+})(window.angular);
diff --git a/app/common/filters/index.js b/app/common/filters/index.js
index 5c719fa..f3de907 100644
--- a/app/common/filters/index.js
+++ b/app/common/filters/index.js
@@ -1,25 +1,25 @@
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.filters', [])
-        .filter('unResolvedCount', function () {
-            return function (data) {
-               data = data.filter(function(item){
-                  return item.Resolved == 0;
-               });
-               return data.length;
-            }
-        })
-        .filter('quiescedToError', function () {
-            return function (state) {
-               if(state.toLowerCase() == 'quiesced'){
-                  return 'Error';
-               }else{
-                return state;
-               }
-            }
-        })
-        ;
+  angular
+    .module('app.common.filters', [])
+    .filter('unResolvedCount', function() {
+      return function(data) {
+        data = data.filter(function(item) {
+          return item.Resolved == 0;
+        });
+        return data.length;
+      }
+    })
+    .filter('quiescedToError', function() {
+      return function(state) {
+        if (state.toLowerCase() == 'quiesced') {
+          return 'Error';
+        }
+        else {
+          return state;
+        }
+      }
+    });
 
 })(window.angular);
diff --git a/app/common/services/api-utils.js b/app/common/services/api-utils.js
index 13f1406..a024142 100644
--- a/app/common/services/api-utils.js
+++ b/app/common/services/api-utils.js
@@ -6,1134 +6,1233 @@
  * @name APIUtils
  */
 
-window.angular && (function (angular) {
-    'use strict';
-    angular
-        .module('app.common.services')
-        .factory('APIUtils', ['$http', 'Constants', '$q', 'dataService',function($http, Constants, $q, DataService){
-          var getScaledValue = function(value, scale){
-            scale = scale + "";
-            scale = parseInt(scale, 10);
-            var power = Math.abs(parseInt(scale,10));
+window.angular && (function(angular) {
+  'use strict';
+  angular
+    .module('app.common.services')
+    .factory('APIUtils', ['$http', 'Constants', '$q', 'dataService', function($http, Constants, $q, DataService) {
+      var getScaledValue = function(value, scale) {
+        scale = scale + '';
+        scale = parseInt(scale, 10);
+        var power = Math.abs(parseInt(scale, 10));
 
-            if(scale > 0){
-              value = value * Math.pow(10, power);
-            }else if(scale < 0){
-              value = value / Math.pow(10, power);
+        if (scale > 0) {
+          value = value * Math.pow(10, power);
+        }
+        else if (scale < 0) {
+          value = value / Math.pow(10, power);
+        }
+        return value;
+      };
+      var SERVICE = {
+        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,
+        LED_STATE: Constants.LED_STATE,
+        LED_STATE_TEXT: Constants.LED_STATE_TEXT,
+        HOST_SESSION_STORAGE_KEY: Constants.API_CREDENTIALS.host_storage_key,
+        getChassisState: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/chassis0/attr/CurrentPowerState',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.data);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        getHostState: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.data);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        getNetworkInfo: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/network/enumerate',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            var hostname = '';
+            var macAddress = '';
+
+            function parseNetworkData(content) {
+              var data = {
+                interface_ids: [],
+                interfaces: {},
+                ip_addresses: {
+                  ipv4: [],
+                  ipv6: []
+                },
+              };
+              var interfaceId = '',
+                keyParts = [],
+                interfaceHash = '',
+                interfaceType = '';
+              for (var key in content.data) {
+                if (key.match(/network\/eth\d+$/ig)) {
+                  interfaceId = key.split('/').pop();
+                  if (data.interface_ids.indexOf(interfaceId) == -1) {
+                    data.interface_ids.push(interfaceId);
+                    data.interfaces[interfaceId] = {
+                      interfaceIname: '',
+                      DomainName: '',
+                      MACAddress: '',
+                      Nameservers: [],
+                      DHCPEnabled: 0,
+                      ipv4: {
+                        ids: [],
+                        values: []
+                      },
+                      ipv6: {
+                        ids: [],
+                        values: []
+                      }
+                    };
+                    data.interfaces[interfaceId].MACAddress = content.data[key].MACAddress;
+                    data.interfaces[interfaceId].DomainName = content.data[key].DomainName.join(' ');
+                    data.interfaces[interfaceId].Nameservers = content.data[key].Nameservers;
+                    data.interfaces[interfaceId].DHCPEnabled = content.data[key].DHCPEnabled;
+                  }
+                }
+                else if (key.match(/network\/eth\d+\/ipv[4|6]\/[a-z0-9]+$/ig)) {
+                  keyParts = key.split('/');
+                  interfaceHash = keyParts.pop();
+                  interfaceType = keyParts.pop();
+                  interfaceId = keyParts.pop();
+
+                  if (data.interfaces[interfaceId][interfaceType].ids.indexOf(interfaceHash) == -1) {
+                    data.interfaces[interfaceId][interfaceType].ids.push(interfaceHash);
+                    data.interfaces[interfaceId][interfaceType].values.push(content.data[key]);
+                    data.ip_addresses[interfaceType].push(content.data[key]['Address']);
+                  }
+                }
+              }
+              return data;
             }
-            return value;
-          };
-          var SERVICE = {
-              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,
-              LED_STATE: Constants.LED_STATE,
-              LED_STATE_TEXT: Constants.LED_STATE_TEXT,
-              HOST_SESSION_STORAGE_KEY: Constants.API_CREDENTIALS.host_storage_key,
-              getChassisState: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/chassis0/attr/CurrentPowerState",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content.data);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
+
+            if (content.data.hasOwnProperty('/xyz/openbmc_project/network/config') &&
+              content.data['/xyz/openbmc_project/network/config'].hasOwnProperty('HostName')
+            ) {
+              hostname = content.data['/xyz/openbmc_project/network/config'].HostName;
+            }
+
+            if (content.data.hasOwnProperty('/xyz/openbmc_project/network/eth0') &&
+              content.data['/xyz/openbmc_project/network/eth0'].hasOwnProperty('MACAddress')
+            ) {
+              macAddress = content.data['/xyz/openbmc_project/network/eth0'].MACAddress;
+            }
+
+            deferred.resolve({
+              data: content.data,
+              hostname: hostname,
+              mac_address: macAddress,
+              formatted_data: parseNetworkData(content)
+            });
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        getLEDState: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/led/groups/enclosure_identify',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.data.Asserted);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        login: function(username, password, callback) {
+          $http({
+            method: 'POST',
+            url: DataService.getHost() + '/login',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': [username, password]
+            })
+          }).then(function(response) {
+            if (callback) {
+              callback(response.data);
+            }
+          }, function(error) {
+            if (callback) {
+              if (error && error.status && error.status == 'error') {
+                callback(error);
+              }
+              else {
+                callback(error, true);
+              }
+            }
+            console.log(error);
+          });
+        },
+        testPassword: function(username, password) {
+          // Calls /login without the current session to verify the given password is correct
+          // ignore the interceptor logout on a bad password
+          DataService.ignoreHttpError = true;
+          return $http({
+            method: 'POST',
+            url: DataService.getHost() + '/login',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: false,
+            data: JSON.stringify({
+              'data': [username, password]
+            })
+          }).then(function(response) {
+            return response.data;
+          });
+        },
+        logout: function(callback) {
+          $http({
+            method: 'POST',
+            url: DataService.getHost() + '/logout',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': []
+            })
+          }).then(function(response) {
+            if (callback) {
+              callback(response.data);
+            }
+          }, function(error) {
+            if (callback) {
+              callback(null, error);
+            }
+            console.log(error);
+          });
+        },
+        changePassword: function(user, newPassword) {
+          var deferred = $q.defer();
+          $http({
+            method: 'POST',
+            url: DataService.getHost() + '/xyz/openbmc_project/user/' + user + '/action/SetPassword',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': [newPassword]
+            }),
+            responseType: 'arraybuffer'
+          }).then(function(response, status, headers) {
+            deferred.resolve({
+              data: response,
+              status: status,
+              headers: headers
+            });
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        chassisPowerOn: function(callback) {
+          $http({
+            method: 'POST',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': []
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            if (callback) {
+              return callback(content.data.CurrentPowerState);
+            }
+          }, function(error) {
+            if (callback) {
+              callback(error);
+            }
+            else {
+              console.log(error);
+            }
+          });
+        },
+        chassisPowerOff: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.status);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        setLEDState: function(state, callback) {
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': state
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            if (callback) {
+              return callback(content.status);
+            }
+          }, function(error) {
+            if (callback) {
+              callback(error);
+            }
+            else {
+              console.log(error);
+            }
+          });
+        },
+        bmcReboot: function(callback) {
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/bmc0/attr/RequestedBmcTransition',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            if (callback) {
+              return callback(content.status);
+            }
+          }, function(error) {
+            if (callback) {
+              callback(error);
+            }
+            else {
+              console.log(error);
+            }
+          });
+        },
+        hostPowerOn: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': 'xyz.openbmc_project.State.Host.Transition.On'
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.status);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        hostPowerOff: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': 'xyz.openbmc_project.State.Host.Transition.Off'
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.status);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        hostReboot: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.status);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+
+          return deferred.promise;
+        },
+        hostShutdown: function(callback) {
+          $http({
+            method: 'POST',
+            url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': []
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            if (callback) {
+              return callback(content);
+            }
+          }, function(error) {
+            if (callback) {
+              callback(error);
+            }
+            else {
+              console.log(error);
+            }
+          });
+        },
+        getLogs: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/logging/enumerate',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            var dataClone = JSON.parse(JSON.stringify(content.data));
+            var data = [];
+            var severityCode = '';
+            var priority = '';
+            var health = '';
+            var relatedItems = [];
+
+            for (var key in content.data) {
+              if (content.data.hasOwnProperty(key) && content.data[key].hasOwnProperty('Id')) {
+                var severityFlags = {
+                  low: false,
+                  medium: false,
+                  high: false
+                };
+                var healthFlags = {
+                  critical: false,
+                  warning: false,
+                  good: false
+                };
+                severityCode = content.data[key].Severity.split('.').pop();
+                priority = Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
+                severityFlags[priority.toLowerCase()] = true;
+                health = Constants.SEVERITY_TO_HEALTH_MAP[severityCode];
+                healthFlags[health.toLowerCase()] = true;
+                relatedItems = [];
+                content.data[key].associations.forEach(function(item) {
+                  relatedItems.push(item[2]);
                 });
-                return deferred.promise;
-              },
-              getHostState: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/host0/attr/CurrentHostState",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content.data);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
+
+                data.push(Object.assign({
+                  path: key,
+                  copied: false,
+                  priority: priority,
+                  severity_code: severityCode,
+                  severity_flags: severityFlags,
+                  health_flags: healthFlags,
+                  additional_data: content.data[key].AdditionalData.join('\n'),
+                  type: content.data[key].Message,
+                  selected: false,
+                  search_text: ('#' + content.data[key].Id + ' ' + severityCode + ' ' + content.data[key].Severity + ' ' + content.data[key].AdditionalData.join(' ')).toLowerCase(),
+                  meta: false,
+                  confirm: false,
+                  related_items: relatedItems,
+                  data: {
+                    key: key,
+                    value: content.data[key]
+                  }
+                }, content.data[key]));
+              }
+            }
+            deferred.resolve({
+              data: data,
+              original: dataClone
+            });
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+
+          return deferred.promise;
+        },
+        getAllSensorStatus: function(callback) {
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/sensors/enumerate',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            var dataClone = JSON.parse(JSON.stringify(content.data));
+            var sensorData = [];
+            var severity = {};
+            var title = '';
+            var tempKeyParts = [];
+            var order = 0;
+            var customOrder = 0;
+
+            function getSensorStatus(reading) {
+              var severityFlags = {
+                  critical: false,
+                  warning: false,
+                  normal: false
+                },
+                severityText = '',
+                order = 0;
+
+              if (reading.hasOwnProperty('CriticalLow') &&
+                reading.Value < reading.CriticalLow
+              ) {
+                severityFlags.critical = true;
+                severityText = 'critical';
+                order = 2;
+              }
+              else if (reading.hasOwnProperty('CriticalHigh') &&
+                reading.Value > reading.CriticalHigh
+              ) {
+                severityFlags.critical = true;
+                severityText = 'critical';
+                order = 2;
+              }
+              else if (reading.hasOwnProperty('CriticalLow') &&
+                reading.hasOwnProperty('WarningLow') &&
+                reading.Value >= reading.CriticalLow && reading.Value <= reading.WarningLow) {
+                severityFlags.warning = true;
+                severityText = 'warning';
+                order = 1;
+              }
+              else if (reading.hasOwnProperty('WarningHigh') &&
+                reading.hasOwnProperty('CriticalHigh') &&
+                reading.Value >= reading.WarningHigh && reading.Value <= reading.CriticalHigh) {
+                severityFlags.warning = true;
+                severityText = 'warning';
+                order = 1;
+              }
+              else {
+                severityFlags.normal = true;
+                severityText = 'normal';
+              }
+              return {
+                flags: severityFlags,
+                severityText: severityText,
+                order: order
+              };
+            }
+
+            for (var key in content.data) {
+              if (content.data.hasOwnProperty(key) && content.data[key].hasOwnProperty('Unit')) {
+
+                severity = getSensorStatus(content.data[key]);
+
+                if (!content.data[key].hasOwnProperty('CriticalLow')) {
+                  content.data[key].CriticalLow = '--';
+                  content.data[key].CriticalHigh = '--';
+                }
+
+                if (!content.data[key].hasOwnProperty('WarningLow')) {
+                  content.data[key].WarningLow = '--';
+                  content.data[key].WarningHigh = '--';
+                }
+
+                tempKeyParts = key.split('/');
+                title = tempKeyParts.pop();
+                title = tempKeyParts.pop() + '_' + title;
+                title = title.split('_').map(function(item) {
+                  return item.toLowerCase().charAt(0).toUpperCase() + item.slice(1);
+                }).reduce(function(prev, el) {
+                  return prev + ' ' + el;
                 });
-                return deferred.promise;
-              },
-              getNetworkInfo: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/network/enumerate",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
+
+                content.data[key].Value = getScaledValue(content.data[key].Value, content.data[key].Scale);
+                content.data[key].CriticalLow = getScaledValue(content.data[key].CriticalLow, content.data[key].Scale);
+                content.data[key].CriticalHigh = getScaledValue(content.data[key].CriticalHigh, content.data[key].Scale);
+                content.data[key].WarningLow = getScaledValue(content.data[key].WarningLow, content.data[key].Scale);
+                content.data[key].WarningHigh = getScaledValue(content.data[key].WarningHigh, content.data[key].Scale);
+                if (Constants.SENSOR_SORT_ORDER.indexOf(content.data[key].Unit) > -1) {
+                  customOrder = Constants.SENSOR_SORT_ORDER.indexOf(content.data[key].Unit);
+                }
+                else {
+                  customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
+                }
+
+                sensorData.push(Object.assign({
+                  path: key,
+                  selected: false,
+                  confirm: false,
+                  copied: false,
+                  title: title,
+                  unit: Constants.SENSOR_UNIT_MAP[content.data[key].Unit],
+                  severity_flags: severity.flags,
+                  status: severity.severityText,
+                  order: severity.order,
+                  custom_order: customOrder,
+                  search_text: (title + ' ' + content.data[key].Value + ' ' +
+                    Constants.SENSOR_UNIT_MAP[content.data[key].Unit] + ' ' +
+                    severity.severityText + ' ' +
+                    content.data[key].CriticalLow + ' ' +
+                    content.data[key].CriticalHigh + ' ' +
+                    content.data[key].WarningLow + ' ' +
+                    content.data[key].WarningHigh + ' '
+                  ).toLowerCase(),
+                  original_data: {
+                    key: key,
+                    value: content.data[key]
+                  }
+                }, content.data[key]));
+              }
+            }
+
+            callback(sensorData, dataClone);
+          }, function(error) {
+            console.log(error);
+          });
+        },
+        getActivation: function(imageId) {
+          return $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/software/' + imageId + '/attr/Activation',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            return response.data;
+          });
+        },
+        getFirmwares: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/software/enumerate',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            var data = [];
+            var activationStatus = '';
+            var isExtended = false;
+            var bmcActiveVersion = '';
+            var hostActiveVersion = '';
+            var imageType = '';
+            var extendedVersions = [];
+            var functionalImages = [];
+
+            function getFormatedExtendedVersions(extendedVersion) {
+              var versions = [];
+              extendedVersion = extendedVersion.split(',');
+
+              extendedVersion.forEach(function(item) {
+                var parts = item.split('-');
+                var numberIndex = 0;
+                for (var i = 0; i < parts.length; i++) {
+                  if (/[0-9]/.test(parts[i])) {
+                    numberIndex = i;
+                    break;
+                  }
+                }
+                var titlePart = parts.splice(0, numberIndex);
+                titlePart = titlePart.join('');
+                titlePart = titlePart[0].toUpperCase() + titlePart.substr(1, titlePart.length);
+                var versionPart = parts.join('-');
+                versions.push({
+                  title: titlePart,
+                  version: versionPart
+                });
+              });
+
+              return versions;
+            }
+
+            // Get the list of functional images so we can compare
+            // later if an image is functional
+            if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
+              functionalImages = content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH].endpoints;
+            }
+            for (var key in content.data) {
+              if (content.data.hasOwnProperty(key) && content.data[key].hasOwnProperty('Version')) {
+                // If the image is "Functional" use that for the
+                // activation status, else use the value of "Activation"
+                // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
+                activationStatus = content.data[key].Activation.split('.').pop();
+                if (functionalImages.includes(key)) {
+                  activationStatus = 'Functional';
+                }
+
+                imageType = content.data[key].Purpose.split('.').pop();
+                isExtended = content.data[key].hasOwnProperty('ExtendedVersion') && content.data[key].ExtendedVersion != '';
+                if (isExtended) {
+                  extendedVersions = getFormatedExtendedVersions(content.data[key].ExtendedVersion);
+                }
+                data.push(Object.assign({
+                  path: key,
+                  activationStatus: activationStatus,
+                  imageId: key.split('/').pop(),
+                  imageType: imageType,
+                  isExtended: isExtended,
+                  extended: {
+                    show: false,
+                    versions: extendedVersions
                   },
-                  withCredentials: true
-                }).then(function(response){
-                    var json = JSON.stringify(response.data);
-                    var content = JSON.parse(json);
-                    var hostname = "";
-                    var macAddress = "";
+                  data: {
+                    key: key,
+                    value: content.data[key]
+                  }
+                }, content.data[key]));
 
-                    function parseNetworkData(content){
-                      var data = {
-                        interface_ids: [],
-                        interfaces: {},
-                        ip_addresses: {ipv4 : [],
-                                       ipv6 : []},
-                      };
-                      var interfaceId = '', keyParts = [], interfaceHash = '', interfaceType = '';
-                      for(var key in content.data){
-                        if(key.match(/network\/eth\d+$/ig)){
-                          interfaceId = key.split("/").pop();
-                          if(data.interface_ids.indexOf(interfaceId) == -1){
-                            data.interface_ids.push(interfaceId);
-                            data.interfaces[interfaceId] = {
-                              interfaceIname: '',
-                              DomainName:'',
-                              MACAddress:'',
-                              Nameservers: [],
-                              DHCPEnabled: 0,
-                              ipv4:
-                                {
-                                 ids: [],
-                                 values: []
-                                },
-                              ipv6:
-                                {
-                                 ids: [],
-                                 values: []
-                                }
-                            };
-                            data.interfaces[interfaceId].MACAddress = content.data[key].MACAddress;
-                            data.interfaces[interfaceId].DomainName = content.data[key].DomainName.join(" ");
-                            data.interfaces[interfaceId].Nameservers = content.data[key].Nameservers;
-                            data.interfaces[interfaceId].DHCPEnabled = content.data[key].DHCPEnabled;
-                          }
-                        }else if(key.match(/network\/eth\d+\/ipv[4|6]\/[a-z0-9]+$/ig)){
-                          keyParts = key.split("/");
-                          interfaceHash = keyParts.pop();
-                          interfaceType = keyParts.pop();
-                          interfaceId = keyParts.pop();
+                if (activationStatus == 'Functional' && imageType == 'BMC') {
+                  bmcActiveVersion = content.data[key].Version;
+                }
 
-                          if(data.interfaces[interfaceId][interfaceType].ids.indexOf(interfaceHash) == -1){
-                            data.interfaces[interfaceId][interfaceType].ids.push(interfaceHash);
-                            data.interfaces[interfaceId][interfaceType].values.push(content.data[key]);
-                            data.ip_addresses[interfaceType].push(content.data[key]['Address']);
-                          }
-                        }
-                      }
-                      return data;
+                if (activationStatus == 'Functional' && imageType == 'Host') {
+                  hostActiveVersion = content.data[key].Version;
+                }
+              }
+            }
+
+            deferred.resolve({
+              data: data,
+              bmcActiveVersion: bmcActiveVersion,
+              hostActiveVersion: hostActiveVersion
+            });
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+
+          return deferred.promise;
+        },
+        changePriority: function(imageId, priority) {
+          var deferred = $q.defer();
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/software/' + imageId + '/attr/Priority',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': priority
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+
+          return deferred.promise;
+        },
+        deleteImage: function(imageId) {
+          var deferred = $q.defer();
+          $http({
+            method: 'POST',
+            url: DataService.getHost() + '/xyz/openbmc_project/software/' + imageId + '/action/Delete',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': []
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+
+          return deferred.promise;
+        },
+        activateImage: function(imageId) {
+          var deferred = $q.defer();
+          $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/software/' + imageId + '/attr/RequestedActivation',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE
+            })
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+
+          return deferred.promise;
+        },
+        uploadImage: function(file) {
+          return $http({
+            method: 'POST',
+            timeout: 5 * 60 * 1000,
+            url: DataService.getHost() + '/upload/image',
+            headers: {
+              'Content-Type': 'application/octet-stream'
+            },
+            withCredentials: true,
+            data: file
+          }).then(function(response) {
+            return response.data;
+          });
+        },
+        downloadImage: function(host, filename) {
+          return $http({
+            method: 'POST',
+            url: DataService.getHost() + '/xyz/openbmc_project/software/action/DownloadViaTFTP',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': [filename, host]
+            }),
+            responseType: 'arraybuffer'
+          }).then(function(response) {
+            return response.data;
+          });
+        },
+        getBMCEthernetInfo: function() {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc/ethernet',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.data);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+
+          return deferred.promise;
+        },
+        getBMCInfo: function(callback) {
+          var deferred = $q.defer();
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            deferred.resolve(content.data);
+          }, function(error) {
+            console.log(error);
+            deferred.reject(error);
+          });
+          return deferred.promise;
+        },
+        getServerInfo: function() {
+          // TODO: openbmc/openbmc#3117 Need a way via REST to get
+          // interfaces so we can get the system object(s) by the looking
+          // for the system interface.
+          return $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/inventory/system',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            return response.data;
+          });
+        },
+        getBMCTime: function() {
+          return $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            return response.data;
+          });
+        },
+        getHardwares: function(callback) {
+          $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/inventory/enumerate',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
+            var hardwareData = [];
+            var keyIndexMap = {};
+            var title = '';
+            var data = [];
+            var searchText = '';
+            var componentIndex = -1;
+            var tempParts = [];
+
+
+            function isSubComponent(key) {
+
+              for (var i = 0; i < Constants.HARDWARE.parent_components.length; i++) {
+                if (key.split(Constants.HARDWARE.parent_components[i]).length == 2) return true;
+              }
+
+              return false;
+            }
+
+            function titlelize(title) {
+              title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
+              for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length; i++) {
+                if (title.toLowerCase().indexOf((Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
+                  return title.toUpperCase();
+                }
+              }
+
+              return title;
+            }
+
+            function camelcaseToLabel(obj) {
+              var transformed = [],
+                label = '',
+                value = '';
+              for (var key in obj) {
+                label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
+                if (obj[key] !== '') {
+                  value = obj[key];
+                  if (value == 1 || value == 0) {
+                    value = (value == 1) ? 'Yes' : 'No';
+                  }
+                  transformed.push({
+                    key: label,
+                    value: value
+                  });
+                }
+              }
+
+              return transformed;
+            }
+
+            function getSearchText(data) {
+              var searchText = '';
+              for (var i = 0; i < data.length; i++) {
+                searchText += ' ' + data[i].key + ' ' + data[i].value;
+              }
+
+              return searchText;
+            }
+
+            for (var key in content.data) {
+              if (content.data.hasOwnProperty(key) &&
+                key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
+
+                data = camelcaseToLabel(content.data[key]);
+                searchText = getSearchText(data);
+                title = key.split('/').pop();
+
+                title = titlelize(title);
+
+                if (!isSubComponent(key)) {
+                  hardwareData.push(Object.assign({
+                    path: key,
+                    title: title,
+                    selected: false,
+                    expanded: false,
+                    search_text: title.toLowerCase() + ' ' + searchText.toLowerCase(),
+                    sub_components: [],
+                    original_data: {
+                      key: key,
+                      value: content.data[key]
                     }
+                  }, {
+                    items: data
+                  }));
 
-                    if(content.data.hasOwnProperty('/xyz/openbmc_project/network/config') &&
-                      content.data['/xyz/openbmc_project/network/config'].hasOwnProperty('HostName')
-                      ){
-                      hostname = content.data['/xyz/openbmc_project/network/config'].HostName;
-                    }
+                  keyIndexMap[key] = hardwareData.length - 1;
+                }
+                else {
+                  var tempParts = key.split('/');
+                  tempParts.pop();
+                  tempParts = tempParts.join('/');
+                  componentIndex = keyIndexMap[tempParts];
+                  data = content.data[key];
+                  data.title = title;
+                  hardwareData[componentIndex].sub_components.push(data);
+                  hardwareData[componentIndex].search_text += ' ' + title.toLowerCase();
 
-                    if(content.data.hasOwnProperty('/xyz/openbmc_project/network/eth0') &&
-                      content.data['/xyz/openbmc_project/network/eth0'].hasOwnProperty('MACAddress')
-                      ){
-                      macAddress = content.data['/xyz/openbmc_project/network/eth0'].MACAddress;
-                    }
-
-                    deferred.resolve({
-                      data: content.data,
-                      hostname: hostname,
-                      mac_address: macAddress,
-                      formatted_data: parseNetworkData(content)
+                  // Sort the subcomponents alphanumeric so they are displayed on the
+                  // inventory page in order (e.g. core 0, core 1, core 2, ... core 12, core 13)
+                  hardwareData[componentIndex].sub_components.sort(function(a, b) {
+                    return a.title.localeCompare(b.title, 'en', {
+                      numeric: true
                     });
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-                return deferred.promise;
-              },
-              getLEDState: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/led/groups/enclosure_identify",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                    var json = JSON.stringify(response.data);
-                    var content = JSON.parse(json);
-                    deferred.resolve(content.data.Asserted);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-                return deferred.promise;
-              },
-              login: function(username, password, callback){
-                $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/login",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": [username, password]})
-                }).then(function(response){
-                  if(callback){
-                      callback(response.data);
-                  }
-                }, function(error){
-                  if(callback){
-                      if(error && error.status && error.status == 'error'){
-                        callback(error);
-                      }else{
-                        callback(error, true);
-                      }
-                  }
-                  console.log(error);
-                });
-              },
-              testPassword: function(username, password){
-                // Calls /login without the current session to verify the given password is correct
-                // ignore the interceptor logout on a bad password
-                DataService.ignoreHttpError = true;
-                return $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/login",
-                  headers: {
-                    'Accept': 'application/json',
-                    'Content-Type': 'application/json'
-                  },
-                  withCredentials: false,
-                  data: JSON.stringify({"data": [username, password]})
-                }).then(function(response){
-                  return response.data;
-                });
-              },
-              logout: function(callback){
-                $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/logout",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": []})
-                }).then(function(response){
-                  if(callback){
-                      callback(response.data);
-                  }
-                }, function(error){
-                  if(callback){
-                      callback(null, error);
-                  }
-                  console.log(error);
-                });
-              },
-              changePassword: function(user, newPassword){
-                var deferred = $q.defer();
-                $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/xyz/openbmc_project/user/" + user + "/action/SetPassword",
-                  headers: {
-                    'Accept': 'application/json',
-                    'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": [newPassword]}),
-                  responseType: 'arraybuffer'
-                }).then(function(response, status, headers){
-                  deferred.resolve({
-                    data: response,
-                    status: status,
-                    headers: headers
                   });
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-                return deferred.promise;
+                }
+              }
+            }
+
+            if (callback) {
+              callback(hardwareData, content.data);
+            }
+            else {
+              return {
+                data: hardwareData,
+                original_data: content.data
+              };
+            }
+          });
+        },
+        deleteLogs: function(logs) {
+          var defer = $q.defer();
+          var promises = [];
+
+          function finished() {
+            defer.resolve();
+          }
+
+          logs.forEach(function(item) {
+            promises.push($http({
+              method: 'POST',
+              url: DataService.getHost() + '/xyz/openbmc_project/logging/entry/' + item.Id + '/action/Delete',
+              headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json'
               },
-              chassisPowerOn: function(callback){
-                $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/host0",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": []})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      if(callback){
-                          return callback(content.data.CurrentPowerState);
-                      }
-                }, function(error){
-                  if(callback){
-                      callback(error);
-                  }else{
-                      console.log(error);
-                  }
-                });
+              withCredentials: true,
+              data: JSON.stringify({
+                'data': []
+              })
+            }));
+          });
+
+          $q.all(promises).then(finished);
+
+          return defer.promise;
+        },
+        resolveLogs: function(logs) {
+          var defer = $q.defer();
+          var promises = [];
+
+          function finished() {
+            defer.resolve();
+          }
+
+          logs.forEach(function(item) {
+            promises.push($http({
+              method: 'PUT',
+              url: DataService.getHost() + '/xyz/openbmc_project/logging/entry/' + item.Id + '/attr/Resolved',
+              headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json'
               },
-              chassisPowerOff: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": "xyz.openbmc_project.State.Chassis.Transition.Off"})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content.status);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-                return deferred.promise;
-              },
-              setLEDState: function(state, callback){
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": state})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      if(callback){
-                          return callback(content.status);
-                      }
-                }, function(error){
-                  if(callback){
-                      callback(error);
-                  }else{
-                      console.log(error);
-                  }
-                });
-              },
-              bmcReboot: function(callback){
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/bmc0/attr/RequestedBmcTransition",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": "xyz.openbmc_project.State.BMC.Transition.Reboot"})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      if(callback){
-                          return callback(content.status);
-                      }
-                }, function(error){
-                  if(callback){
-                      callback(error);
-                  }else{
-                      console.log(error);
-                  }
-                });
-              },
-              hostPowerOn: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/host0/attr/RequestedHostTransition",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": "xyz.openbmc_project.State.Host.Transition.On"})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content.status);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-                return deferred.promise;
-              },
-              hostPowerOff: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/host0/attr/RequestedHostTransition",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": "xyz.openbmc_project.State.Host.Transition.Off"})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content.status);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-                return deferred.promise;
-              },
-              hostReboot: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/host0/attr/RequestedHostTransition",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": "xyz.openbmc_project.State.Host.Transition.Reboot"})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content.status);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
+              withCredentials: true,
+              data: JSON.stringify({
+                'data': '1'
+              })
+            }));
+          });
 
-                return deferred.promise;
-              },
-              hostShutdown: function(callback){
-                $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/xyz/openbmc_project/state/host0",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": []})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      if(callback){
-                          return callback(content);
-                      }
-                }, function(error){
-                  if(callback){
-                      callback(error);
-                  }else{
-                      console.log(error);
-                  }
-                });
-              },
-              getLogs: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/logging/enumerate",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      var dataClone = JSON.parse(JSON.stringify(content.data));
-                      var data = [];
-                      var severityCode = '';
-                      var priority = '';
-                      var health = '';
-                      var relatedItems = [];
+          $q.all(promises).then(finished);
 
-                      for(var key in content.data){
-                        if(content.data.hasOwnProperty(key) && content.data[key].hasOwnProperty('Id')){
-                          var severityFlags = {low: false, medium: false, high: false};
-                          var healthFlags = {critical: false, warning: false, good: false};
-                          severityCode = content.data[key].Severity.split(".").pop();
-                          priority = Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
-                          severityFlags[priority.toLowerCase()] = true;
-                          health = Constants.SEVERITY_TO_HEALTH_MAP[severityCode];
-                          healthFlags[health.toLowerCase()] = true;
-                          relatedItems = [];
-                          content.data[key].associations.forEach(function(item){
-                            relatedItems.push(item[2]);
-                          });
+          return defer.promise;
+        },
+        getPowerConsumption: function() {
+          return $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/sensors/power/total_power',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
 
-                          data.push(Object.assign({
-                            path: key,
-                            copied: false,
-                            priority: priority,
-                            severity_code: severityCode,
-                            severity_flags: severityFlags,
-                            health_flags: healthFlags,
-                            additional_data: content.data[key].AdditionalData.join("\n"),
-                            type: content.data[key].Message,
-                            selected: false,
-                            search_text: ("#" + content.data[key].Id + " " + severityCode + " " + content.data[key].Severity + " " + content.data[key].AdditionalData.join(" ")).toLowerCase(),
-                            meta: false,
-                            confirm: false,
-                            related_items: relatedItems,
-                            data: {key: key, value: content.data[key]}
-                          }, content.data[key]));
-                        }
-                      }
-                      deferred.resolve({data: data, original: dataClone});
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
+            return getScaledValue(content.data.Value,
+                content.data.Scale) + ' ' +
+              Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
+          }, function(error) {
+            if ('Not Found' == error.statusText) {
+              return Constants.POWER_CONSUMPTION_TEXT.notavailable;
+            }
+            else {
+              throw error;
+            }
+          });
+        },
+        getPowerCap: function() {
+          return $http({
+            method: 'GET',
+            url: DataService.getHost() + '/xyz/openbmc_project/control/host0/power_cap',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true
+          }).then(function(response) {
+            var json = JSON.stringify(response.data);
+            var content = JSON.parse(json);
 
-                return deferred.promise;
-              },
-              getAllSensorStatus: function(callback){
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/sensors/enumerate",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      var dataClone = JSON.parse(JSON.stringify(content.data));
-                      var sensorData = [];
-                      var severity = {};
-                      var title = "";
-                      var tempKeyParts = [];
-                      var order = 0;
-                      var customOrder = 0;
+            return (false == content.data.PowerCapEnable) ?
+              Constants.POWER_CAP_TEXT.disabled :
+              content.data.PowerCap + ' ' + Constants.POWER_CAP_TEXT.unit;
+          });
+        },
+        setHostname: function(hostname) {
+          return $http({
+            method: 'PUT',
+            url: DataService.getHost() + '/xyz/openbmc_project/network/config/attr/HostName',
+            headers: {
+              'Accept': 'application/json',
+              'Content-Type': 'application/json'
+            },
+            withCredentials: true,
+            data: JSON.stringify({
+              'data': hostname
+            })
+          }).then(function(response) {
+            return response.data;
+          });
+        },
+      };
+      return SERVICE;
+    }]);
 
-                      function getSensorStatus(reading){
-                        var severityFlags = {critical: false, warning: false, normal: false}, severityText = '', order = 0;
-
-                        if(reading.hasOwnProperty('CriticalLow') &&
-                          reading.Value < reading.CriticalLow
-                          ){
-                          severityFlags.critical = true;
-                          severityText = 'critical';
-                          order = 2;
-                        }else if(reading.hasOwnProperty('CriticalHigh') &&
-                          reading.Value > reading.CriticalHigh
-                          ){
-                          severityFlags.critical = true;
-                          severityText = 'critical';
-                          order = 2;
-                        }else if(reading.hasOwnProperty('CriticalLow') &&
-                          reading.hasOwnProperty('WarningLow') &&
-                          reading.Value >= reading.CriticalLow && reading.Value <= reading.WarningLow){
-                          severityFlags.warning = true;
-                          severityText = 'warning';
-                          order = 1;
-                        }else if(reading.hasOwnProperty('WarningHigh') &&
-                          reading.hasOwnProperty('CriticalHigh') &&
-                          reading.Value >= reading.WarningHigh && reading.Value <= reading.CriticalHigh){
-                          severityFlags.warning = true;
-                          severityText = 'warning';
-                          order = 1;
-                        }else{
-                          severityFlags.normal = true;
-                          severityText = 'normal';
-                        }
-                        return { flags: severityFlags, severityText: severityText, order: order};
-                      }
-
-                      for(var key in content.data){
-                        if(content.data.hasOwnProperty(key) && content.data[key].hasOwnProperty('Unit')){
-
-                          severity = getSensorStatus(content.data[key]);
-
-                          if(!content.data[key].hasOwnProperty('CriticalLow')){
-                            content.data[key].CriticalLow = "--";
-                            content.data[key].CriticalHigh = "--";
-                          }
-
-                          if(!content.data[key].hasOwnProperty('WarningLow')){
-                            content.data[key].WarningLow = "--";
-                            content.data[key].WarningHigh = "--";
-                          }
-
-                          tempKeyParts = key.split("/");
-                          title = tempKeyParts.pop();
-                          title = tempKeyParts.pop() + '_' + title;
-                          title = title.split("_").map(function(item){
-                             return item.toLowerCase().charAt(0).toUpperCase() + item.slice(1);
-                          }).reduce(function(prev, el){
-                            return prev + " " + el;
-                          });
-
-                          content.data[key].Value = getScaledValue(content.data[key].Value, content.data[key].Scale);
-                          content.data[key].CriticalLow = getScaledValue(content.data[key].CriticalLow, content.data[key].Scale);
-                          content.data[key].CriticalHigh = getScaledValue(content.data[key].CriticalHigh, content.data[key].Scale);
-                          content.data[key].WarningLow = getScaledValue(content.data[key].WarningLow, content.data[key].Scale);
-                          content.data[key].WarningHigh = getScaledValue(content.data[key].WarningHigh, content.data[key].Scale);
-                          if(Constants.SENSOR_SORT_ORDER.indexOf(content.data[key].Unit) > -1){
-                            customOrder = Constants.SENSOR_SORT_ORDER.indexOf(content.data[key].Unit);
-                          }else{
-                            customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
-                          }
-
-                          sensorData.push(Object.assign({
-                            path: key,
-                            selected: false,
-                            confirm: false,
-                            copied: false,
-                            title: title,
-                            unit: Constants.SENSOR_UNIT_MAP[content.data[key].Unit],
-                            severity_flags: severity.flags,
-                            status: severity.severityText,
-                            order: severity.order,
-                            custom_order: customOrder,
-                            search_text: (title + " " + content.data[key].Value + " " +
-                               Constants.SENSOR_UNIT_MAP[content.data[key].Unit] + " " +
-                               severity.severityText + " " +
-                               content.data[key].CriticalLow + " " +
-                               content.data[key].CriticalHigh + " " +
-                               content.data[key].WarningLow + " " +
-                               content.data[key].WarningHigh + " "
-                               ).toLowerCase(),
-                            original_data: {key: key, value: content.data[key]}
-                          }, content.data[key]));
-                        }
-                      }
-
-                      callback(sensorData, dataClone);
-                }, function(error){
-                  console.log(error);
-                });
-              },
-              getActivation: function(imageId){
-                return $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/software/" + imageId + "/attr/Activation",
-                  headers: {
-                    'Accept': 'application/json',
-                    'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                  return response.data;
-                });
-              },
-              getFirmwares: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/software/enumerate",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      var data = [];
-                      var activationStatus = "";
-                      var isExtended = false;
-                      var bmcActiveVersion = "";
-                      var hostActiveVersion = "";
-                      var imageType = "";
-                      var extendedVersions = [];
-                      var functionalImages = [];
-
-                      function getFormatedExtendedVersions(extendedVersion){
-                        var versions = [];
-                        extendedVersion = extendedVersion.split(",");
-
-                        extendedVersion.forEach(function(item){
-                          var parts = item.split("-");
-                          var numberIndex = 0;
-                          for(var i = 0; i < parts.length; i++){
-                            if(/[0-9]/.test(parts[i])){
-                              numberIndex = i;
-                              break;
-                            }
-                          }
-                          var titlePart = parts.splice(0, numberIndex);
-                          titlePart = titlePart.join("");
-                          titlePart = titlePart[0].toUpperCase() + titlePart.substr(1, titlePart.length);
-                          var versionPart = parts.join("-");
-                          versions.push({
-                            title: titlePart,
-                            version: versionPart
-                          });
-                        });
-
-                        return versions;
-                      }
-
-                      // Get the list of functional images so we can compare
-                      // later if an image is functional
-                      if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH])
-                      {
-                        functionalImages = content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH].endpoints;
-                      }
-                      for(var key in content.data){
-                        if(content.data.hasOwnProperty(key) && content.data[key].hasOwnProperty('Version')){
-                          // If the image is "Functional" use that for the
-                          // activation status, else use the value of "Activation"
-                          // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
-                          activationStatus = content.data[key].Activation.split(".").pop();
-                          if (functionalImages.includes(key))
-                          {
-                            activationStatus = "Functional";
-                          }
-
-                          imageType = content.data[key].Purpose.split(".").pop();
-                          isExtended = content.data[key].hasOwnProperty('ExtendedVersion') && content.data[key].ExtendedVersion != "";
-                          if(isExtended){
-                            extendedVersions = getFormatedExtendedVersions(content.data[key].ExtendedVersion);
-                          }
-                          data.push(Object.assign({
-                            path: key,
-                            activationStatus: activationStatus,
-                            imageId: key.split("/").pop(),
-                            imageType: imageType,
-                            isExtended: isExtended,
-                            extended: {
-                              show: false,
-                              versions: extendedVersions
-                            },
-                            data: {key: key, value: content.data[key]}
-                          }, content.data[key]));
-
-                          if(activationStatus == 'Functional' && imageType == 'BMC'){
-                            bmcActiveVersion = content.data[key].Version;
-                          }
-
-                          if(activationStatus == 'Functional' && imageType == 'Host'){
-                            hostActiveVersion = content.data[key].Version;
-                          }
-                        }
-                      }
-
-                      deferred.resolve({
-                          data: data,
-                          bmcActiveVersion: bmcActiveVersion,
-                          hostActiveVersion: hostActiveVersion
-                      });
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-
-                return deferred.promise;
-              },
-              changePriority: function(imageId, priority){
-                var deferred = $q.defer();
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/software/" + imageId + "/attr/Priority",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": priority})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-
-                return deferred.promise;
-              },
-              deleteImage: function(imageId){
-                var deferred = $q.defer();
-                $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/xyz/openbmc_project/software/" + imageId + "/action/Delete",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": []})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-
-                return deferred.promise;
-              },
-              activateImage: function(imageId){
-                var deferred = $q.defer();
-                $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/software/" + imageId + "/attr/RequestedActivation",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": Constants.FIRMWARE.ACTIVATE_FIRMWARE})
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      deferred.resolve(content);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-
-                return deferred.promise;
-              },
-              uploadImage: function(file){
-                return $http({
-                  method: 'POST',
-                  timeout: 5 * 60 * 1000,
-                  url: DataService.getHost() + "/upload/image",
-                  headers: {
-                    'Content-Type': 'application/octet-stream'
-                  },
-                  withCredentials: true,
-                  data: file
-                }).then(function(response){
-                  return response.data;
-                });
-              },
-              downloadImage: function(host, filename){
-                return $http({
-                  method: 'POST',
-                  url: DataService.getHost() + "/xyz/openbmc_project/software/action/DownloadViaTFTP",
-                  headers: {
-                    'Accept': 'application/json',
-                    'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": [filename, host]}),
-                  responseType: 'arraybuffer'
-                }).then(function(response){
-                  return response.data;
-                });
-              },
-              getBMCEthernetInfo: function(){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc/ethernet",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                    var json = JSON.stringify(response.data);
-                    var content = JSON.parse(json);
-                    deferred.resolve(content.data);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-
-                return deferred.promise;
-              },
-              getBMCInfo: function(callback){
-                var deferred = $q.defer();
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                    var json = JSON.stringify(response.data);
-                    var content = JSON.parse(json);
-                    deferred.resolve(content.data);
-                }, function(error){
-                  console.log(error);
-                  deferred.reject(error);
-                });
-                return deferred.promise;
-              },
-              getServerInfo: function(){
-                // TODO: openbmc/openbmc#3117 Need a way via REST to get
-                // interfaces so we can get the system object(s) by the looking
-                // for the system interface.
-                return $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/inventory/system",
-                  headers: {
-                    'Accept': 'application/json',
-                    'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                  return response.data;
-                });
-              },
-              getBMCTime: function(){
-                return $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/time/bmc",
-                  headers: {
-                    'Accept': 'application/json',
-                    'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                  return response.data;
-                });
-              },
-              getHardwares: function(callback){
-                $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/inventory/enumerate",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                      var json = JSON.stringify(response.data);
-                      var content = JSON.parse(json);
-                      var hardwareData = [];
-                      var keyIndexMap = {};
-                      var title = "";
-                      var data = [];
-                      var searchText = "";
-                      var componentIndex = -1;
-                      var tempParts = [];
-
-
-                      function isSubComponent(key){
-
-                        for(var i = 0; i < Constants.HARDWARE.parent_components.length; i++){
-                          if(key.split(Constants.HARDWARE.parent_components[i]).length == 2) return true;
-                        }
-
-                        return false;
-                      }
-
-                      function titlelize(title){
-                        title = title.replace(/([A-Z0-9]+)/g, " $1").replace(/^\s+/, "");
-                        for(var i = 0; i < Constants.HARDWARE.uppercase_titles.length; i++){
-                          if(title.toLowerCase().indexOf((Constants.HARDWARE.uppercase_titles[i] + " ")) > -1){
-                            return title.toUpperCase();
-                          }
-                        }
-
-                        return title;
-                      }
-
-                      function camelcaseToLabel(obj){
-                        var transformed = [], label = "", value = "";
-                        for(var key in obj){
-                          label = key.replace(/([A-Z0-9]+)/g, " $1").replace(/^\s+/, "");
-                          if(obj[key] !== ""){
-                            value = obj[key];
-                            if(value == 1 || value == 0){
-                              value = (value == 1) ? 'Yes' : 'No';
-                            }
-                            transformed.push({key:label, value: value});
-                          }
-                        }
-
-                        return transformed;
-                      }
-
-                      function getSearchText(data){
-                        var searchText = "";
-                        for(var i = 0; i < data.length; i++){
-                          searchText += " " + data[i].key + " " + data[i].value;
-                        }
-
-                        return searchText;
-                      }
-
-                      for(var key in content.data){
-                        if(content.data.hasOwnProperty(key) &&
-                           key.indexOf(Constants.HARDWARE.component_key_filter) == 0){
-
-                          data = camelcaseToLabel(content.data[key]);
-                          searchText = getSearchText(data);
-                          title = key.split("/").pop();
-
-                          title = titlelize(title);
-
-                          if(!isSubComponent(key)){
-                              hardwareData.push(Object.assign({
-                                path: key,
-                                title: title,
-                                selected: false,
-                                expanded: false,
-                                search_text: title.toLowerCase() + " " + searchText.toLowerCase(),
-                                sub_components: [],
-                                original_data: {key: key, value: content.data[key]}
-                              }, {items: data}));
-
-                              keyIndexMap[key] = hardwareData.length - 1;
-                          }else{
-                            var tempParts = key.split("/");
-                            tempParts.pop();
-                            tempParts = tempParts.join("/");
-                            componentIndex = keyIndexMap[tempParts];
-                            data = content.data[key];
-                            data.title = title;
-                            hardwareData[componentIndex].sub_components.push(data);
-                            hardwareData[componentIndex].search_text += " " + title.toLowerCase();
-
-                            // Sort the subcomponents alphanumeric so they are displayed on the
-                            // inventory page in order (e.g. core 0, core 1, core 2, ... core 12, core 13)
-                            hardwareData[componentIndex].sub_components.sort(function (a, b) {
-                                return a.title.localeCompare(b.title, 'en', { numeric: true });
-                            });
-                          }
-                      }
-                    }
-
-                    if(callback){
-                       callback(hardwareData, content.data);
-                    }else{
-                       return { data: hardwareData, original_data: content.data};
-                    }
-                });
-              },
-              deleteLogs: function(logs) {
-                  var defer = $q.defer();
-                  var promises = [];
-
-                  function finished(){
-                      defer.resolve();
-                  }
-
-                  logs.forEach(function(item){
-                    promises.push($http({
-                                      method: 'POST',
-                                      url: DataService.getHost() + "/xyz/openbmc_project/logging/entry/"+item.Id+"/action/Delete",
-                                      headers: {
-                                          'Accept': 'application/json',
-                                          'Content-Type': 'application/json'
-                                      },
-                                      withCredentials: true,
-                                      data: JSON.stringify({"data": []})
-                                 }));
-                  });
-
-                  $q.all(promises).then(finished);
-
-                  return defer.promise;
-              },
-              resolveLogs: function(logs) {
-                  var defer = $q.defer();
-                  var promises = [];
-
-                  function finished(){
-                      defer.resolve();
-                  }
-
-                  logs.forEach(function(item){
-                    promises.push($http({
-                                      method: 'PUT',
-                                      url: DataService.getHost() + "/xyz/openbmc_project/logging/entry/"+item.Id+"/attr/Resolved",
-                                      headers: {
-                                          'Accept': 'application/json',
-                                          'Content-Type': 'application/json'
-                                      },
-                                      withCredentials: true,
-                                      data: JSON.stringify({"data": "1"})
-                                 }));
-                  });
-
-                  $q.all(promises).then(finished);
-
-                  return defer.promise;
-              },
-              getPowerConsumption: function(){
-                return $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/sensors/power/total_power",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                    var json = JSON.stringify(response.data);
-                    var content = JSON.parse(json);
-
-                    return getScaledValue(content.data.Value,
-                                          content.data.Scale) + ' ' +
-                      Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
-                }, function(error){
-                  if ('Not Found' == error.statusText) {
-                    return Constants.POWER_CONSUMPTION_TEXT.notavailable;
-                  } else {
-                    throw error;
-                  }
-                });
-              },
-              getPowerCap: function(){
-                return $http({
-                  method: 'GET',
-                  url: DataService.getHost() + "/xyz/openbmc_project/control/host0/power_cap",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true
-                }).then(function(response){
-                    var json = JSON.stringify(response.data);
-                    var content = JSON.parse(json);
-
-                    return (false == content.data.PowerCapEnable) ?
-                        Constants.POWER_CAP_TEXT.disabled :
-                        content.data.PowerCap + ' ' + Constants.POWER_CAP_TEXT.unit;
-                });
-              },
-              setHostname: function(hostname){
-                return $http({
-                  method: 'PUT',
-                  url: DataService.getHost() + "/xyz/openbmc_project/network/config/attr/HostName",
-                  headers: {
-                      'Accept': 'application/json',
-                      'Content-Type': 'application/json'
-                  },
-                  withCredentials: true,
-                  data: JSON.stringify({"data": hostname})
-                }).then(function(response){
-                    return response.data;
-                });
-              },
-          };
-          return SERVICE;
-        }]);
-
-        })(window.angular);
+})(window.angular);
diff --git a/app/common/services/apiInterceptor.js b/app/common/services/apiInterceptor.js
index de344cd..b3f2ff4 100644
--- a/app/common/services/apiInterceptor.js
+++ b/app/common/services/apiInterceptor.js
@@ -7,60 +7,61 @@
 
  */
 
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.services')
-        .service('apiInterceptor', ['$q', '$rootScope', 'dataService', function($q, $rootScope, dataService){
-            return {
-                'request': function(config){
-                    dataService.loading = true;
-                    // If caller has not defined a timeout, set to default of 20s
-                    if (config.timeout == null){
-                        config.timeout = 20000;
-                    }
-                    return config;
-                },
-                'response': function(response){
-                    dataService.loading = false;
+  angular
+    .module('app.common.services')
+    .service('apiInterceptor', ['$q', '$rootScope', 'dataService', function($q, $rootScope, dataService) {
+      return {
+        'request': function(config) {
+          dataService.loading = true;
+          // If caller has not defined a timeout, set to default of 20s
+          if (config.timeout == null) {
+            config.timeout = 20000;
+          }
+          return config;
+        },
+        'response': function(response) {
+          dataService.loading = false;
 
-                    //not interested in template requests
-                    if(!/^https?\:/i.test(response.config.url)){
-                        return response;
-                    }
+          //not interested in template requests
+          if (!/^https?\:/i.test(response.config.url)) {
+            return response;
+          }
 
-                    dataService.last_updated = new Date();
-                    if(!response){
-                        dataService.server_unreachable = true;
-                    }else{
-                        dataService.server_unreachable = false;
-                    }
+          dataService.last_updated = new Date();
+          if (!response) {
+            dataService.server_unreachable = true;
+          }
+          else {
+            dataService.server_unreachable = false;
+          }
 
-                    if(response && response.status == 'error' &&
-                       dataService.path != '/login'){
-                        $rootScope.$emit('timedout-user', {});
-                    }
+          if (response && response.status == 'error' &&
+            dataService.path != '/login') {
+            $rootScope.$emit('timedout-user', {});
+          }
 
-                    return response;
-                },
-                'responseError': function(rejection){
-                    if (dataService.ignoreHttpError === false)
-                    {
-                        // If unauthorized, log out
-                        if (rejection.status == 401){
-                            if (dataService.path != '/login'){
-                                $rootScope.$emit('timedout-user', {});
-                            }
-                        } else if (rejection.status == -1){
-                            dataService.server_unreachable = true;
-                        }
+          return response;
+        },
+        'responseError': function(rejection) {
+          if (dataService.ignoreHttpError === false) {
+            // If unauthorized, log out
+            if (rejection.status == 401) {
+              if (dataService.path != '/login') {
+                $rootScope.$emit('timedout-user', {});
+              }
+            }
+            else if (rejection.status == -1) {
+              dataService.server_unreachable = true;
+            }
 
-                        dataService.loading = false;
-                    }
-                    return $q.reject(rejection);
-                }
-            };
-        }]);
+            dataService.loading = false;
+          }
+          return $q.reject(rejection);
+        }
+      };
+    }]);
 
 })(window.angular);
diff --git a/app/common/services/constants.js b/app/common/services/constants.js
index 8b51341..d749ea8 100644
--- a/app/common/services/constants.js
+++ b/app/common/services/constants.js
@@ -7,161 +7,161 @@
 
  */
 
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.services', [])
-        .service('Constants', function () {
-            return {
-                API_CREDENTIALS: {
-                    host_storage_key: 'API_HOST_KEY',
-                    default_protocol: 'https'
-                },
-                API_RESPONSE: {
-                    ERROR_STATUS: 'error',
-                    ERROR_MESSAGE: '401 Unauthorized',
-                    SUCCESS_STATUS: 'ok',
-                    SUCCESS_MESSAGE: '200 OK'
-                },
-                CHASSIS_POWER_STATE: {
-                    on: 'On',
-                    on_code: 'xyz.openbmc_project.State.Chassis.PowerState.On',
-                    off: 'Off',
-                    off_code: 'xyz.openbmc_project.State.Chassis.PowerState.Off'
-                },
-                HOST_STATE_TEXT: {
-                    on: 'Running',
-                    on_code: 'xyz.openbmc_project.State.Host.HostState.Running',
-                    off: 'Off',
-                    off_code: 'xyz.openbmc_project.State.Host.HostState.Off',
-                    error: 'Quiesced',
-                    error_code: 'xyz.openbmc_project.State.Host.HostState.Quiesced',
-                    unreachable: 'Unreachable'
-                },
-                HOST_STATE: {
-                    on: 1,
-                    off: -1,
-                    error: 0,
-                    unreachable: -2
-                },
-                LED_STATE: {
-                    on: true,
-                    off: false
-                },
-                LED_STATE_TEXT: {
-                    on: 'on',
-                    off: 'off'
-                },
-                SEVERITY_TO_HEALTH_MAP:{
-                    Emergency: 'Critical',
-                    Alert: 'Critical',
-                    Critical: 'Critical',
-                    Error: 'Warning',
-                    Warning: 'Warning',
-                    Notice: 'Good',
-                    Debug: 'Good',
-                    Informational: 'Good'
-                },
-                SEVERITY_TO_PRIORITY_MAP:{
-                    Emergency: 'High',
-                    Alert: 'High',
-                    Critical: 'High',
-                    Error: 'High',
-                    Warning: 'Medium',
-                    Notice: 'Low',
-                    Debug: 'Low',
-                    Informational: 'Low'
-                },
-                PAGINATION: {
-                    LOG_ITEMS_PER_PAGE: 25
-                },
-                HARDWARE: {
-                  component_key_filter: '/xyz/openbmc_project/inventory/system',
-                  parent_components: [
-                   /xyz\/openbmc_project\/inventory\/system\/chassis\/motherboard\/cpu\d+\//
-                  ],
-                  uppercase_titles: [
-                   'cpu', 'dimm'
-                  ]
-                },
-                SENSOR_UNIT_MAP: {
-                  'xyz.openbmc_project.Sensor.Value.Unit.RPMS': 'rpms',
-                  'xyz.openbmc_project.Sensor.Value.Unit.DegreesC': 'C',
-                  'xyz.openbmc_project.Sensor.Value.Unit.Volts': 'volts',
-                  'xyz.openbmc_project.Sensor.Value.Unit.Meters': 'meters',
-                  'xyz.openbmc_project.Sensor.Value.Unit.Watts': 'watts',
-                  'xyz.openbmc_project.Sensor.Value.Unit.Amperes': 'amperes',
-                  'xyz.openbmc_project.Sensor.Value.Unit.Joules': 'joules'
-                },
-                SERVER_HEALTH: {
-                    critical: 'Critical',
-                    warning: 'Warning',
-                    good: 'Good',
-                    unknown: 'Unknown'
-                },
-                SENSOR_SORT_ORDER: [
-                   'xyz.openbmc_project.Sensor.Value.Unit.DegreesC',
-                   'xyz.openbmc_project.Sensor.Value.Unit.RPMS',
-                   'xyz.openbmc_project.Sensor.Value.Unit.Meters',
-                   'xyz.openbmc_project.Sensor.Value.Unit.Volts',
-                   'xyz.openbmc_project.Sensor.Value.Unit.Amperes',
-                   'xyz.openbmc_project.Sensor.Value.Unit.Joules',
-                   'xyz.openbmc_project.Sensor.Value.Unit.Meters'
-                ],
-                SENSOR_SORT_ORDER_DEFAULT: 8,
-                FIRMWARE: {
-                    ACTIVATE_FIRMWARE: 'xyz.openbmc_project.Software.Activation.RequestedActivations.Active',
-                    FUNCTIONAL_OBJPATH: '/xyz/openbmc_project/software/functional'
-                },
-                POLL_INTERVALS: {
-                    ACTIVATION: 5000,
-                    DOWNLOAD_IMAGE: 5000,
-                    POWER_OP: 5000,
-                },
-                TIMEOUT: {
-                    ACTIVATION: 1000 * 60 * 10, // 10 mins
-                    DOWNLOAD_IMAGE: 1000 * 60 * 2, // 2 mins
-                    CHASSIS_OFF: 1000 * 60 * 5, // 5 mins
-                    HOST_ON: 1000 * 60 * 5, // 5 mins
-                    HOST_OFF: 1000 * 60 * 5, // 5 mins
-                },
-                MESSAGES: {
-                    POLL: {
-                        CHASSIS_OFF_TIMEOUT: 'Time out. Chassis did not reach power off state in allotted time.',
-                        HOST_ON_TIMEOUT: 'Time out. System did not reach Running state in allotted time.',
-                        HOST_OFF_TIMEOUT: 'Time out. System did not reach Off state in allotted time.',
-                        HOST_QUIESCED: 'System is in Error state.',
-                        DOWNLOAD_IMAGE_TIMEOUT: 'Time out. Did not download image in allotted time.',
-                    },
-                    POWER_OP: {
-                        POWER_ON_FAILED: 'Power On Failed',
-                        WARM_REBOOT_FAILED: 'Warm Reboot Failed',
-                        COLD_REBOOT_FAILED: 'Cold Reboot Failed',
-                        ORDERLY_SHUTDOWN_FAILED: 'Orderly Shutdown Failed',
-                        IMMEDIATE_SHUTDOWN_FAILED: 'Immediate Shutdown Failed',
-                    },
-                    SENSOR: {
-                        NO_SENSOR_DATA: 'There are no sensors found.',
-                        CRITICAL_NO_SENSOR_DATA: 'There are no sensors in Critical state.',
-                        WARNING_NO_SENSOR_DATA: 'There are no sensors in Warning state.',
-                        NORMAL_NO_SENSOR_DATA: 'There are no sensors in Normal state.'
-                    },
-                    ERROR_MODAL: {
-                        TITLE: 'Unexpected error',
-                        DESCRIPTION: 'Oops! An unexpected error occurred. Record specific details of the issue, then contact your company support services.'
-                    },
-                    ERROR_MESSAGE_DESC_TEMPLATE: '{{status}} - {{description}}',
-                },
-                POWER_CAP_TEXT: {
-                    unit: 'W',
-                    disabled: 'Not Enabled'
-                },
-                POWER_CONSUMPTION_TEXT: {
-                    'xyz.openbmc_project.Sensor.Value.Unit.Watts': 'W',
-                    notavailable: 'Not Available'
-                },
-            };
-        });
+  angular
+    .module('app.common.services', [])
+    .service('Constants', function() {
+      return {
+        API_CREDENTIALS: {
+          host_storage_key: 'API_HOST_KEY',
+          default_protocol: 'https'
+        },
+        API_RESPONSE: {
+          ERROR_STATUS: 'error',
+          ERROR_MESSAGE: '401 Unauthorized',
+          SUCCESS_STATUS: 'ok',
+          SUCCESS_MESSAGE: '200 OK'
+        },
+        CHASSIS_POWER_STATE: {
+          on: 'On',
+          on_code: 'xyz.openbmc_project.State.Chassis.PowerState.On',
+          off: 'Off',
+          off_code: 'xyz.openbmc_project.State.Chassis.PowerState.Off'
+        },
+        HOST_STATE_TEXT: {
+          on: 'Running',
+          on_code: 'xyz.openbmc_project.State.Host.HostState.Running',
+          off: 'Off',
+          off_code: 'xyz.openbmc_project.State.Host.HostState.Off',
+          error: 'Quiesced',
+          error_code: 'xyz.openbmc_project.State.Host.HostState.Quiesced',
+          unreachable: 'Unreachable'
+        },
+        HOST_STATE: {
+          on: 1,
+          off: -1,
+          error: 0,
+          unreachable: -2
+        },
+        LED_STATE: {
+          on: true,
+          off: false
+        },
+        LED_STATE_TEXT: {
+          on: 'on',
+          off: 'off'
+        },
+        SEVERITY_TO_HEALTH_MAP: {
+          Emergency: 'Critical',
+          Alert: 'Critical',
+          Critical: 'Critical',
+          Error: 'Warning',
+          Warning: 'Warning',
+          Notice: 'Good',
+          Debug: 'Good',
+          Informational: 'Good'
+        },
+        SEVERITY_TO_PRIORITY_MAP: {
+          Emergency: 'High',
+          Alert: 'High',
+          Critical: 'High',
+          Error: 'High',
+          Warning: 'Medium',
+          Notice: 'Low',
+          Debug: 'Low',
+          Informational: 'Low'
+        },
+        PAGINATION: {
+          LOG_ITEMS_PER_PAGE: 25
+        },
+        HARDWARE: {
+          component_key_filter: '/xyz/openbmc_project/inventory/system',
+          parent_components: [
+            /xyz\/openbmc_project\/inventory\/system\/chassis\/motherboard\/cpu\d+\//
+          ],
+          uppercase_titles: [
+            'cpu', 'dimm'
+          ]
+        },
+        SENSOR_UNIT_MAP: {
+          'xyz.openbmc_project.Sensor.Value.Unit.RPMS': 'rpms',
+          'xyz.openbmc_project.Sensor.Value.Unit.DegreesC': 'C',
+          'xyz.openbmc_project.Sensor.Value.Unit.Volts': 'volts',
+          'xyz.openbmc_project.Sensor.Value.Unit.Meters': 'meters',
+          'xyz.openbmc_project.Sensor.Value.Unit.Watts': 'watts',
+          'xyz.openbmc_project.Sensor.Value.Unit.Amperes': 'amperes',
+          'xyz.openbmc_project.Sensor.Value.Unit.Joules': 'joules'
+        },
+        SERVER_HEALTH: {
+          critical: 'Critical',
+          warning: 'Warning',
+          good: 'Good',
+          unknown: 'Unknown'
+        },
+        SENSOR_SORT_ORDER: [
+          'xyz.openbmc_project.Sensor.Value.Unit.DegreesC',
+          'xyz.openbmc_project.Sensor.Value.Unit.RPMS',
+          'xyz.openbmc_project.Sensor.Value.Unit.Meters',
+          'xyz.openbmc_project.Sensor.Value.Unit.Volts',
+          'xyz.openbmc_project.Sensor.Value.Unit.Amperes',
+          'xyz.openbmc_project.Sensor.Value.Unit.Joules',
+          'xyz.openbmc_project.Sensor.Value.Unit.Meters'
+        ],
+        SENSOR_SORT_ORDER_DEFAULT: 8,
+        FIRMWARE: {
+          ACTIVATE_FIRMWARE: 'xyz.openbmc_project.Software.Activation.RequestedActivations.Active',
+          FUNCTIONAL_OBJPATH: '/xyz/openbmc_project/software/functional'
+        },
+        POLL_INTERVALS: {
+          ACTIVATION: 5000,
+          DOWNLOAD_IMAGE: 5000,
+          POWER_OP: 5000,
+        },
+        TIMEOUT: {
+          ACTIVATION: 1000 * 60 * 10, // 10 mins
+          DOWNLOAD_IMAGE: 1000 * 60 * 2, // 2 mins
+          CHASSIS_OFF: 1000 * 60 * 5, // 5 mins
+          HOST_ON: 1000 * 60 * 5, // 5 mins
+          HOST_OFF: 1000 * 60 * 5, // 5 mins
+        },
+        MESSAGES: {
+          POLL: {
+            CHASSIS_OFF_TIMEOUT: 'Time out. Chassis did not reach power off state in allotted time.',
+            HOST_ON_TIMEOUT: 'Time out. System did not reach Running state in allotted time.',
+            HOST_OFF_TIMEOUT: 'Time out. System did not reach Off state in allotted time.',
+            HOST_QUIESCED: 'System is in Error state.',
+            DOWNLOAD_IMAGE_TIMEOUT: 'Time out. Did not download image in allotted time.',
+          },
+          POWER_OP: {
+            POWER_ON_FAILED: 'Power On Failed',
+            WARM_REBOOT_FAILED: 'Warm Reboot Failed',
+            COLD_REBOOT_FAILED: 'Cold Reboot Failed',
+            ORDERLY_SHUTDOWN_FAILED: 'Orderly Shutdown Failed',
+            IMMEDIATE_SHUTDOWN_FAILED: 'Immediate Shutdown Failed',
+          },
+          SENSOR: {
+            NO_SENSOR_DATA: 'There are no sensors found.',
+            CRITICAL_NO_SENSOR_DATA: 'There are no sensors in Critical state.',
+            WARNING_NO_SENSOR_DATA: 'There are no sensors in Warning state.',
+            NORMAL_NO_SENSOR_DATA: 'There are no sensors in Normal state.'
+          },
+          ERROR_MODAL: {
+            TITLE: 'Unexpected error',
+            DESCRIPTION: 'Oops! An unexpected error occurred. Record specific details of the issue, then contact your company support services.'
+          },
+          ERROR_MESSAGE_DESC_TEMPLATE: '{{status}} - {{description}}',
+        },
+        POWER_CAP_TEXT: {
+          unit: 'W',
+          disabled: 'Not Enabled'
+        },
+        POWER_CONSUMPTION_TEXT: {
+          'xyz.openbmc_project.Sensor.Value.Unit.Watts': 'W',
+          notavailable: 'Not Available'
+        },
+      };
+    });
 
 })(window.angular);
diff --git a/app/common/services/dataService.js b/app/common/services/dataService.js
index d39e757..79a3a0e 100644
--- a/app/common/services/dataService.js
+++ b/app/common/services/dataService.js
@@ -7,141 +7,144 @@
 
  */
 
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.services')
-        .service('dataService', ['Constants', function (Constants) {
-            this.server_health = Constants.SERVER_HEALTH.unknown;
-            this.server_state = 'Unreachable';
-            this.server_status = -2;
-            this.chassis_state = 'On';
-            this.LED_state = Constants.LED_STATE_TEXT.off;
-            this.last_updated = new Date();
+  angular
+    .module('app.common.services')
+    .service('dataService', ['Constants', function(Constants) {
+      this.server_health = Constants.SERVER_HEALTH.unknown;
+      this.server_state = 'Unreachable';
+      this.server_status = -2;
+      this.chassis_state = 'On';
+      this.LED_state = Constants.LED_STATE_TEXT.off;
+      this.last_updated = new Date();
 
-            this.loading = false;
-            this.server_unreachable = false;
-            this.loading_message = "";
-            this.showNavigation = false;
-            this.bodyStyle = {};
-            this.path = '';
-            this.sensorData = [];
+      this.loading = false;
+      this.server_unreachable = false;
+      this.loading_message = '';
+      this.showNavigation = false;
+      this.bodyStyle = {};
+      this.path = '';
+      this.sensorData = [];
 
-            this.hostname = "";
-            this.mac_address = "";
-            this.remote_window_active = false;
+      this.hostname = '';
+      this.mac_address = '';
+      this.remote_window_active = false;
 
-            this.displayErrorModal = false;
-            this.errorModalDetails = {};
+      this.displayErrorModal = false;
+      this.errorModalDetails = {};
 
-            this.ignoreHttpError = false;
-            this.getServerId = function(){
-                 return this.host.replace(/^https?\:\/\//ig,"");
-            }
+      this.ignoreHttpError = false;
+      this.getServerId = function() {
+        return this.host.replace(/^https?\:\/\//ig, '');
+      };
 
-            this.reloadServerId = function(){
-                this.server_id = this.getServerId();
-            }
+      this.reloadServerId = function() {
+        this.server_id = this.getServerId();
+      };
 
-            this.getHost = function(){
-                if(sessionStorage.getItem(Constants.API_CREDENTIALS.host_storage_key) !== null){
-                    return sessionStorage.getItem(Constants.API_CREDENTIALS.host_storage_key);
-                }else{
-                    return Constants.API_CREDENTIALS.default_protocol + "://" +
-                           window.location.hostname +
-                           (window.location.port ? ":" + window.location.port : "");
-                }
-            }
+      this.getHost = function() {
+        if (sessionStorage.getItem(Constants.API_CREDENTIALS.host_storage_key) !== null) {
+          return sessionStorage.getItem(Constants.API_CREDENTIALS.host_storage_key);
+        }
+        else {
+          return Constants.API_CREDENTIALS.default_protocol + '://' +
+            window.location.hostname +
+            (window.location.port ? ':' + window.location.port : '');
+        }
+      };
 
-            this.setHost = function(hostWithPort){
-                hostWithPort = hostWithPort.replace(/^https?\:\/\//ig, '');
-                var hostURL = Constants.API_CREDENTIALS.default_protocol + "://" + hostWithPort;
-                sessionStorage.setItem(Constants.API_CREDENTIALS.host_storage_key, hostURL);
-                this.host = hostURL;
-                this.reloadServerId();
-            }
+      this.setHost = function(hostWithPort) {
+        hostWithPort = hostWithPort.replace(/^https?\:\/\//ig, '');
+        var hostURL = Constants.API_CREDENTIALS.default_protocol + '://' + hostWithPort;
+        sessionStorage.setItem(Constants.API_CREDENTIALS.host_storage_key, hostURL);
+        this.host = hostURL;
+        this.reloadServerId();
+      };
 
-            this.getUser = function(){
-                return sessionStorage.getItem('LOGIN_ID');
-            }
+      this.getUser = function() {
+        return sessionStorage.getItem('LOGIN_ID');
+      };
 
-            this.host = this.getHost();
-            this.server_id = this.getServerId();
+      this.host = this.getHost();
+      this.server_id = this.getServerId();
 
-            this.setNetworkInfo = function(data){
-                this.hostname = data.hostname;
-                this.mac_address = data.mac_address;
-            }
+      this.setNetworkInfo = function(data) {
+        this.hostname = data.hostname;
+        this.mac_address = data.mac_address;
+      };
 
-            this.setPowerOnState = function(){
-                this.server_state = Constants.HOST_STATE_TEXT.on;
-                this.server_status = Constants.HOST_STATE.on;
-            }
+      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.setPowerOffState = function() {
+        this.server_state = Constants.HOST_STATE_TEXT.off;
+        this.server_status = Constants.HOST_STATE.off;
+      };
 
-            this.setErrorState = function(){
-                this.server_state = Constants.HOST_STATE_TEXT.error;
-                this.server_status = Constants.HOST_STATE.error;
-            }
+      this.setErrorState = function() {
+        this.server_state = Constants.HOST_STATE_TEXT.error;
+        this.server_status = Constants.HOST_STATE.error;
+      };
 
-            this.setUnreachableState = function(){
-                this.server_state = Constants.HOST_STATE_TEXT.unreachable;
-                this.server_status = Constants.HOST_STATE.unreachable;
-            }
+      this.setUnreachableState = function() {
+        this.server_state = Constants.HOST_STATE_TEXT.unreachable;
+        this.server_status = Constants.HOST_STATE.unreachable;
+      };
 
-            this.setRemoteWindowActive = function(){
-                this.remote_window_active = true;
-            }
+      this.setRemoteWindowActive = function() {
+        this.remote_window_active = true;
+      };
 
-            this.setRemoteWindowInactive = function(){
-                this.remote_window_active = false;
-            }
+      this.setRemoteWindowInactive = function() {
+        this.remote_window_active = false;
+      };
 
-            this.updateServerHealth = function(logs){
-                var criticals = logs.filter(function(item){
-                    return item.health_flags.critical == true;
-                });
+      this.updateServerHealth = function(logs) {
+        var criticals = logs.filter(function(item) {
+          return item.health_flags.critical == true;
+        });
 
-                if(criticals.length){
-                    this.server_health = Constants.SERVER_HEALTH.critical;
-                    return;
-                }
+        if (criticals.length) {
+          this.server_health = Constants.SERVER_HEALTH.critical;
+          return;
+        }
 
-                var warnings = logs.filter(function(item){
-                    return item.health_flags.warning == true;
-                });
+        var warnings = logs.filter(function(item) {
+          return item.health_flags.warning == true;
+        });
 
-                if(warnings.length){
-                    this.server_health = Constants.SERVER_HEALTH.warning;
-                    return;
-                }
+        if (warnings.length) {
+          this.server_health = Constants.SERVER_HEALTH.warning;
+          return;
+        }
 
-                this.server_health = Constants.SERVER_HEALTH.good;
-            }
+        this.server_health = Constants.SERVER_HEALTH.good;
+      };
 
-            this.activateErrorModal = function(data){
-                if(data && data.hasOwnProperty('title')){
-                    this.errorModalDetails.title = data.title;
-                }else{
-                    this.errorModalDetails.title = Constants.MESSAGES.ERROR_MODAL.TITLE;
-                }
+      this.activateErrorModal = function(data) {
+        if (data && data.hasOwnProperty('title')) {
+          this.errorModalDetails.title = data.title;
+        }
+        else {
+          this.errorModalDetails.title = Constants.MESSAGES.ERROR_MODAL.TITLE;
+        }
 
-                if(data && data.hasOwnProperty('description')){
-                    this.errorModalDetails.description = data.description;
-                }else{
-                    this.errorModalDetails.description = Constants.MESSAGES.ERROR_MODAL.DESCRIPTION;
-                }
-                this.displayErrorModal = true;
-            }
+        if (data && data.hasOwnProperty('description')) {
+          this.errorModalDetails.description = data.description;
+        }
+        else {
+          this.errorModalDetails.description = Constants.MESSAGES.ERROR_MODAL.DESCRIPTION;
+        }
+        this.displayErrorModal = true;
+      };
 
-            this.deactivateErrorModal = function(){
-                this.displayErrorModal = false;
-            }
-        }]);
+      this.deactivateErrorModal = function() {
+        this.displayErrorModal = false;
+      };
+    }]);
 
 })(window.angular);
diff --git a/app/common/services/index.js b/app/common/services/index.js
index a33003a..d234069 100644
--- a/app/common/services/index.js
+++ b/app/common/services/index.js
@@ -5,13 +5,13 @@
  * @exports app/common/services/index
  */
 
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.services', [
-            // Dependencies
-            // Basic resources
-        ]);
+  angular
+    .module('app.common.services', [
+      // Dependencies
+      // Basic resources
+    ]);
 
 })(window.angular);
diff --git a/app/common/services/userModel.js b/app/common/services/userModel.js
index e25d3f9..cd943f9 100644
--- a/app/common/services/userModel.js
+++ b/app/common/services/userModel.js
@@ -7,53 +7,59 @@
 
  */
 
-window.angular && (function (angular) {
-    'use strict';
+window.angular && (function(angular) {
+  'use strict';
 
-    angular
-        .module('app.common.services')
-        .service('userModel', ['APIUtils',function(APIUtils){
-            return {
-                login : function(username, password, callback){
-                    APIUtils.login(username, password, function(response, error){
-                        if(response &&
-                            (response.status == APIUtils.API_RESPONSE.SUCCESS_STATUS
-                                || response.status === undefined)){
-                            sessionStorage.setItem('LOGIN_ID', username);
-                            callback(true);
-                        }else if(response && response.data && response.data.data
-                                 && response.data.data.description){
-                            callback(false, response.data.data.description);
-                        }else if(response && response.message){
-                            callback(false, response.message);
-                        }else if(error){
-                            callback(false, 'Server unreachable');
-                        }else{
-                            callback(false, 'Internal error');
-                        }
-                    });
-                },
-                isLoggedIn : function(){
-                    if(sessionStorage.getItem('LOGIN_ID') === null){
-                        return false;
-                    }
-                    return true;
-                },
-                logout : function(callback){
-                    APIUtils.logout(function(response, error){
-                        if(response &&
-                           response.status == APIUtils.API_RESPONSE.SUCCESS_STATUS){
-                            sessionStorage.removeItem('LOGIN_ID');
-                            sessionStorage.removeItem(APIUtils.HOST_SESSION_STORAGE_KEY);
-                            callback(true);
-                        }else if(response.status == APIUtils.API_RESPONSE.ERROR_STATUS){
-                            callback(false);
-                        }else{
-                            callback(false, error);
-                        }
-                    });
-                }
-            };
-        }]);
+  angular
+    .module('app.common.services')
+    .service('userModel', ['APIUtils', function(APIUtils) {
+      return {
+        login: function(username, password, callback) {
+          APIUtils.login(username, password, function(response, error) {
+            if (response &&
+              (response.status == APIUtils.API_RESPONSE.SUCCESS_STATUS ||
+                response.status === undefined)) {
+              sessionStorage.setItem('LOGIN_ID', username);
+              callback(true);
+            }
+            else if (response && response.data && response.data.data &&
+              response.data.data.description) {
+              callback(false, response.data.data.description);
+            }
+            else if (response && response.message) {
+              callback(false, response.message);
+            }
+            else if (error) {
+              callback(false, 'Server unreachable');
+            }
+            else {
+              callback(false, 'Internal error');
+            }
+          });
+        },
+        isLoggedIn: function() {
+          if (sessionStorage.getItem('LOGIN_ID') === null) {
+            return false;
+          }
+          return true;
+        },
+        logout: function(callback) {
+          APIUtils.logout(function(response, error) {
+            if (response &&
+              response.status == APIUtils.API_RESPONSE.SUCCESS_STATUS) {
+              sessionStorage.removeItem('LOGIN_ID');
+              sessionStorage.removeItem(APIUtils.HOST_SESSION_STORAGE_KEY);
+              callback(true);
+            }
+            else if (response.status == APIUtils.API_RESPONSE.ERROR_STATUS) {
+              callback(false);
+            }
+            else {
+              callback(false, error);
+            }
+          });
+        }
+      };
+    }]);
 
 })(window.angular);
