diff --git a/app/server-control/controllers/remote-console-controller.js b/app/server-control/controllers/remote-console-controller.js
index ee6a591..c2e1435 100644
--- a/app/server-control/controllers/remote-console-controller.js
+++ b/app/server-control/controllers/remote-console-controller.js
@@ -6,72 +6,75 @@
  * @name remoteConsoleController
  */
 
-import {hterm, lib} from 'hterm-umdjs';
+import {
+  hterm,
+  lib
+}
+from 'hterm-umdjs';
 
-window.angular && (function (angular) {
-    'use strict';
+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);
