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
