diff --git a/app/common/directives/app-header.js b/app/common/directives/app-header.js
index 1fa25d2..92f4ef3 100644
--- a/app/common/directives/app-header.js
+++ b/app/common/directives/app-header.js
@@ -124,7 +124,6 @@
               setTimeout(function() {
                 myEl.removeClass('flash');
               }, 2000);
-
             };
 
             var loginListener =
diff --git a/app/common/directives/file.js b/app/common/directives/file.js
index b0f5289..e1c3742 100644
--- a/app/common/directives/file.js
+++ b/app/common/directives/file.js
@@ -13,5 +13,4 @@
       }
     };
   });
-
 })(window.angular);
diff --git a/app/common/directives/index.js b/app/common/directives/index.js
index 150b43f..abf71c2 100644
--- a/app/common/directives/index.js
+++ b/app/common/directives/index.js
@@ -2,5 +2,4 @@
   'use strict';
 
   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 46fba9a..887cc40 100644
--- a/app/common/directives/loader.js
+++ b/app/common/directives/loader.js
@@ -8,5 +8,4 @@
       scope: {loading: '='}
     };
   });
-
 })(window.angular);
diff --git a/app/common/directives/toggle-flag.js b/app/common/directives/toggle-flag.js
index 0869af3..008097c 100644
--- a/app/common/directives/toggle-flag.js
+++ b/app/common/directives/toggle-flag.js
@@ -6,7 +6,6 @@
         return {
           restrict: 'A',
           link: function(scope, element, attrs) {
-
             function elementClick(e) {
               e.stopPropagation();
             }
diff --git a/app/common/filters/index.js b/app/common/filters/index.js
index 743bd4e..3c6f26a 100644
--- a/app/common/filters/index.js
+++ b/app/common/filters/index.js
@@ -21,5 +21,4 @@
           }
         }
       });
-
 })(window.angular);
diff --git a/app/common/services/apiInterceptor.js b/app/common/services/apiInterceptor.js
index 03a43a3..ce47b67 100644
--- a/app/common/services/apiInterceptor.js
+++ b/app/common/services/apiInterceptor.js
@@ -62,5 +62,4 @@
       };
     }
   ]);
-
 })(window.angular);
diff --git a/app/common/services/constants.js b/app/common/services/constants.js
index 112c90e..ed69ae8 100644
--- a/app/common/services/constants.js
+++ b/app/common/services/constants.js
@@ -147,5 +147,4 @@
       },
     };
   });
-
 })(window.angular);
diff --git a/app/common/services/dataService.js b/app/common/services/dataService.js
index 5c4f53a..b9ece13 100644
--- a/app/common/services/dataService.js
+++ b/app/common/services/dataService.js
@@ -151,5 +151,4 @@
       };
     }
   ]);
-
 })(window.angular);
diff --git a/app/common/services/index.js b/app/common/services/index.js
index a56dce1..6f0a932 100644
--- a/app/common/services/index.js
+++ b/app/common/services/index.js
@@ -12,5 +12,4 @@
     // Dependencies
     // Basic resources
   ]);
-
 })(window.angular);
diff --git a/app/common/services/userModel.js b/app/common/services/userModel.js
index 0232200..40a34de 100644
--- a/app/common/services/userModel.js
+++ b/app/common/services/userModel.js
@@ -57,5 +57,4 @@
       };
     }
   ]);
-
 })(window.angular);
diff --git a/app/configuration/controllers/date-time-controller.js b/app/configuration/controllers/date-time-controller.js
index 5ec89ef..f743b6a 100644
--- a/app/configuration/controllers/date-time-controller.js
+++ b/app/configuration/controllers/date-time-controller.js
@@ -15,5 +15,4 @@
       $scope.dataService = dataService;
     }
   ]);
-
 })(angular);
diff --git a/app/configuration/controllers/firmware-controller.js b/app/configuration/controllers/firmware-controller.js
index f11edf9..80f3806 100644
--- a/app/configuration/controllers/firmware-controller.js
+++ b/app/configuration/controllers/firmware-controller.js
@@ -324,5 +324,4 @@
       $scope.loadFirmwares();
     }
   ]);
