incremental
diff --git a/static/js/kvmController.js b/static/js/kvmController.js
new file mode 100644
index 0000000..b8b442e
--- /dev/null
+++ b/static/js/kvmController.js
@@ -0,0 +1,93 @@
+angular.module('bmcApp').controller('KvmController', 
+['$scope', '$location', '$window',
+function($scope, $location, $window) {
+
+
+    /*jslint white: false */
+    /*global window, $, Util, RFB, */
+    "use strict";
+
+    var rfb;
+    var host = $location.host();
+    var port = $location.port();
+    var encrypt = $location.protocol() === 'https';
+    var password = "";
+    var token = "1234";
+    var path = "kvmws";
+    var target = angular.element(document.querySelector('#noVNC_canvas'))[0];
+    try {
+        rfb = new RFB({'target':        target,
+                        'encrypt':      encrypt,
+                        'local_cursor': true,
+                        'onUpdateState':  updateState,
+                        //'onXvpInit':    xvpInit,
+                        'onFBUComplete': FBUComplete,
+                        'resize': true});
+        rfb.connect(host, port, password, path);
+    } catch (exc) {
+        updateState(null, 'fatal', null, 'Unable to create RFB client -- ' + exc);
+        return; // don't continue trying to connect
+    }
+
+    
+
+    $scope.$on("$destroy", function() {
+        if (rfb) {
+            rfb.disconnect();
+        }
+    });
+
+    function UIresize() {
+        if (WebUtil.getConfigVar('resize', false)) {
+            var innerW = $window.innerWidth;
+            var innerH = $window.innerHeight;
+            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 updateState(rfb, state, oldstate, msg) {
+        var s, sb, cad, level;
+        s = angular.element(document.querySelector('#noVNC_status'))[0];
+        sb = angular.element(document.querySelector('#noVNC_status_bar'))[0];
+        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 (typeof(msg) !== 'undefined') {
+            // at this point, it's possible the window has already been destroyed, so make sure
+            // the handles exist before writing.
+            if (typeof(sb) !== 'undefined'){
+                sb.setAttribute("class", "noVNC_status_" + level);
+            }
+            if (typeof(sb) !== 'undefined'){
+                s.innerHTML = msg;
+            }
+        }
+    }
+
+    var resizeTimeout;
+    $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);
+    }; 
+}]);
\ No newline at end of file