diff --git a/app/server-control/controllers/remote-console-controller.js b/app/server-control/controllers/remote-console-controller.js
index c2e1435..45156fb 100644
--- a/app/server-control/controllers/remote-console-controller.js
+++ b/app/server-control/controllers/remote-console-controller.js
@@ -6,75 +6,68 @@
  * @name remoteConsoleController
  */
 
-import {
-  hterm,
-  lib
-}
-from 'hterm-umdjs';
+import {hterm, lib} from 'hterm-umdjs';
 
 window.angular && (function(angular) {
   'use strict';
 
-  angular
-    .module('app.serverControl')
-    .controller('remoteConsoleController', [
-      '$scope',
-      '$window',
-      'APIUtils',
-      'dataService',
-      function($scope, $window, APIUtils, dataService) {
-        $scope.dataService = dataService;
+  angular.module('app.serverControl').controller('remoteConsoleController', [
+    '$scope', '$window', 'APIUtils', 'dataService',
+    function($scope, $window, APIUtils, dataService) {
+      $scope.dataService = dataService;
 
-        // See https://github.com/macton/hterm for available hterm options
+      // See https://github.com/macton/hterm for available hterm options
 
-        hterm.defaultStorage = new lib.Storage.Local();
-        var term = new hterm.Terminal('host-console');
-        term.decorate(document.querySelector('#terminal'));
-        //Set cursor color
-        term.prefs_.set('cursor-color', 'rgba(83, 146, 255, .5)');
-        //Set background color
-        term.prefs_.set('background-color', '#19273c');
-        //Allows keyboard input
-        term.installKeyboard();
+      hterm.defaultStorage = new lib.Storage.Local();
+      var term = new hterm.Terminal('host-console');
+      term.decorate(document.querySelector('#terminal'));
+      // Set cursor color
+      term.prefs_.set('cursor-color', 'rgba(83, 146, 255, .5)');
+      // Set background color
+      term.prefs_.set('background-color', '#19273c');
+      // Allows keyboard input
+      term.installKeyboard();
 
-        //The BMC exposes a websocket at /console0. This can be read
-        //or written to access the host serial console.
-        var hostname = dataService.getHost().replace('https://', '');
-        var host = 'wss://' + hostname + '/console0';
-        var ws = new WebSocket(host);
-        ws.onmessage = function(evt) {
-          //websocket -> terminal
-          term.io.print(evt.data);
+      // The BMC exposes a websocket at /console0. This can be read
+      // or written to access the host serial console.
+      var hostname = dataService.getHost().replace('https://', '');
+      var host = 'wss://' + hostname + '/console0';
+      var ws = new WebSocket(host);
+      ws.onmessage = function(evt) {
+        // websocket -> terminal
+        term.io.print(evt.data);
+      };
+
+      // terminal -> websocket
+      term.onTerminalReady = function() {
+        var io = term.io.push();
+        io.onVTKeystroke = function(str) {
+          ws.send(str);
         };
+        io.sendString = function(str) {
+          ws.send(str);
+        };
+      };
 
-        //terminal -> websocket
-        term.onTerminalReady = function() {
-          var io = term.io.push();
-          io.onVTKeystroke = function(str) {
-            ws.send(str);
-          };
-          io.sendString = function(str) {
-            ws.send(str);
-          };
-        };
+      ws.onopen = function() {
+        console.log('websocket opened');
+      };
+      ws.onclose = function() {
+        console.log('websocket closed');
+      };
+      $scope.$on('$destroy', function() {
+        if (ws) {
+          ws.close();
+        }
+      });
 
-        ws.onopen = function() {
-          console.log('websocket opened');
-        };
-        ws.onclose = function() {
-          console.log('websocket closed');
-        };
-        $scope.$on('$destroy', function() {
-          if (ws) {
-            ws.close();
-          }
-        });
-
-        $scope.openTerminalWindow = function() {
-          dataService.setRemoteWindowActive();
-          $window.open('#/server-control/remote-console-window', 'Remote Console Window', 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=600,height=400');
-        };
-      }
-    ]);
+      $scope.openTerminalWindow = function() {
+        dataService.setRemoteWindowActive();
+        $window.open(
+            '#/server-control/remote-console-window', 'Remote Console Window',
+            'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=600,height=400');
+      };
+    }
+  ]);
 
 })(angular);