-
 })(angular);
diff --git a/app/configuration/controllers/network-controller.js b/app/configuration/controllers/network-controller.js
index 9905157..431b97e 100644
--- a/app/configuration/controllers/network-controller.js
+++ b/app/configuration/controllers/network-controller.js
@@ -150,7 +150,6 @@
         } else {
           $scope.loading = false;
         }
-
       };
 
       function setMACAddress() {
@@ -269,5 +268,4 @@
       }
     }
   ]);
-
 })(angular);
diff --git a/app/configuration/index.js b/app/configuration/index.js
index 632b895..e9bab01 100644
--- a/app/configuration/index.js
+++ b/app/configuration/index.js
@@ -37,5 +37,4 @@
               });
         }
       ]);
-
 })(window.angular);
diff --git a/app/index.js b/app/index.js
index b57d495..71d7618 100644
--- a/app/index.js
+++ b/app/index.js
@@ -166,5 +166,4 @@
           });
         }
       ]);
-
 })(window.angular);
diff --git a/app/login/controllers/login-controller.js b/app/login/controllers/login-controller.js
index be79bb6..40d9fa8 100644
--- a/app/login/controllers/login-controller.js
+++ b/app/login/controllers/login-controller.js
@@ -44,5 +44,4 @@
       };
     }
   ]);
-
 })(angular);
diff --git a/app/login/index.js b/app/login/index.js
index fcafc7c..d3bce43 100644
--- a/app/login/index.js
+++ b/app/login/index.js
@@ -21,5 +21,4 @@
           });
         }
       ]);
-
 })(window.angular);
diff --git a/app/multi-server/controllers/multi-server-controller.js b/app/multi-server/controllers/multi-server-controller.js
index fc69f81..15fc66f 100644
--- a/app/multi-server/controllers/multi-server-controller.js
+++ b/app/multi-server/controllers/multi-server-controller.js
@@ -49,5 +49,4 @@
       };
     }
   ]);
-
 })(angular);
diff --git a/app/multi-server/index.js b/app/multi-server/index.js
index 2cae8f5..f56981d 100644
--- a/app/multi-server/index.js
+++ b/app/multi-server/index.js
@@ -21,5 +21,4 @@
           });
         }
       ]);
-
 })(window.angular);
diff --git a/app/overview/controllers/system-overview-controller.js b/app/overview/controllers/system-overview-controller.js
index cb3f1ed..e7d9c6b 100644
--- a/app/overview/controllers/system-overview-controller.js
+++ b/app/overview/controllers/system-overview-controller.js
@@ -161,5 +161,4 @@
       };
     }
   ]);
-
 })(angular);
diff --git a/app/overview/index.js b/app/overview/index.js
index 2622710..060d565 100644
--- a/app/overview/index.js
+++ b/app/overview/index.js
@@ -29,5 +29,4 @@
               });
         }
       ]);
-
 })(window.angular);
diff --git a/app/server-control/controllers/power-usage-controller.js b/app/server-control/controllers/power-usage-controller.js
index f3042f9..26e7355 100644
--- a/app/server-control/controllers/power-usage-controller.js
+++ b/app/server-control/controllers/power-usage-controller.js
@@ -75,7 +75,6 @@
             $scope.set_power_cap_success = true;
           }
         });
-
       };
       $scope.refresh = function() {
         $route.reload();
@@ -100,8 +99,6 @@
                   console.log(JSON.stringify(error));
                 });
       }
-
     }
   ]);
-
 })(angular);
diff --git a/app/server-control/controllers/remote-console-controller.js b/app/server-control/controllers/remote-console-controller.js
index 45156fb..847fd9a 100644
--- a/app/server-control/controllers/remote-console-controller.js
+++ b/app/server-control/controllers/remote-console-controller.js
@@ -69,5 +69,4 @@
       };
     }
   ]);
-
 })(angular);
