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
