incremental
diff --git a/static/js/kvm-controller.js b/static/js/kvm-controller.js
new file mode 100644
index 0000000..3c6af2b
--- /dev/null
+++ b/static/js/kvm-controller.js
@@ -0,0 +1,124 @@
+angular.module('bmcApp').controller('KvmController', function($scope, $location) {
+
+
+    /*jslint white: false */
+    /*global window, $, Util, RFB, */
+    "use strict";
+    var INCLUDE_URI = "noVNC/"
+    // Load supporting scripts
+    Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
+                        "keysymdef.js", "xtscancodes.js", "keyboard.js",
+                        "input.js", "display.js", "inflator.js", "rfb.js",
+                        "keysym.js"]);
+
+    var rfb;
+    var resizeTimeout;
+
+
+    function UIresize() {
+        if (WebUtil.getConfigVar('resize', false)) {
+            var innerW = window.innerWidth;
+            var innerH = window.innerHeight;
+            var controlbarH = $D('noVNC_status_bar').offsetHeight;
+            var padding = 5;
+            if (innerW !== undefined && innerH !== undefined)
+                rfb.requestDesktopSize(innerW, innerH - controlbarH - padding);
+        }
+    }
+    function FBUComplete(rfb, fbu) {
+        UIresize();
+        rfb.set_onFBUComplete(function() { });
+    }
+    function sendCtrlAltDel() {
+        rfb.sendCtrlAltDel();
+        return false;
+    }
+    function xvpShutdown() {
+        rfb.xvpShutdown();
+        return false;
+    }
+    function xvpReboot() {
+        rfb.xvpReboot();
+        return false;
+    }
+    function xvpReset() {
+        rfb.xvpReset();
+        return false;
+    }
+    function updateState(rfb, state, oldstate, msg) {
+        var s, sb, cad, level;
+        s = $D('noVNC_status');
+        sb = $D('noVNC_status_bar');
+        cad = $D('sendCtrlAltDelButton');
+        switch (state) {
+            case 'failed':       level = "error";  break;
+            case 'fatal':        level = "error";  break;
+            case 'normal':       level = "normal"; break;
+            case 'disconnected': level = "normal"; break;
+            case 'loaded':       level = "normal"; break;
+            default:             level = "warn";   break;
+        }
+
+        if (state === "normal") {
+            cad.disabled = false;
+        } else {
+            cad.disabled = true;
+            xvpInit(0);
+        }
+
+        if (typeof(msg) !== 'undefined') {
+            sb.setAttribute("class", "noVNC_status_" + level);
+            s.innerHTML = msg;
+        }
+    }
+
+    window.onresize = function () {
+        // When the window has been resized, wait until the size remains
+        // the same for 0.5 seconds before sending the request for changing
+        // the resolution of the session
+        clearTimeout(resizeTimeout);
+        resizeTimeout = setTimeout(function(){
+            UIresize();
+        }, 500);
+    };
+
+    function xvpInit(ver) {
+        var xvpbuttons;
+        xvpbuttons = $D('noVNC_xvp_buttons');
+        if (ver >= 1) {
+            xvpbuttons.style.display = 'inline';
+        } else {
+            xvpbuttons.style.display = 'none';
+        }
+    }
+
+    window.onscriptsload = function () {
+        var host, port, password, path, token;
+
+        $D('sendCtrlAltDelButton').style.display = "inline";
+        $D('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
+        $D('xvpShutdownButton').onclick = xvpShutdown;
+        $D('xvpRebootButton').onclick = xvpReboot;
+        $D('xvpResetButton').onclick = xvpReset;
+
+        host = $location.host();
+        port = 9000;
+        password = "";
+        token = "1234";
+        path = "/";
+
+        try {
+            rfb = new RFB({'target':       $D('noVNC_canvas'),
+                            'encrypt':      true,
+                            'local_cursor': true,
+                            'onUpdateState':  updateState,
+                            'onXvpInit':    xvpInit,
+                            'onFBUComplete': FBUComplete});
+        } catch (exc) {
+            updateState(null, 'fatal', null, 'Unable to create RFB client -- ' + exc);
+            return; // don't continue trying to connect
+        }
+
+        rfb.connect(host, port, password, path);
+    };
+});
\ No newline at end of file