diff --git a/app/server-control/controllers/remote-console-window-controller.js b/app/server-control/controllers/remote-console-window-controller.js
index bcf311b..8081972 100644
--- a/app/server-control/controllers/remote-console-window-controller.js
+++ b/app/server-control/controllers/remote-console-window-controller.js
@@ -54,5 +54,4 @@
           };
         }
       ]);
-
 })(angular);
diff --git a/app/server-control/controllers/server-led-controller.js b/app/server-control/controllers/server-led-controller.js
index e804606..e30f3b3 100644
--- a/app/server-control/controllers/server-led-controller.js
+++ b/app/server-control/controllers/server-led-controller.js
@@ -39,5 +39,4 @@
       };
     }
   ]);
-
 })(angular);
diff --git a/app/server-control/index.js b/app/server-control/index.js
index 1e6eaf1..06c15b6 100644
--- a/app/server-control/index.js
+++ b/app/server-control/index.js
@@ -57,5 +57,4 @@
               });
         }
       ]);
-
 })(window.angular);
diff --git a/app/server-health/controllers/inventory-controller.js b/app/server-health/controllers/inventory-controller.js
index df9ca1c..c02e77d 100644
--- a/app/server-health/controllers/inventory-controller.js
+++ b/app/server-health/controllers/inventory-controller.js
@@ -18,5 +18,4 @@
       $window.scrollTo(0, 0);
     }
   ]);
-
 })(angular);
diff --git a/app/server-health/controllers/inventory-overview-controller.js b/app/server-health/controllers/inventory-overview-controller.js
index 58a6d5d..2563dd6 100644
--- a/app/server-health/controllers/inventory-overview-controller.js
+++ b/app/server-health/controllers/inventory-overview-controller.js
@@ -55,7 +55,6 @@
       };
 
       $scope.filterBySearchTerms = function(hardware) {
-
         if (!$scope.searchTerms.length) return true;
 
         for (var i = 0, length = $scope.searchTerms.length; i < length; i++) {
@@ -67,5 +66,4 @@
       };
     }
   ]);
-
 })(angular);
diff --git a/app/server-health/controllers/log-controller.js b/app/server-health/controllers/log-controller.js
index 97e4b28..88fac77 100644
--- a/app/server-health/controllers/log-controller.js
+++ b/app/server-health/controllers/log-controller.js
@@ -189,5 +189,4 @@
           $scope.loadLogs();
         }
       ]);
-
 })(angular);
diff --git a/app/server-health/controllers/sensors-controller.js b/app/server-health/controllers/sensors-controller.js
index 5f687a0..b158dc0 100644
--- a/app/server-health/controllers/sensors-controller.js
+++ b/app/server-health/controllers/sensors-controller.js
@@ -93,7 +93,6 @@
              $scope.selectedSeverity.critical));
       };
       $scope.filterBySearchTerms = function(sensor) {
-
         if (!$scope.searchTerms.length) return true;
 
         for (var i = 0, length = $scope.searchTerms.length; i < length; i++) {
@@ -123,8 +122,6 @@
       } else {
         setSensorData();
       }
-
     }
   ]);
-
 })(angular);
diff --git a/app/server-health/controllers/sensors-overview-controller.js b/app/server-health/controllers/sensors-overview-controller.js
index 77d2978..04dc1ac 100644
--- a/app/server-health/controllers/sensors-overview-controller.js
+++ b/app/server-health/controllers/sensors-overview-controller.js
@@ -105,7 +105,6 @@
              $scope.selectedSeverity.critical));
       };
       $scope.filterBySearchTerms = function(sensor) {
-
         if (!$scope.searchTerms.length) return true;
 
         for (var i = 0, length = $scope.searchTerms.length; i < length; i++) {
@@ -130,5 +129,4 @@
       $scope.loadSensorData();
     }
   ]);
-
 })(angular);
diff --git a/app/server-health/index.js b/app/server-health/index.js
index 461e0bd..7e21052 100644
--- a/app/server-health/index.js
+++ b/app/server-health/index.js
@@ -59,5 +59,4 @@
               });
         }
       ]);
-
 })(window.angular);
diff --git a/app/templates.js b/app/templates.js
index 03fc0bc..2b04ff6 100644
--- a/app/templates.js
+++ b/app/templates.js
@@ -12,5 +12,4 @@
    * Used for gulp template cache plugin.
    */
   angular.module('app.templates', []);
-
 })(window.angular);
diff --git a/app/users/index.js b/app/users/index.js
index 1972c4c..534653d 100644
--- a/app/users/index.js
+++ b/app/users/index.js
@@ -29,5 +29,4 @@
               });
         }
       ]);
-
 })(window.angular);
diff --git a/app/vendors/hterm/hterm_all.js b/app/vendors/hterm/hterm_all.js
index a4b6fbf..4c4deb8 100644
--- a/app/vendors/hterm/hterm_all.js
+++ b/app/vendors/hterm/hterm_all.js
@@ -2027,7 +2027,6 @@
  */
 lib.PreferenceManager.prototype.definePreference = function(
     name, value, opt_onChange) {
-
   var record = this.prefRecords_[name];
   if (record) {
     this.changeDefault(name, value);
@@ -2072,7 +2071,6 @@
  */
 lib.PreferenceManager.prototype.defineChildren = function(
     listName, childFactory) {
-
   // Define a preference to hold the ordered list of child ids.
   this.definePreference(
       listName, [], this.onChildListChange_.bind(this, listName));
@@ -2286,7 +2284,6 @@
  */
 lib.PreferenceManager.prototype.syncChildList = function(
     listName, opt_callback) {
-
   var pendingChildren = 0;
 
   function onChildStorage() {
@@ -3691,7 +3688,6 @@
 
   // List of pending test cases.
   this.testQueue_ = [];
-
 };
 
 /**
@@ -3766,7 +3762,6 @@
  */
 lib.TestManager.TestRun.prototype.onUncaughtException_ = function(
     message, file, line) {
-
   if (message.indexOf('Uncaught lib.TestManager.Result.TestComplete') == 0 ||
       message.indexOf('status: passed') != -1) {
     // This is a result.pass() or result.fail() call from a callback.  We're
@@ -7187,7 +7182,6 @@
   }
 
   throw this.error('Expected string or identifier');
-
 };
 
 hterm.Parser.prototype.peekString = function() {
diff --git a/app/vendors/hterm/hterm_all.min.js b/app/vendors/hterm/hterm_all.min.js
index 8039c16..e950d5e 100644
--- a/app/vendors/hterm/hterm_all.min.js
+++ b/app/vendors/hterm/hterm_all.min.js
@@ -1000,7 +1000,7 @@
   var o = new XMLHttpRequest;
   o.onloadend = function() {
     return 200 != o.status ?
-        void(r && r(o.status)) :
+        void (r && r(o.status)) :
         (this.addMessages(JSON.parse(o.responseText)), void t());
   }.bind(this), o.open('GET', e), o.send();
 };
@@ -1227,7 +1227,7 @@
   var r = this.prefRecords_[e];
   if (!r) throw new Error('Unknown preference: ' + e);
   if (this.diff(r.defaultValue, t)) {
-    if (r.currentValue !== this.DEFAULT_VALUE) return void(r.defaultValue = t);
+    if (r.currentValue !== this.DEFAULT_VALUE) return void (r.defaultValue = t);
     r.defaultValue = t, this.notifyChange_(e);
   }
 };
@@ -3445,7 +3445,7 @@
        o;) {
     var s = t - i, n = hterm.TextAttributes.nodeWidth(o);
     if (!o.nextSibling || n > s)
-      return this.cursorNode_ = o, void(this.cursorOffset_ = s);
+      return this.cursorNode_ = o, void (this.cursorOffset_ = s);
     i += n, o = o.nextSibling;
   }
 };
@@ -3465,7 +3465,7 @@
 , hterm.Screen.prototype.maybeClipCurrentRow = function() {
   var e = hterm.TextAttributes.nodeWidth(this.cursorRowNode_);
   if (e <= this.columnCount_)
-    return void(
+    return void (
         this.cursorPosition.column >= this.columnCount_ &&
         (this.setCursorPosition(this.cursorPosition.row, this.columnCount_ - 1),
          this.cursorPosition.overflow = !0));
@@ -3509,26 +3509,26 @@
                     t.textContent = e + r :
                     t.textContent = hterm.TextAttributes.nodeSubstr(t, 0, i) +
                        e + hterm.TextAttributes.nodeSubstr(t, i),
-                    void(this.cursorOffset_ += o);
+                    void (this.cursorOffset_ += o);
   if (0 == i) {
     var l = t.previousSibling;
     if (l && this.textAttributes.matchesContainer(l))
       return l.textContent += e,
              this.cursorNode_ = l,
-             void(this.cursorOffset_ = lib.wc.strWidth(l.textContent));
+             void (this.cursorOffset_ = lib.wc.strWidth(l.textContent));
     var h = this.textAttributes.createContainer(e);
-    return this.cursorRowNode_.insertBefore(h, t), this.cursorNode_ = h,
-                                                   void(this.cursorOffset_ = o);
+    return this.cursorRowNode_.insertBefore(h, t),
+           this.cursorNode_ = h, void (this.cursorOffset_ = o);
   }
   if (0 == s) {
     var c = t.nextSibling;
     if (c && this.textAttributes.matchesContainer(c))
       return c.textContent = e + c.textContent, this.cursorNode_ = c,
-             void(this.cursorOffset_ = lib.wc.strWidth(e));
+             void (this.cursorOffset_ = lib.wc.strWidth(e));
     var h = this.textAttributes.createContainer(e);
     return this.cursorRowNode_.insertBefore(h, c),
            this.cursorNode_ = h,
-           void(this.cursorOffset_ = hterm.TextAttributes.nodeWidth(h));
+           void (this.cursorOffset_ = hterm.TextAttributes.nodeWidth(h));
   }
   this.splitNode_(t, i);
   var h = this.textAttributes.createContainer(e);
@@ -3541,7 +3541,7 @@
   var r = lib.wc.strWidth(e);
   return this.textAttributes.matchesContainer(this.cursorNode_) &&
           this.cursorNode_.textContent.substr(this.cursorOffset_) == e ?
-      (this.cursorOffset_ += r, void(this.cursorPosition.column += r)) :
+      (this.cursorOffset_ += r, void (this.cursorPosition.column += r)) :
       (this.deleteChars(Math.min(r, t)), void this.insertString(e));
 };
 , hterm.Screen.prototype.deleteChars = function(e) {
@@ -3972,7 +3972,7 @@
 };
 , hterm.ScrollPort.prototype.drawTopFold_ = function(e) {
   if (!this.selection.startRow || this.selection.startRow.rowIndex >= e)
-    return void(
+    return void (
         this.rowNodes_.firstChild != this.topFold_ &&
         this.rowNodes_.insertBefore(this.topFold_, this.rowNodes_.firstChild));
   if (!this.selection.isMultiline || this.selection.endRow.rowIndex >= e)
@@ -3990,7 +3990,7 @@
 };
 , hterm.ScrollPort.prototype.drawBottomFold_ = function(e) {
   if (!this.selection.endRow || this.selection.endRow.rowIndex <= e)
-    return void(
+    return void (
         this.rowNodes_.lastChild != this.bottomFold_ &&
         this.rowNodes_.appendChild(this.bottomFold_));
   if (!this.selection.isMultiline || this.selection.startRow.rowIndex <= e)
@@ -4565,7 +4565,7 @@
 };
 , hterm.Terminal.prototype.syncMousePasteButton = function() {
   var e = this.prefs_.get('mouse-paste-button');
-  if ('number' == typeof e) return void(this.mousePasteButton = e);
+  if ('number' == typeof e) return void (this.mousePasteButton = e);
   var t = navigator.userAgent.match(/\(X11;\s+(\S+)/);
   t && 'CrOS' != t[2] ? this.mousePasteButton = 3 : this.mousePasteButton = 2;
 };
@@ -4573,7 +4573,7 @@
   var e = this.prefs_.get('enable-bold');
   if (null !== e)
     return this.primaryScreen_.textAttributes.enableBold = e,
-           void(this.alternateScreen_.textAttributes.enableBold = e);
+           void (this.alternateScreen_.textAttributes.enableBold = e);
   var t = this.scrollPort_.measureCharacterSize(),
       r = this.scrollPort_.measureCharacterSize('bold'), o = t.equals(r);
   o ||
@@ -4621,7 +4621,7 @@
 };
 , hterm.Terminal.prototype.setWidth = function(e) {
   return null == e ?
-      void(this.div_.style.width = '100%') :
+      void (this.div_.style.width = '100%') :
       (this.div_.style.width = Math.ceil(
                                    this.scrollPort_.characterSize.width * e +
                                    this.scrollPort_.currentScrollbarWidthPx) +
@@ -4630,7 +4630,7 @@
        void this.scheduleSyncCursorPosition_());
 };
 , hterm.Terminal.prototype.setHeight = function(e) {
-  return null == e ? void(this.div_.style.height = '100%') :
+  return null == e ? void (this.div_.style.height = '100%') :
                      (this.div_.style.height =
                           this.scrollPort_.characterSize.height * e + 'px',
                       this.realizeSize_(this.screenSize.width, e),
@@ -5192,7 +5192,7 @@
     return this.timeouts_.cursorBlink &&
                (clearTimeout(this.timeouts_.cursorBlink),
                 delete this.timeouts_.cursorBlink),
-           void(this.cursorNode_.style.opacity = '0');
+           void (this.cursorNode_.style.opacity = '0');
   if (this.syncCursorPosition_(), this.cursorNode_.style.opacity = '1',
       this.options_.cursorBlink) {
     if (this.timeouts_.cursorBlink) return;
@@ -5207,7 +5207,7 @@
       t = this.scrollPort_.getBottomRowIndex(e),
       r = this.scrollbackRows_.length + this.screen_.cursorPosition.row;
   if (r > t)
-    return void(
+    return void (
         this.cursorNode_.style.top =
             -this.scrollPort_.characterSize.height + 'px');
   this.options_.cursorVisible && 'none' == this.cursorNode_.style.display &&
@@ -5408,7 +5408,7 @@
                  this.copySelectionToClipboard(this.document_)),
             'click' == e.type && !e.shiftKey && e.ctrlKey)
           return clearTimeout(this.timeouts_.openUrl),
-                 void(
+                 void (
                      this.timeouts_.openUrl =
                          setTimeout(this.openSelectedUrl_.bind(this), 500));
         'mousedown' == e.type && e.which == this.mousePasteButton &&
@@ -5464,7 +5464,7 @@
 };
 , hterm.Terminal.prototype.onCursorBlink_ = function() {
   return this.options_.cursorBlink ?
-      void(
+      void (
           'false' == this.cursorNode_.getAttribute('focus') ||
                   '0' == this.cursorNode_.style.opacity ?
               (this.cursorNode_.style.opacity = '1',
@@ -5865,14 +5865,14 @@
   var o = hterm.VT[e][t];
   return o ?
       o == hterm.VT.ignore ?
-      void(
+      void (
           this.warnUnimplemented &&
           console.warn('Ignored ' + e + ' code: ' + JSON.stringify(t))) :
       'CC1' == e && t > '' && !this.enable8BitControl ?
       void console.warn(
           'Ignoring 8-bit control code: 0x' + t.charCodeAt(0).toString(16)) :
       void o.apply(this, [r, t]) :
-      void(
+      void (
           this.warnUnimplemented &&
           console.warn('Unknown ' + e + ' code: ' + JSON.stringify(t)))
 };
diff --git a/format-code.sh b/format-code.sh
index 0a6362c..afcf8c4 100755
--- a/format-code.sh
+++ b/format-code.sh
@@ -18,6 +18,6 @@
 # formatting due to some imported code in webui
 
 if [ -f ".clang-format" ]; then
-    clang-format-5.0 -i `git ls-files '*.js'`
+    clang-format-6.0 -i `git ls-files '*.js'`
     git --no-pager diff --exit-code
 fi
