diff --git a/slapos/runner/__init__.py b/slapos/runner/__init__.py
index 386702b86163ecc97b4c15de20017c5ef822860c..10b3c2af97eac11f1264ba99e022e9ca8bc25073 100755
--- a/slapos/runner/__init__.py
+++ b/slapos/runner/__init__.py
@@ -16,7 +16,7 @@ class Parser(OptionParser):
   """
   def __init__(self, usage=None, version=None):
     """
-    Initialize all options possibles.
+    Initialize all possible options.
     """
     OptionParser.__init__(self, usage=usage, version=version,
                           option_list=[
diff --git a/slapos/runner/static/js/jquery/jqueryTabs.js b/slapos/runner/static/js/jquery/jqueryTabs.js
index 2b9adeb5b96d88bede71dced440f4f626e5e6fdb..9b294ed668d8df6d550d8f13380385f4178a219f 100644
--- a/slapos/runner/static/js/jquery/jqueryTabs.js
+++ b/slapos/runner/static/js/jquery/jqueryTabs.js
@@ -1,5 +1,5 @@
 $(document).ready(function(){
-	$(".tabContents").hide(); // Hide all tab content divs by default
+  $(".tabContents").hide(); // Hide all tab content divs by default
   var hashes = window.location.href.split('#');
   var fromheight = 0;
   var previoustab = null;
@@ -18,17 +18,17 @@ $(document).ready(function(){
     });
   }
   else{$(".tabContents:first").show(); previoustab = ".tabContents:first";} // Show the first div of tab content by default
-	$("#tabContaier ul li a").click(function(){ //Fire the click event
-		if($(this).hasClass('active')){
-		    return false;
-		}
+  $("#tabContaier ul li a").click(function(){ //Fire the click event
+    if($(this).hasClass('active')){
+        return false;
+    }
     fromheight = $(previoustab).height();
-		var activeTab = $(this).attr("href"); // Catch the click link
+    var activeTab = $(this).attr("href"); // Catch the click link
     $("#tabContaier .tabDetails").css("height", $("#tabContaier .tabDetails").height());
-		$("#tabContaier ul li a").removeClass("active"); // Remove pre-highlighted link
-		$(this).addClass("active"); // set clicked link to highlight state
-		$(".tabContents").hide(); // hide currently visible tab content div
-		$(activeTab).fadeIn(); // show the target tab content div by matching clicked link.
+    $("#tabContaier ul li a").removeClass("active"); // Remove pre-highlighted link
+    $(this).addClass("active"); // set clicked link to highlight state
+    $(".tabContents").hide(); // hide currently visible tab content div
+    $(activeTab).fadeIn(); // show the target tab content div by matching clicked link.
     var diff = fromheight - $(activeTab).height();
     if (diff > 0){$("#tabContaier .tabDetails").animate({height: '-=' + diff + 'px'}, 850, 'swing', function() {
       $("#tabContaier .tabDetails").css("height", "");
@@ -39,5 +39,5 @@ $(document).ready(function(){
     previoustab = activeTab;
     $("#tabContaier .tabDetails").css("height", $("#tabContaier .tabDetails").height());
     return false;//this reinitialize tab index when reload page
-	});
-});
\ No newline at end of file
+  });
+});
diff --git a/slapos/runner/static/js/jquery/popup.js b/slapos/runner/static/js/jquery/popup.js
index 4d2b1f69cc6dff62c3745ec297168550781a33bd..1724392d4a6692c1a8834e623efc5e19907c9f41 100644
--- a/slapos/runner/static/js/jquery/popup.js
+++ b/slapos/runner/static/js/jquery/popup.js
@@ -30,43 +30,43 @@
         $box.show();
         $box.append('<div><table id="bcontent"><tr>' +
         '<td valign="middle" class="logo ' + option.type + '_message"></td>' +
-  	    '<td valign="middle"><p>' + msg + '</p></td>' +
-  	    '<td valign="middle" class="b_close"><span id="pClose"></span></td></tr></table></div>');
+        '<td valign="middle"><p>' + msg + '</p></td>' +
+        '<td valign="middle" class="b_close"><span id="pClose"></span></td></tr></table></div>');
         $(window).scroll(function(){
-  	      $box.animate({top:$(window).scrollTop()+"px" },{queue: false, duration: 350});
+          $box.animate({top:$(window).scrollTop()+"px" },{queue: false, duration: 350});
         });
         h = $("#bcontent").height()+5;
         $("#pClose").bind("click", function() {
-  	      close();
+          close();
         });
         showBox();
         if(option.duration != 0){
-        	showDelayTimer = setTimeout(function(){
+          showDelayTimer = setTimeout(function(){
             showDelayTimer = null;
-        	  close();
-        	}, option.duration);
+            close();
+          }, option.duration);
         }
       }
       function showBox(){
         if(option.load){
           $(window).load(function(){
             $box.css('top', + ($(window).scrollTop() - h) +'px');
-        	  $box.animate({ top:"+=" + h + "px" }, "slow");
+            $box.animate({ top:"+=" + h + "px" }, "slow");
             isShow = true;
-        	});
+          });
         }
         else{
-        	$box.css('top', + ($(window).scrollTop() - h) +'px');
-        	$box.animate({ top:"+=" + h + "px" }, "slow");
+          $box.css('top', + ($(window).scrollTop() - h) +'px');
+          $box.animate({ top:"+=" + h + "px" }, "slow");
           isShow = true;
         }
       }
       function close(){
-      	$box.animate({ top:"-=" + h + "px" }, "slow", function(){
-      	  $box.fadeOut("normal", function() {
+        $box.animate({ top:"-=" + h + "px" }, "slow", function(){
+          $box.fadeOut("normal", function() {
             isShow = false;
           });
-      	});
+        });
       }
     }
   });
diff --git a/slapos/runner/static/js/scripts/account.js b/slapos/runner/static/js/scripts/account.js
index 1c763eb9fc011fc59ce91b017bc43841d2e1d74a..f77bde0bdcb986980f5b444afedc71eecde26520 100644
--- a/slapos/runner/static/js/scripts/account.js
+++ b/slapos/runner/static/js/scripts/account.js
@@ -1,65 +1,76 @@
-$(document).ready( function() {
-  var send = false;
-  $("#update").click(function(){
-    var haspwd = false;
-    var hasAccount = !($("input#hasAccount").val() === "");
-    if($("input#username").val() === "" || !$("input#username").val().match(/^[\w\d\._-]+$/)){
-  		$("#error").Popup("Invalid user name. Please check it!", {type:'alert', duration:3000});
-			return false;
-		}
-    else if ($("input#username").val().length <6){
-      $("#error").Popup("Username must have at least 6 characters", {type:'alert', duration:3000});
-      return false;
-    }
-		if($("input#name").val() === ""){
-			$("#error").Popup("Please enter your name and surname!", {type:'alert', duration:3000});
-  		return false;
-		}
-		if(!$("input#email").val().match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)){
-			$("#error").Popup("Please enter a valid email adress!", {type:'alert', duration:3000});
-			return false;
-		}
-    if(!hasAccount && !$("input#password").val().match(/^[\w\d\._-]+$/)){
-      $("#error").Popup("Please enter your new password!", {type:'alert', duration:3000});
-      return false;
-    }
-    if ($("input#password").val() !== "" && $("input#password").val().length <6){
-      $("#error").Popup("The password must have at least 6 characters", {type:'alert', duration:3000});
-      return false;
-    }
-    if($("input#password").val() !== ""){
-      if($("input#password").val() === "" || !$("input#password").val().match(/^[\w\d\._-]+$/)){
-      	$("#error").Popup("Please enter your new password!", {type:'alert', duration:3000});
-  			return false;
-  		}
-      if($("input#password").val() !== $("input#cpassword").val()){
-        $("#error").Popup("your password does not match!", {type:'alert', duration:3000});
-    		return false;
-      }
-      haspwd = true;
-    }
-    if(!$("input#rcode").val().match(/^[\w\d]+$/)){
-    	$("#error").Popup("Please enter your password recovery code.", {type:'alert', duration:3000});
-			return false;
-		}
-    if(send) return false;
-    send = true;
-    $.ajax({
-  		type: "POST",
-			url: $SCRIPT_ROOT + ((hasAccount)? '/updateAccount':'/configAccount'),
-			data: {name: $("input#name").val(), username:$("input#username").val(), email:$("input#email").val(),
-				password:((haspwd) ? $("input#password").val():""), rcode:$("input#rcode").val()},
-			success: function(data){
-        if(data.code ==1){
-          location.href = $SCRIPT_ROOT+"/"
+/*jslint undef: true */
+/*global $, document, window, $SCRIPT_ROOT */
+/* vim: set et sts=4: */
+
+$(document).ready(function () {
+    "use strict";
+    var send = false;
+    $("#update").click(function () {
+        var haspwd = false,
+            hasAccount = ($("input#hasAccount").val() !== "");
+        if ($("input#username").val() === "" || !$("input#username").val().match(/^[\w\d\._\-]+$/)) {
+            $("#error").Popup("Invalid user name. Please check it!", {type: 'alert', duration: 3000});
+            return false;
         }
-        else{
-          $("#error").Popup(data.result, {type:'error', duration:5000});
+        if ($("input#username").val().length < 6) {
+            $("#error").Popup("Username must have at least 6 characters", {type: 'alert', duration: 3000});
+            return false;
         }
-        send = false;
-			},
-      error:function(){send = false;}
+        if ($("input#name").val() === "") {
+            $("#error").Popup("Please enter your name and surname!", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if (!$("input#email").val().match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)) {
+            $("#error").Popup("Please enter a valid email adress!", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if (!hasAccount && !$("input#password").val().match(/^[\w\d\._\-]+$/)) {
+            $("#error").Popup("Please enter your new password!", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if ($("input#password").val() !== "" && $("input#password").val().length < 6) {
+            $("#error").Popup("The password must have at least 6 characters", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if ($("input#password").val() !== "") {
+            if ($("input#password").val() === "" || !$("input#password").val().match(/^[\w\d\._\-]+$/)) {
+                $("#error").Popup("Please enter your new password!", {type: 'alert', duration: 3000});
+                return false;
+            }
+            if ($("input#password").val() !== $("input#cpassword").val()) {
+                $("#error").Popup("your password does not match!", {type: 'alert', duration: 3000});
+                return false;
+            }
+            haspwd = true;
+        }
+        if (!$("input#rcode").val().match(/^[\w\d]+$/)) {
+            $("#error").Popup("Please enter your password recovery code.", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if (send) {
+            return false;
+        }
+        send = true;
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + ((hasAccount) ? '/updateAccount' : '/configAccount'),
+            data: {
+                name: $("input#name").val(),
+                username: $("input#username").val(),
+                email: $("input#email").val(),
+                password: ((haspwd) ? $("input#password").val() : ""),
+                rcode: $("input#rcode").val()
+            },
+            success: function (data) {
+                if (data.code === 1) {
+                    window.location.href = $SCRIPT_ROOT + "/";
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+                send = false;
+            },
+            error: function () { send = false; }
+        });
+        return false;
     });
-    return false;
-  });
-});
\ No newline at end of file
+});
diff --git a/slapos/runner/static/js/scripts/common.js b/slapos/runner/static/js/scripts/common.js
index 1d60809f94ee7041dcfc8c2c268466946a507107..9c67a197f7584a43a6655dab1945a9d02b0530df 100644
--- a/slapos/runner/static/js/scripts/common.js
+++ b/slapos/runner/static/js/scripts/common.js
@@ -1,72 +1,92 @@
+/*jslint undef: true */
+/*global $, window, $SCRIPT_ROOT */
+/* vim: set et sts=4: */
+
 /*Common javascript function*/
-String.prototype.toHtmlChar = function(){
-  var c = {'<':'&lt;', '>':'&gt;', '&':'&amp;', '"':'&quot;', "'":'&#039;',
-       '#':'&#035;' };
-  return this.replace( /[<&>'"#]/g, function(s) { return c[s]; } );
+String.prototype.toHtmlChar = function () {
+    "use strict";
+    var c = {
+        '<': '&lt;',
+        '>': '&gt;',
+        '&': '&amp;',
+        '"': '&quot;',
+        "'": '&#039;',
+        '#': '&#035;'
+    };
+    return this.replace(/[<&>'"#]/g, function (s) { return c[s]; });
 };
 String.prototype.trim = function () {
+    "use strict";
     return this.replace(/^\s*/, "").replace(/\s*$/, "");
 };
 
 /****************************************/
 function setInput($elt) {
-  if(!$elt){$elt = $('input[type="text"], input[type="password"]');}
-	$elt.addClass("idleField");
-    $elt.focus(function() {
-      $(this).removeClass("idleField").addClass("focusField");
-      if (this.value == this.defaultValue){
-        this.value = '';
-		  }
-		  if(this.value != this.defaultValue){
-        this.select();
-      }
-		});
-		$elt.blur(function() {
-			$(this).removeClass("focusField").addClass("idleField");
-		    if ($.trim(this.value) === ''){
-        this.value = (this.defaultValue ? this.defaultValue : '');
-		  }
-	  });
+    "use strict";
+    if (!$elt) {
+        $elt = $('input[type="text"], input[type="password"]');
+    }
+    $elt.addClass("idleField");
+    $elt.focus(function () {
+        $(this).removeClass("idleField").addClass("focusField");
+        if (this.value === this.defaultValue) {
+            this.value = '';
+        }
+        if (this.value !== this.defaultValue) {
+            this.select();
+        }
+    });
+    $elt.blur(function () {
+        $(this).removeClass("focusField").addClass("idleField");
+        if ($.trim(this.value) === '') {
+            this.value = (this.defaultValue || '');
+        }
+    });
 }
 
 /*******************Bind remove all button*******************/
-function bindRemove(){
-  $("a#removeSr").click(function(){
-      if(!window.confirm("Do you really want to remove all software release?")){
-        return false;
-      }
-      location.href = $SCRIPT_ROOT + '/removeSoftware';
-  });
-  $("a#removeIst").click(function(){
-      if(!window.confirm("Do you really want to remove all computer partition?")){
-        return false;
-      }
-      location.href = $SCRIPT_ROOT + '/removeInstance';
-  });
+function bindRemove() {
+    "use strict";
+    $("a#removeSr").click(function () {
+        if (!window.confirm("Do you really want to remove all software release?")) {
+            return false;
+        }
+        window.location.href = $SCRIPT_ROOT + '/removeSoftware';
+    });
+    $("a#removeIst").click(function () {
+        if (!window.confirm("Do you really want to remove all computer partition?")) {
+            return false;
+        }
+        window.location.href = $SCRIPT_ROOT + '/removeInstance';
+    });
 }
 
 /**************************/
 (function ($, document, window) {
+    "use strict";
     $.extend($.fn, {
-      slideBox: function(state) {
-        if (!state) state = "hide";
-        var header = $("#"+$(this).attr('id')+">h2");
-        var box = $("#"+$(this).attr('id')+">div");
-        header.addClass(state);
-        if(state=="hide"){box.css('display', 'none');}
-        header.click(function(){
-          var state = box.css("display");
-          if (state == "none"){
-            box.slideDown("normal");
-            header.removeClass("hide");
-            header.addClass("show");
-          }
-          else{
-            box.slideUp("normal");
-            header.removeClass("show");
-            header.addClass("hide");
-          }
-        });
-      }
+        slideBox: function (state) {
+            if (!state) {
+                state = "hide";
+            }
+            var header = $("#" + $(this).attr('id') + ">h2"),
+                box = $("#" + $(this).attr('id') + ">div");
+            header.addClass(state);
+            if (state === "hide") {
+                box.css('display', 'none');
+            }
+            header.click(function () {
+                var state = box.css("display");
+                if (state === "none") {
+                    box.slideDown("normal");
+                    header.removeClass("hide");
+                    header.addClass("show");
+                } else {
+                    box.slideUp("normal");
+                    header.removeClass("show");
+                    header.addClass("hide");
+                }
+            });
+        }
     });
-}(jQuery, document, this));
\ No newline at end of file
+}(jQuery, document, this));
diff --git a/slapos/runner/static/js/scripts/cookies.js b/slapos/runner/static/js/scripts/cookies.js
index 06473694b203823900465480a09ec4c4ca20f34b..9cc7c47d473be4b3027997d255ecb0c4502d1c01 100644
--- a/slapos/runner/static/js/scripts/cookies.js
+++ b/slapos/runner/static/js/scripts/cookies.js
@@ -1,37 +1,49 @@
+/*jslint undef: true */
+/*global document, escape, unescape */
+/* vim: set et sts=4: */
+
 /*Cookies Management*/
-function setCookie(name,value,expires,path,domain,secure){
-  if (!expires){
-    var today = new Date();
-    expires = new Date(today.getTime() + 365 * 24 * 60 * 60 * 1000);
-  }
-  document.cookie = name + "=" + escape(value) +
-    "; expires=" + expires.toGMTString() +
-    ((path) ? "; path=" + path : "/") +
-    ((domain) ? "; domain=" + domain : "") +
-    ((secure) ? "; secure" : "");
-}
-function deleteCookie(name,path,domain) {
-  if (getCookie(name)) {
-    document.cookie = name + "=" +
-    ((path) ? "; path=" + path : "/") +
-    ((domain) ? "; domain=" + domain : "") +
-    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
-  }
+function setCookie(name, value, expires, path, domain, secure) {
+    "use strict";
+    if (!expires) {
+        var today = new Date();
+        expires = new Date(today.getTime() + 365 * 24 * 60 * 60 * 1000);
+    }
+    document.cookie = name + "=" + escape(value) +
+        "; expires=" + expires.toGMTString() +
+        ((path) ? "; path=" + path : "/") +
+        ((domain) ? "; domain=" + domain : "") +
+        ((secure) ? "; secure" : "");
 }
+
 function getCookie(name) {
-  var i,x,y,ARRcookies=document.cookie.split(";");
-  for (i=0;i<ARRcookies.length;i++){
-    x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
-    y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
-    x=x.replace(/^\s+|\s+$/g,"");
-    if (x==name){
-      var result = unescape(y);
-      if (result != "" && result != null){
-        return result;
-      }
-      return null;
+    "use strict";
+    var i,
+        x,
+        y,
+        result,
+        ARRcookies = document.cookie.split(";");
+    for (i = 0; i < ARRcookies.length; i += 1) {
+        x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
+        y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
+        x = x.replace(/^\s+|\s+$/g, "");
+        if (x === name) {
+            result = unescape(y);
+            if (result !== "" && result !== null) {
+                return result;
+            }
+            return null;
+        }
+    }
+    return null;
+}
+function deleteCookie(name, path, domain) {
+    "use strict";
+    if (getCookie(name)) {
+        document.cookie = name + "=" +
+            (path ? "; path=" + path : "/") +
+            (domain ? "; domain=" + domain : "") +
+            "; expires=Thu, 01-Jan-70 00:00:01 GMT";
     }
-  }
-  return null;
 }
 /**************************/
diff --git a/slapos/runner/static/js/scripts/editor.js b/slapos/runner/static/js/scripts/editor.js
index 58c9b3ff794add30f85dc62bf50993f4f4bbdb76..0bdbc115f95934ccb543867c621b71e6471e2cc3 100644
--- a/slapos/runner/static/js/scripts/editor.js
+++ b/slapos/runner/static/js/scripts/editor.js
@@ -1,126 +1,151 @@
-$(document).ready( function() {
-	var editor = ace.edit("editor");
-	editor.setTheme("ace/theme/crimson_editor");
+/*jslint undef: true */
+/*global $, document, ace, $SCRIPT_ROOT */
+/* vim: set et sts=4: */
 
-	var CurentMode = require("ace/mode/buildout").Mode;
-	editor.getSession().setMode(new CurentMode());
-	editor.getSession().setTabSize(2);
-	editor.getSession().setUseSoftTabs(true);
-	editor.renderer.setHScrollBarAlwaysVisible(false);
 
-	var file = $("input#profile").val();
-	var workdir = $("input#workdir").val();
-	var edit = false;
-	var send = false;
-	selectFile(file);
+$(document).ready(function () {
+    "use strict";
 
-	$("#save").click(function(){
-		if(!edit){
-			$("#error").Popup("Can not load your file, please make sure that you have selected a Software Release", {type:'alert', duration:5000});
-			return false;
-		}
-		if (send) return;
-		send =true
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/saveFileContent',
-			data: {file: file, content: editor.getSession().getValue()},
-			success: function(data){
-				if(data.code == 1){
-					$("#error").Popup("File Saved!", {type:'confirm', duration:2000});
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-				send = false;
-			}
-		});
-		return false;
-	});
-	$("#getmd5").click(function(){
-		getmd5sum();
-		return false;
-	});
-	$("#adddevelop").click(function(){
-	    var developList = new Array();
-	    var i=0;
-	    $("#plist li").each(function(index){
-		var elt = $(this).find("input:checkbox");
-		if (elt.is(":checked")){
-		    developList[i] = workdir+"/"+elt.val();
-		    i++;
-		    elt.attr("checked", false);
-		}
-	    });
-	    if (developList.length > 0){setDevelop(developList);}
-	    return false;
-	});
+    var editor, CurrentMode, file, workdir, edit, send;
 
-	function selectFile(file){
-		edit = false;
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/getFileContent',
-			data: "file=" + file,
-			success: function(data){
-				if(data.code == 1){
-					editor.getSession().setValue(data.result);
-					edit = true;
-				}
-				else{
-					$("#error").Popup("Can not load your file, please make sure that you have selected a Software Release", {type:'alert', duration:5000});
-				}
-			}
-		});
-		return;
-	}
+    function selectFile(file) {
+        edit = false;
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/getFileContent',
+            data: "file=" + file,
+            success: function (data) {
+                if (data.code === 1) {
+                    editor.getSession().setValue(data.result);
+                    edit = true;
+                } else {
+                    $("#error").Popup("Can not load your file, please make sure that you have selected a Software Release",
+                                      {type: 'alert', duration: 5000});
+                }
+            }
+        });
+        return;
+    }
 
-	function getmd5sum(){
-		if (send) return;
-		send =true
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/getmd5sum',
-			data: {file: file},
-			success: function(data){
-				if(data.code == 1){
-					$("#md5sum").empty();
-					$("#md5sum").append('md5sum : <span>' + data.result + '</span>');
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-				send = false;
-			}
-		});
-	}
-	function setDevelop(developList){
-	    if (developList==null || developList.length <= 0) return;
-	    editor.navigateFileStart();
-	    editor.find('buildout',{caseSensitive: true,wholeWord: true});
-	    if(!editor.getSelectionRange().isEmpty()){
-		//editor.find("",{caseSensitive: true,wholeWord: true,regExp: true});
-		//if(!editor.getSelectionRange().isEmpty()){
-			//alert("found");
-		//}
-		//else{alert("no found");
-		//}
-	    }
-	    else{
-		$("#error").Popup("Can not found part [buildout]! Please make sure that you have a cfg file", {type:'alert', duration:3000});
-		return;
-	    }
-	    editor.navigateLineEnd();
-	    $.post($SCRIPT_ROOT+"/getPath", {file:developList.join("#")}, function(data) {
-		    if(data.code==1){
-			var result = data.result.split('#');
-			editor.insert("\ndevelop =\n\t" + result[0] + "\n");
-			for(var i=1; i<result.length; i++)
-			    editor.insert("\t" + result[i] + "\n");
-		    }
-	    })
-	    .error(function() {  })
-	    .complete(function(){});
-	    editor.insert("\n");
-	}
-});
\ No newline at end of file
+    function getmd5sum() {
+        if (send) {
+            return;
+        }
+        send = true;
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/getmd5sum',
+            data: {file: file},
+            success: function (data) {
+                if (data.code === 1) {
+                    $("#md5sum").empty();
+                    $("#md5sum").append('md5sum : <span>' + data.result + '</span>');
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+                send = false;
+            }
+        });
+    }
+
+    function setDevelop(developList) {
+        if (developList === null || developList.length <= 0) {
+            return;
+        }
+        editor.navigateFileStart();
+        editor.find('buildout', {caseSensitive: true, wholeWord: true});
+        if (editor.getSelectionRange().isEmpty()) {
+            $("#error").Popup("Can not found part [buildout]! Please make sure that you have a cfg file",
+                              {type: 'alert', duration: 3000});
+            return;
+        }
+        //else {
+        //    //editor.find("",{caseSensitive: true,wholeWord: true,regExp: true});
+        //    //if (!editor.getSelectionRange().isEmpty()) {
+        //            //alert("found");
+        //    //}
+        //    //else{alert("no found");
+        //    //}
+        //}
+        editor.navigateLineEnd();
+        $.post($SCRIPT_ROOT + "/getPath", {file: developList.join("#")}, function (data) {
+            if (data.code === 1) {
+                var i,
+                    result = data.result.split('#');
+                editor.insert("\ndevelop =\n\t" + result[0] + "\n");
+                for (i = 1; i < result.length; i += 1) {
+                    editor.insert("\t" + result[i] + "\n");
+                }
+            }
+        })
+            .error(function () {  })
+            .complete(function () {});
+        editor.insert("\n");
+    }
+
+
+    editor = ace.edit("editor");
+    CurrentMode = require("ace/mode/buildout").Mode;
+    file = $("input#profile").val();
+    workdir = $("input#workdir").val();
+    edit = false;
+    send = false;
+
+    editor.setTheme("ace/theme/crimson_editor");
+
+    editor.getSession().setMode(new CurrentMode());
+    editor.getSession().setTabSize(2);
+    editor.getSession().setUseSoftTabs(true);
+    editor.renderer.setHScrollBarAlwaysVisible(false);
+
+    selectFile(file);
+
+    $("#save").click(function () {
+        if (!edit) {
+            $("#error").Popup("Can not load your file, please make sure that you have selected a Software Release",
+                              {type: 'alert', duration: 5000});
+            return false;
+        }
+        if (send) {
+            return;
+        }
+        send = true;
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/saveFileContent',
+            data: {file: file, content: editor.getSession().getValue()},
+            success: function (data) {
+                if (data.code === 1) {
+                    $("#error").Popup("File Saved!", {type: 'confirm', duration: 2000});
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+                send = false;
+            }
+        });
+        return false;
+    });
+
+    $("#getmd5").click(function () {
+        getmd5sum();
+        return false;
+    });
+
+    $("#adddevelop").click(function () {
+        var developList = [],
+            i = 0;
+        $("#plist li").each(function (index) {
+            var elt = $(this).find("input:checkbox");
+            if (elt.is(":checked")) {
+                developList[i] = workdir + "/" + elt.val();
+                i += 1;
+                elt.attr("checked", false);
+            }
+        });
+        if (developList.length > 0) {
+            setDevelop(developList);
+        }
+        return false;
+    });
+
+});
diff --git a/slapos/runner/static/js/scripts/folder.js b/slapos/runner/static/js/scripts/folder.js
index 939dca4bb28e4acf48789cae5e2593e3127a2b3f..ee9b65d593049d030c6c88a76423a8a5ff62aed8 100644
--- a/slapos/runner/static/js/scripts/folder.js
+++ b/slapos/runner/static/js/scripts/folder.js
@@ -1,129 +1,138 @@
-$(document).ready( function() {
-	var send = false;
-	var cloneRequest;
-  $('#fileNavigator').gsFileManager({ script: $SCRIPT_ROOT+"/fileBrowser", root: "workspace/"});
-	configRadio();
-	$("input#nothing").change(function(){
-		configRadio();
-	});
-	$("input#ssh").change(function(){
-		configRadio();
-	});
-	$("input#https").change(function(){
-		configRadio();
-	});
-	$("#clone").click(function(){
-		if(send){
-			cloneRequest.abort();
-			$("#imgwaitting").fadeOut('normal');
-			$("#clone").empty();
-			$("#clone").append("Clone");
-			send = false;
-			return;
-		}
-		var repo_url = $("input#repo").val();
-		var email = "";
-		var name = "";
-		/* /^(ht|f)tps?:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/ */
-		if($("input#repo").val() === '' || !repo_url.match(/^[\w\d\.\/:~@_-]+$/)){
-			$("#error").Popup("Invalid url for the repository", {type:'alert', duration:3000});
-			return false;
-		}
-		if($("input#name").val() === '' || !$("input#name").val().match(/^[\w\d\._-]+$/)){
-			$("#error").Popup("Invalid project name", {type:'alert', duration:3000});
-			return false;
-		}
-		if($("input#user").val() !== ""){
-			name = $("input#user").val();
-		}
-		if($("input#email").val() !== '' && $("input#email").val() !== "Enter your email adress..."){
-			if(!$("input#email").val().match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)){
-				$("#error").Popup("Please enter a valid email adress!", {type:'alert', duration:3000});
-				return false;
-			}
-			email = $("input#email").val();
-		}
-		if($("input#https").is(':checked')){
-			if($("input#username").val() == "" || !$("input#username").val().match(/^[\w\d\._-]+$/)){
-				$("#error").Popup("Please enter a correct username", {type:'alert', duration:3000});
-				return false;
-			}
-			if($("input#password").val() != ""){
-				if(repo_url.indexOf("https://") != -1){
-					repo_url = "https://" + $("input#username").val() +
-						":" + $("input#password").val() +
-						"@" + repo_url.substring(8);
-				}
-				else{
-					$("#error").Popup("The URL of your repository should start with 'https://'", {type:'alert', duration:3000});
-					return false;
-				}
-			}
-			else{
-				$("#error").Popup("Please enter your password", {type:'alert', duration:3000});
-				return false;
-			}
-		}
-		else if(repo_url.indexOf("https://") != -1){
-			$("#error").Popup("Please select HTTPS Security Mode for this repository", {type:'alert', duration:3000});
-			return false;
-		}
-		$("#imgwaitting").fadeIn('normal');
-		$("#clone").empty();
-		$("#clone").append("Stop");
-		send = true;
-		cloneRequest = $.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/cloneRepository',
-			data: {repo: repo_url, name: ($("input#workdir").val() + "/" +
-				$("input#name").val()), email:email,
-				user:name},
-			success: function(data){
-				if(data.code == 1){
-					$("#file_navigation").fadeIn('normal');
-					$("#error").Popup("Your repository is cloned!", {type:'confirm', duration:3000});
-					$("input#repo").val("Enter the url of your repository...");
-					$("input#name").val("Enter the project name...");
-					$('#fileNavigator').gsFileManager({ script: $SCRIPT_ROOT+"/fileBrowser", root: "workspace/"});
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error'});
-				}
-				$("#imgwaitting").hide();
-				$("#clone").empty();
-				$("#clone").append("Clone");
-				send = false;
-			},
-      error: function(request,error) {
-        $("#error").Popup("unable to clone your project, please check your internet connection", {type:'error', duration:3000});
-        $("#imgwaitting").hide();
+/*jslint undef: true */
+/*global $, document, $SCRIPT_ROOT */
+/* vim: set et sts=4: */
+
+
+$(document).ready(function () {
+    "use strict";
+
+    function configRadio() {
+        $("#modelist li").each(function (index) {
+            var boxselector = "#box" + index;
+            if ($(this).hasClass('checked')) {
+                $(this).removeClass('checked');
+                $(boxselector).slideUp("normal");
+            }
+            if ($(this).find("input:radio").is(':checked')) {
+                $(this).addClass('checked');
+                //change content here
+                $(boxselector).slideDown("normal");
+            }
+            if (index !== 2) {
+                $("input#password").val("");
+                $("input#cpassword").val("");
+            }
+        });
+    }
+
+    var send = false,
+        cloneRequest;
+
+    $('#fileNavigator').gsFileManager({ script: $SCRIPT_ROOT + "/fileBrowser", root: "workspace/"});
+    configRadio();
+    $("input#nothing").change(function () {
+        configRadio();
+    });
+    $("input#ssh").change(function () {
+        configRadio();
+    });
+    $("input#https").change(function () {
+        configRadio();
+    });
+    $("#clone").click(function () {
+        if (send) {
+            cloneRequest.abort();
+            $("#imgwaitting").fadeOut('normal');
+            $("#clone").empty();
+            $("#clone").append("Clone");
+            send = false;
+            return;
+        }
+        var repo_url = $("input#repo").val(),
+            email = "",
+            name = "";
+
+        /* /^(ht|f)tps?:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/ */
+        if ($("input#repo").val() === '' || !repo_url.match(/^[\w\d\.\/:~@_\-]+$/)) {
+            $("#error").Popup("Invalid url for the repository", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if ($("input#name").val() === '' || !$("input#name").val().match(/^[\w\d\._\-]+$/)) {
+            $("#error").Popup("Invalid project name", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if ($("input#user").val() !== "") {
+            name = $("input#user").val();
+        }
+        if ($("input#email").val() !== '' && $("input#email").val() !== "Enter your email adress...") {
+            if (!$("input#email").val().match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)) {
+                $("#error").Popup("Please enter a valid email adress!", {type: 'alert', duration: 3000});
+                return false;
+            }
+            email = $("input#email").val();
+        }
+        if ($("input#https").is(':checked')) {
+            if ($("input#username").val() === "" || !$("input#username").val().match(/^[\w\d\._\-]+$/)) {
+                $("#error").Popup("Please enter a correct username", {type: 'alert', duration: 3000});
+                return false;
+            }
+            if ($("input#password").val() !== "") {
+                if (repo_url.indexOf("https://") !== -1) {
+                    repo_url = "https://" + $("input#username").val() +
+                        ":" + $("input#password").val() +
+                        "@" + repo_url.substring(8);
+                } else {
+                    $("#error").Popup("The URL of your repository should start with 'https://'", {type: 'alert', duration: 3000});
+                    return false;
+                }
+            } else {
+                $("#error").Popup("Please enter your password", {type: 'alert', duration: 3000});
+                return false;
+            }
+        } else if (repo_url.indexOf("https://") !== -1) {
+            $("#error").Popup("Please select HTTPS Security Mode for this repository", {type: 'alert', duration: 3000});
+            return false;
+        }
+        $("#imgwaitting").fadeIn('normal');
         $("#clone").empty();
-				$("#clone").append("Clone");
-      }
-		});
-		return false;
-	});
-	function configRadio(){
-		$("#modelist li").each(function(index) {
-			var boxselector = "#box" + index;
-			if($(this).hasClass('checked')){
-				$(this).removeClass('checked');
-				$(boxselector).slideUp("normal");
-			}
-			if($(this).find("input:radio").is(':checked')){
-				$(this).addClass('checked');
-				//change content here
-				$(boxselector).slideDown("normal");
-			}
-			if(index != 2){
-				$("input#password").val("");
-				$("input#cpassword").val("");
-			}
-		});
-	}
+        $("#clone").append("Stop");
+        send = true;
+        cloneRequest = $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/cloneRepository',
+            data: {
+                repo: repo_url,
+                name: $("input#workdir").val() + "/" + $("input#name").val(),
+                email: email,
+                user: name
+            },
+            success: function (data) {
+                if (data.code === 1) {
+                    $("#file_navigation").fadeIn('normal');
+                    $("#error").Popup("Your repository is cloned!", {type: 'confirm', duration: 3000});
+                    $("input#repo").val("Enter the url of your repository...");
+                    $("input#name").val("Enter the project name...");
+                    $('#fileNavigator').gsFileManager({ script: $SCRIPT_ROOT + "/fileBrowser", root: "workspace/"});
+                } else {
+                    $("#error").Popup(data.result, {type: 'error'});
+                }
+                $("#imgwaitting").hide();
+                $("#clone").empty();
+                $("#clone").append("Clone");
+                send = false;
+            },
+            error: function (request, error) {
+                $("#error").Popup("unable to clone your project, please check your internet connection", {type: 'error', duration: 3000});
+                $("#imgwaitting").hide();
+                $("#clone").empty();
+                $("#clone").append("Clone");
+            }
+        });
+        return false;
+    });
 
-	function selectFile(file){
-		//nothing
-		return;
-	}
-});
\ No newline at end of file
+    function selectFile(file) {
+        //nothing
+        return;
+    }
+});
diff --git a/slapos/runner/static/js/scripts/inspectInstance.js b/slapos/runner/static/js/scripts/inspectInstance.js
index 47b145b088fe35b225ad1b3daeec0de93009ace7..21d703a8ce5f2b7a538623bce655d1d302293cd2 100644
--- a/slapos/runner/static/js/scripts/inspectInstance.js
+++ b/slapos/runner/static/js/scripts/inspectInstance.js
@@ -1,263 +1,307 @@
-$(document).ready(function() {
-  var editor;
-  setupFileTree();
-  $($('#slappart li')[0]).find('input:radio').attr('checked', true);
-  $('.menu-box-right>div').css('min-height', $('#slappart li').length * 26 + 20 + 'px');
-  configRadio();
-  var send = false;
-  var lastli = null;
-  var partitionAmount = $('input#partitionAmount').val();
-  $('#slappart li').each(function() {
-    lastli = $(this);
-    $(this).find('input:radio').change(function() {
-      configRadio();
-    });
-  });
-  if (lastli) {lastli.css('border-bottom', 'none');}
+/*jslint undef: true */
+/*global $, document, window, alert, $SCRIPT_ROOT, setInput, ace */
+/* vim: set et sts=4: */
 
-  $('#parameterkw').slideBox('show');
-  setupSlappart();
-  $('#reloadfiles').click(function() {
-    setupFileTree();
-  });
-  $('#refresh').click(function() {
-    if (send) return;
-    $('#imgwaitting').fadeIn();
-    $.ajax({
-        type: 'GET',
-      url: $SCRIPT_ROOT + '/supervisordStatus',
-      data: '',
-      success: function(data) {
-            if (data.code == 1) {
-                $('#supervisordcontent').empty();
-                $('#supervisordcontent').append(data.result);
-            }
-            $('#imgwaitting').fadeOut();
-      }
-    });
-    return false;
-  });
-  $('#add_attribute').click(function() {
-    var size = Number($('#partitionParameter > tbody > tr').last().attr('id').split('_')[1]) + 1;
-    var row = "<tr id='row_" + size + "'><td class='first'><input type='text' name='txt_" + size + "' id='txt_" + size + "'></td>" +
-            "<td style='padding:6px'><textarea class='slap' id='value_" + size + "'></textarea>" +
-            "</td><td valign='middle'><span style='margin-left: 10px;' id='btn_" + size + "' class='close'></span></td></tr>";
-    $('#partitionParameter').append(row);
-    setInput($('input#txt_' + size));
-    setupTextarea($('textarea#value_' + size));
-    $('#btn_' + size).click(function() {
-      var index = $(this).attr('id').split('_')[1];
-      $('tr#row_' + index).remove();
-    });
-    return false;
-  });
-  $('#updateParameters').click(function() {
-    updateParameter();
-    return false;
-  });
-  $('#xmlview').click(function() {
-    var content = '<h2 style="color: #4c6172; font: 18px \'Helvetica Neue\', Helvetica, Arial, sans-serif;">' +
-      'INSTANCE PARAMETERS: Load XML file</h2><p id="xmllog" class="message"><br/></p>';
-    content += '<div class="main_content" style="height:230px"><pre id="editor"></pre></div>' +
-      '<input type=submit value="Load" id="loadxml" class="button">';
-    $.ajax({
-    type: 'GET',
-    url: $SCRIPT_ROOT + '/getParameterXml/xml',
-    success: function(data){
-      if(data.code == 1){
-        $("#inline_instance").html(content);
-        setupEditor(true);
-        $("a#inlineInstance").colorbox({inline:true, width: "600px", height: "410px", onComplete:function(){
-          editor.getSession().setValue(data.result);
-        }});
-        $("a#inlineInstance").click();
-        $("#loadxml").click(function(){
-          //Parse XML file
-          try {
-            var xmlDoc = $.parseXML(editor.getSession().getValue()), $xml = $(xmlDoc);
-            if ($xml.find('parsererror').length !== 0) {$('p#xmllog').html('Error: Invalid XML document!<br/>');return false;}
-          } catch (err) {
-            $('p#xmllog').html('Error: Invalid XML document!<br/>');return false;
-          }
-          $.ajax({
-            type: 'POST',
-            url: $SCRIPT_ROOT + '/saveParameterXml',
-            data: {software_type: '', parameter: editor.getSession().getValue()},
-            success: function(data) {
-              if (data.code == 1) {
-                location.href = $SCRIPT_ROOT + '/inspectInstance#tab3';
-                location.reload();
-              }
-              else {$('p#xmllog').html(data.result);}
+$(document).ready(function () {
+    "use strict";
+
+    var editor,
+        send = false,
+        lastli = null,
+        partitionAmount = $('input#partitionAmount').val();
+
+    function setupTextarea($txt) {
+        var size = Number($txt.attr('id').split('_')[1]),
+            hiddenDiv = $(document.createElement('div')),
+            content = null;
+        hiddenDiv.attr('id', 'div_' + size);
+        hiddenDiv.addClass('hiddendiv');
+        $('div#parameterkw').append(hiddenDiv);
+        $txt.keyup(function () {
+            content = $txt.val().replace(/\n/g, '<br>');
+            hiddenDiv.html(content);
+            if (hiddenDiv.height() > $txt.height() && hiddenDiv.height() > 120) {
+                return;
             }
-          });
-          return false;
+            $txt.css('height', hiddenDiv.height() + 'px');
         });
-      }
-      else {
-        $('#error').Popup(data.result, {type: 'error', duration: 5000});
-      }
-    }
-    });
-  });
-  //Load previous instance parameters
-  loadParameter();
-  $('a#parameterTab').click(function() {
-    var size = $('#partitionParameter > tbody > tr').length;
-    for (var i = 2; i <= size; i++) {
-      $('textarea#value_' + i).keyup();
     }
-  });
 
-  function setupFileTree(path){
-    var root = $("input#root").val();
-    if (root === '') return;
-    if (path){
-      root += '/' + path + '/';
+    function setupFileTree(path) {
+        var root = $("input#root").val();
+        if (root === '') {
+            return;
+        }
+        if (path) {
+            root += '/' + path + '/';
+        } else {
+            root += '/';
+        }
+        $('#fileNavigator').gsFileManager({script: $SCRIPT_ROOT + "/fileBrowser", root: root});
     }
-    else{root += '/';}
-    $('#fileNavigator').gsFileManager({ script: $SCRIPT_ROOT+"/fileBrowser", root: root});
-  }
 
-  $("#parameter").load($SCRIPT_ROOT + '/getParameterXml');
-  $("#update").click(function(){
-    if($("#parameter").val() === ''){
-        $("#error").Popup("Can not save empty value!", {type:'alert', duration:3000});
+    function configRadio() {
+        $('#slappart li').each(function () {
+            var $radio = $(this).find('input:radio'),
+                boxselector = '#box' + $radio.attr('id');
+
+            if ($(this).hasClass('checked')) {
+                $(this).removeClass('checked');
+                $(boxselector).slideUp('normal');
+            }
+            if ($radio.is(':checked')) {
+                $(this).addClass('checked');
+                //change content here
+                $(boxselector).slideDown('normal');
+            }
+        });
     }
-    $.ajax({
-        type: 'POST',
-      url: $SCRIPT_ROOT + '/saveParameterXml',
-      data: {parameter: $('#parameter').val().trim()},
-      success: function(data) {
-            if (data.code == 1) {
-                $('#error').Popup('Instance parameters updated!', {type: 'info', duration: 3000});
+
+    function setupSlappart() {
+        var i, elt, fileId;
+        for (i = 0; i < partitionAmount; i += 1) {
+            elt = $('#slappart' + i + 'Parameter');
+            fileId = $('#slappart' + i + 'Files');
+
+            if (elt && elt !== undefined) {
+                elt.click(function () {
+                    alert($(this).html());
+                });
             }
-            else {
-                $('#error').Popup(data.result, {type: 'error', duration: 5000});
+            if (fileId && fileId !== undefined) {
+                fileId.click(function () {
+                    $('#instancetabfiles').click();
+                    setupFileTree($(this).attr('rel'));
+                });
             }
-      }
-    });
-  });
+        }
+    }
 
-  function updateParameter() {
-    var xml = '<?xml version="1.0" encoding="utf-8"?>\n',
-        software_type = '',
-        software_type_input_value = $('input#software_type').val();
-    if (software_type_input_value !== '' && software_type_input_value !== 'Software Type here...') {
-      software_type = software_type_input_value;
+    function updateParameter() {
+        var xml = '<?xml version="1.0" encoding="utf-8"?>\n',
+            software_type = '',
+            software_type_input_value = $('input#software_type').val(),
+            size = $('#partitionParameter > tbody > tr').length,
+            i;
+
+        if (software_type_input_value !== '' && software_type_input_value !== 'Software Type here...') {
+            software_type = software_type_input_value;
+        }
+        xml += '<instance>\n';
+        if (size > 1) {
+            for (i = 2; i <= size; i += 1) {
+                if ($('input#txt_' + i).val() !== '') {
+                    xml += '<parameter id="' + $('input#txt_' + i).val() + '">' + $('textarea#value_' + i).val() + '</parameter>\n';
+                }
+            }
+        }
+        xml += '</instance>\n';
+        $.ajax({
+            type: 'POST',
+            url: $SCRIPT_ROOT + '/saveParameterXml',
+            data: {software_type: software_type, parameter: xml},
+            success: function (data) {
+                if (data.code === 1) {
+                    $('#error').Popup('Instance parameters has been updated, please run your instance now!', {type: 'confirm', duration: 5000});
+                } else {
+                    $('#error').Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
     }
-    xml += '<instance>\n';
-    var size = $('#partitionParameter > tbody > tr').length;
-    if (size > 1) {
-      for (var i = 2; i <= size; i++) {
-        if ($('input#txt_' + i).val() != '') {
-          xml += '<parameter id="' + $('input#txt_' + i).val() + '">' + $('textarea#value_' + i).val() + '</parameter>\n';
+
+    function setupEditor(editable) {
+        editor = ace.edit('editor');
+        editor.setTheme('ace/theme/crimson_editor');
+
+        var CurentMode = require('ace/mode/text').Mode;
+        editor.getSession().setMode(new CurentMode());
+        editor.getSession().setTabSize(2);
+        editor.getSession().setUseSoftTabs(true);
+        editor.renderer.setHScrollBarAlwaysVisible(false);
+        if (!editable) {
+            editor.setReadOnly(true);
         }
-      }
     }
-    xml += '</instance>\n';
-    $.ajax({
-    type: 'POST',
-    url: $SCRIPT_ROOT + '/saveParameterXml',
-    data: {software_type: software_type, parameter: xml},
-    success: function(data) {
-      if (data.code == 1) {
-        $('#error').Popup('Instance parameters has been updated, please run your instance now!', {type: 'confirm', duration: 5000});
-      }
-      else {
-        $('#error').Popup(data.result, {type: 'error', duration: 5000});
-      }
+
+    function loadParameter() {
+        $.ajax({
+            type: 'GET',
+            url: $SCRIPT_ROOT + '/getParameterXml/dict',
+            success: function (data) {
+                var dict, propertie, size;
+                if (data.code === 1) {
+                    dict = data.result.instance;
+                    for (propertie in dict) {
+                        $("#add_attribute").click();
+                        size = Number($("#partitionParameter > tbody > tr").last().attr('id').split('_')[1]);
+                        $("input#txt_" + size).val(propertie);
+                        $("textarea#value_" + size).val(dict[propertie]);
+                        $("textarea#value_" + size).keyup();
+                    }
+                } else {
+                    $('#error').Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
     }
+
+    setupFileTree();
+    $($('#slappart li')[0]).find('input:radio').attr('checked', true);
+    $('.menu-box-right>div').css('min-height', $('#slappart li').length * 26 + 20 + 'px');
+    configRadio();
+    $('#slappart li').each(function () {
+        lastli = $(this);
+        $(this).find('input:radio').change(function () {
+            configRadio();
+        });
     });
-  }
-  function setupTextarea($txt) {
-    var size = Number($txt.attr('id').split('_')[1]);
-    var hiddenDiv = $(document.createElement('div')),
-    content = null;
-    hiddenDiv.attr('id', 'div_' + size);
-    hiddenDiv.addClass('hiddendiv');
-    $('div#parameterkw').append(hiddenDiv);
-    $txt.keyup(function() {
-      content = $txt.val().replace(/\n/g, '<br>');
-      hiddenDiv.html(content);
-      if (hiddenDiv.height() > $txt.height() && hiddenDiv.height() > 120) {
-        return;
-      }
-      $txt.css('height', hiddenDiv.height() + 'px');
+    if (lastli) {
+        lastli.css('border-bottom', 'none');
+    }
+
+    $('#parameterkw').slideBox('show');
+    setupSlappart();
+    $('#reloadfiles').click(function () {
+        setupFileTree();
     });
-  }
-  function loadParameter() {
-    $.ajax({
-    type: 'GET',
-    url: $SCRIPT_ROOT + '/getParameterXml/dict',
-    success: function(data){
-      if(data.code == 1){
-        var dict = data.result['instance'];
-        for (var propertie in dict){
-          $("#add_attribute").click();
-          var size = Number($("#partitionParameter > tbody > tr").last().attr('id').split('_')[1]);
-          $("input#txt_"+size).val(propertie);
-          $("textarea#value_"+size).val(dict[propertie]);
-          $("textarea#value_"+size).keyup();
+    $('#refresh').click(function () {
+        if (send) {
+            return;
         }
-      }
-      else {
-        $('#error').Popup(data.result, {type: 'error', duration: 5000});
-      }
-    }
+        $('#imgwaitting').fadeIn();
+        $.ajax({
+            type: 'GET',
+            url: $SCRIPT_ROOT + '/supervisordStatus',
+            data: '',
+            success: function (data) {
+                if (data.code === 1) {
+                    $('#supervisordcontent').empty();
+                    $('#supervisordcontent').append(data.result);
+                }
+                $('#imgwaitting').fadeOut();
+            }
+        });
+        return false;
+    });
+    $('#add_attribute').click(function () {
+        var size = Number($('#partitionParameter > tbody > tr').last().attr('id').split('_')[1]) + 1,
+            row = "<tr id='row_" + size + "'><td class='first'><input type='text' name='txt_" + size + "' id='txt_" + size + "'></td>" +
+                "<td style='padding:6px'><textarea class='slap' id='value_" + size + "'></textarea>" +
+                "</td><td valign='middle'><span style='margin-left: 10px;' id='btn_" + size + "' class='close'></span></td></tr>";
+        $('#partitionParameter').append(row);
+        setInput($('input#txt_' + size));
+        setupTextarea($('textarea#value_' + size));
+        $('#btn_' + size).click(function () {
+            var index = $(this).attr('id').split('_')[1];
+            $('tr#row_' + index).remove();
+        });
+        return false;
+    });
+    $('#updateParameters').click(function () {
+        updateParameter();
+        return false;
     });
-  }
-  function configRadio() {
-    $('#slappart li').each(function() {
-      var $radio = $(this).find('input:radio');
-      var boxselector = '#box' + $radio.attr('id');
-      if ($(this).hasClass('checked')) {
-        $(this).removeClass('checked');
-        $(boxselector).slideUp('normal');
-      }
-      if ($radio.is(':checked')) {
-        $(this).addClass('checked');
-        //change content here
-        $(boxselector).slideDown('normal');
+    $('#xmlview').click(function () {
+        var content = '<h2 style="color: #4c6172; font: 18px \'Helvetica Neue\', Helvetica, Arial, sans-serif;">' +
+            'INSTANCE PARAMETERS: Load XML file</h2><p id="xmllog" class="message"><br/></p>';
+        content += '<div class="main_content" style="height:230px"><pre id="editor"></pre></div>' +
+            '<input type=submit value="Load" id="loadxml" class="button">';
+        $.ajax({
+            type: 'GET',
+            url: $SCRIPT_ROOT + '/getParameterXml/xml',
+            success: function (data) {
+                if (data.code === 1) {
+                    $("#inline_instance").html(content);
+                    setupEditor(true);
+                    $("a#inlineInstance").colorbox(
+                        {
+                            inline: true,
+                            width: "600px",
+                            height: "410px",
+                            onComplete: function () {
+                                editor.getSession().setValue(data.result);
+                            }
+                        }
+                    );
 
-      }
+                    $("a#inlineInstance").click();
+                    $("#loadxml").click(function () {
+                        //Parse XML file
+                        try {
+                            var xmlDoc = $.parseXML(editor.getSession().getValue()), $xml = $(xmlDoc);
+                            if ($xml.find('parsererror').length !== 0) {
+                                $('p#xmllog').html('Error: Invalid XML document!<br/>');
+                                return false;
+                            }
+                        } catch (err) {
+                            $('p#xmllog').html('Error: Invalid XML document!<br/>');
+                            return false;
+                        }
+                        $.ajax({
+                            type: 'POST',
+                            url: $SCRIPT_ROOT + '/saveParameterXml',
+                            data: {
+                                software_type: '',
+                                parameter: editor.getSession().getValue()
+                            },
+                            success: function (data) {
+                                if (data.code === 1) {
+                                    window.location.href = $SCRIPT_ROOT + '/inspectInstance#tab3';
+                                    window.location.reload();
+                                } else {
+                                    $('p#xmllog').html(data.result);
+                                }
+                            }
+                        });
+                        return false;
+                    });
+                } else {
+                    $('#error').Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
+    });
+    //Load previous instance parameters
+    loadParameter();
+    $('a#parameterTab').click(function () {
+        var i,
+            size = $('#partitionParameter > tbody > tr').length;
+        for (i = 2; i <= size; i += 1) {
+            $('textarea#value_' + i).keyup();
+        }
     });
-  }
-  function setupBox() {
-    var state = $('#softwareType').css('display');
-    if (state == 'none') {
-      $('#softwareType').slideDown('normal');
-      $('#softwareTypeHead').removeClass('hide');
-      $('#softwareTypeHead').addClass('show');
-    }
-    else {
-      $('#softwareType').slideUp('normal');
-      $('#softwareTypeHead').removeClass('show');
-      $('#softwareTypeHead').addClass('hide');
-    }
-  }
-  function setupEditor(editable) {
-    editor = ace.edit('editor');
-    editor.setTheme('ace/theme/crimson_editor');
 
-    var CurentMode = require('ace/mode/text').Mode;
-    editor.getSession().setMode(new CurentMode());
-    editor.getSession().setTabSize(2);
-    editor.getSession().setUseSoftTabs(true);
-    editor.renderer.setHScrollBarAlwaysVisible(false);
-    if (!editable) {editor.setReadOnly(true);}
-  }
-  function setupSlappart() {
-    for (var i = 0; i < partitionAmount; i++) {
-      var elt = $('#slappart' + i + 'Parameter');
-      var fileId = $('#slappart' + i + 'Files');
-      if (elt && elt !== undefined) elt.click(function() {
-        alert($(this).html());
-      });
-      if (fileId && fileId !== undefined) fileId.click(function() {
-        $('#instancetabfiles').click();
-        setupFileTree($(this).attr('rel'));
-      });
+    $("#parameter").load($SCRIPT_ROOT + '/getParameterXml');
+    $("#update").click(function () {
+        if ($("#parameter").val() === '') {
+            $("#error").Popup("Can not save empty value!", {type: 'alert', duration: 3000});
+        }
+        $.ajax({
+            type: 'POST',
+            url: $SCRIPT_ROOT + '/saveParameterXml',
+            data: {parameter: $('#parameter').val().trim()},
+            success: function (data) {
+                if (data.code === 1) {
+                    $('#error').Popup('Instance parameters updated!', {type: 'info', duration: 3000});
+                } else {
+                    $('#error').Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
+    });
+
+
+    function setupBox() {
+        var state = $('#softwareType').css('display');
+        if (state === 'none') {
+            $('#softwareType').slideDown('normal');
+            $('#softwareTypeHead').removeClass('hide');
+            $('#softwareTypeHead').addClass('show');
+        } else {
+            $('#softwareType').slideUp('normal');
+            $('#softwareTypeHead').removeClass('show');
+            $('#softwareTypeHead').addClass('hide');
+        }
     }
-  }
 });
diff --git a/slapos/runner/static/js/scripts/inspectSoftware.js b/slapos/runner/static/js/scripts/inspectSoftware.js
index d5859ef8292870349a872a3c2a9882c0a8f0b92d..e1429338e91091cdfaee9453c2dc51c084e0658d 100644
--- a/slapos/runner/static/js/scripts/inspectSoftware.js
+++ b/slapos/runner/static/js/scripts/inspectSoftware.js
@@ -1,86 +1,99 @@
-$(document).ready( function() {
-	var editor;
-	var send = false;
-	var runnerDir = $("input#runnerdir").val();
-	$("#reloadfiles").click(function(){
-    fillContent();
-  });
-	fillContent();
+/*jslint undef: true */
+/*global $, document, window, $SCRIPT_ROOT, ace */
+/* vim: set et sts=4: */
 
-	function fillContent(){
-		$('#fileNavigator').gsFileManager({ script: $SCRIPT_ROOT+"/fileBrowser", root: runnerDir});
-	}
 
-	$("#open").click(function(){
-		var elt = $("option:selected", $("#softwarelist"));
-    if(elt.val() === "No Software Release found"){
-        $("#error").Popup("Please select your Software Release", {type:'alert', duration:5000});
-        return false;
+$(document).ready(function () {
+    "use strict";
+
+    var editor,
+        send = false,
+        runnerDir = $("input#runnerdir").val();
+
+    function fillContent() {
+        $('#fileNavigator').gsFileManager({script: $SCRIPT_ROOT + "/fileBrowser", root: runnerDir});
     }
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/setCurrentProject',
-			data: "path=" + elt.attr('rel'),
-			success: function(data){
-				if(data.code == 1){
-					location.href = $SCRIPT_ROOT + '/editSoftwareProfile'
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-			}
-		});
-		return false;
-	});
 
-	$("#delete").click(function(){
-    if($("#softwarelist").val() === "No Software Release found"){
-        $("#error").Popup("Please select your Software Release", {type:'alert', duration:5000});
+    $("#reloadfiles").click(function () {
+        fillContent();
+    });
+    fillContent();
+
+    $("#open").click(function () {
+        var elt = $("option:selected", $("#softwarelist"));
+        if (elt.val() === "No Software Release found") {
+            $("#error").Popup("Please select your Software Release", {type: 'alert', duration: 5000});
+            return false;
+        }
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/setCurrentProject',
+            data: "path=" + elt.attr('rel'),
+            success: function (data) {
+                if (data.code === 1) {
+                    window.location.href = $SCRIPT_ROOT + '/editSoftwareProfile';
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
         return false;
-    }
-		if(send) return;
-    if(!window.confirm("Do you really want to delete this software release?")){
-      return;
-    }
-		send = false;
-    var elt = $("option:selected", $("#softwarelist"));
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/removeSoftwareDir',
-			data: {md5:$("#softwarelist").val(), title:elt.attr('title')},
-			success: function(data){
-				if(data.code == 1){
-					$("#softwarelist").empty();
-					for(var i=0; i<data.result.length; i++){
-						$("#softwarelist").append('<option value="' + data.result[i]['md5'] +
-							'" title="' + data.result[i]['title'] +'" rel="' +
-							data.result[i]['path'] +'">' + data.result[i]['title'] + '</option>');
-					}
-          if(data.result.length < 1){
-             $("#softwarelist").append('<option>No Software Release found</option>');
-             $('#fileTree').empty();
-          }
-          fillContent();
-					$("#error").Popup("Operation complete, Selected Software Release has been delete!", {type:'confirm', duration:5000});
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error'});
-				}
-				send = false;
-			}
-		});
-		return false;
-	});
+    });
 
-	function setupEditor(){
-		editor = ace.edit("editor");
-		editor.setTheme("ace/theme/crimson_editor");
+    $("#delete").click(function () {
+        if ($("#softwarelist").val() === "No Software Release found") {
+            $("#error").Popup("Please select your Software Release", {type: 'alert', duration: 5000});
+            return false;
+        }
+        if (send) {
+            return;
+        }
+        if (!window.confirm("Do you really want to delete this software release?")) {
+            return;
+        }
+        send = false;
+        var elt = $("option:selected", $("#softwarelist"));
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/removeSoftwareDir',
+            data: {
+                md5: $("#softwarelist").val(),
+                title: elt.attr('title')
+            },
+            success: function (data) {
+                var i;
+                if (data.code === 1) {
+                    $("#softwarelist").empty();
+                    for (i = 0; i < data.result.length; i += 1) {
+                        $("#softwarelist").append('<option value="' + data.result[i].md5 +
+                            '" title="' + data.result[i].title + '" rel="' +
+                            data.result[i].path + '">' + data.result[i].title + '</option>');
+                    }
+                    if (data.result.length < 1) {
+                        $("#softwarelist").append('<option>No Software Release found</option>');
+                        $('#fileTree').empty();
+                    }
+                    fillContent();
+                    $("#error").Popup("Operation complete, Selected Software Release has been delete!",
+                                      {type: 'confirm', duration: 5000});
+                } else {
+                    $("#error").Popup(data.result, {type: 'error'});
+                }
+                send = false;
+            }
+        });
+        return false;
+    });
 
-		var CurentMode = require("ace/mode/text").Mode;
-		editor.getSession().setMode(new CurentMode());
-		editor.getSession().setTabSize(2);
-		editor.getSession().setUseSoftTabs(true);
-		editor.renderer.setHScrollBarAlwaysVisible(false);
-		editor.setReadOnly(true);
-	}
-});
\ No newline at end of file
+    function setupEditor() {
+        editor = ace.edit("editor");
+        editor.setTheme("ace/theme/crimson_editor");
+
+        var CurentMode = require("ace/mode/text").Mode;
+        editor.getSession().setMode(new CurentMode());
+        editor.getSession().setTabSize(2);
+        editor.getSession().setUseSoftTabs(true);
+        editor.renderer.setHScrollBarAlwaysVisible(false);
+        editor.setReadOnly(true);
+    }
+});
diff --git a/slapos/runner/static/js/scripts/login.js b/slapos/runner/static/js/scripts/login.js
index 7239ff5e2d03777003a32df8b967324abbb69efc..d10d9b00e781efe07fe221fd287b7fd7e8239ee4 100644
--- a/slapos/runner/static/js/scripts/login.js
+++ b/slapos/runner/static/js/scripts/login.js
@@ -1,36 +1,45 @@
-$(document).ready( function() {
-  var send = false;
-  //change background
-  $("body").css("background", "#9C9C9C");
-	$("#login").click(function(){
-    if (send) return false;
-		if($("input#clogin").val() === "" || !$("input#clogin").val().match(/^[\w\d\.-]+$/)){
-			$("#error").Popup("Please enter a valid user name", {type:'alert', duration:3000});
-			return false;
-		}
-		if($("input#cpwd").val() === "" || $("input#cpwd").val() ==="******"){
-			$("#error").Popup("Please enter your password", {type:'alert', duration:3000});
-			return false;
-		}
-    send = true;
-    var param = {clogin:$("input#clogin").val(), cpwd:$("input#cpwd").val()};
-    var url = $SCRIPT_ROOT + "/doLogin";
-    $("#login").removeClass("button").addClass("dsblebutton");
-    $.post(url, param, function(data) {
-      if (data.code==1){
-        location.href = $SCRIPT_ROOT + '/';
-      }
-      else{
-        $("#error").Popup(data.result, {type:'alert', duration:3000});
-      }
-    })
-    .error(function() {
-      $("#error").Popup("Cannot send your account identifier please try again!!",
-      {type:'alert', duration:3000});})
-    .complete(function() {
-      $("#login").removeClass('dsblebutton').addClass('button');
-      send = false;
+/*jslint undef: true */
+/*global $, document, window, $SCRIPT_ROOT */
+/* vim: set et sts=4: */
+
+$(document).ready(function () {
+    "use strict";
+
+    var send = false;
+    //change background
+    $("body").css("background", "#9C9C9C");
+    $("#login").click(function () {
+        if (send) {
+            return false;
+        }
+        if ($("input#clogin").val() === "" || !$("input#clogin").val().match(/^[\w\d\.\-]+$/)) {
+            $("#error").Popup("Please enter a valid user name", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if ($("input#cpwd").val() === "" || $("input#cpwd").val() === "******") {
+            $("#error").Popup("Please enter your password", {type: 'alert', duration: 3000});
+            return false;
+        }
+        send = true;
+        var param = { clogin: $("input#clogin").val(), cpwd: $("input#cpwd").val() },
+            url = $SCRIPT_ROOT + "/doLogin";
+
+        $("#login").removeClass("button").addClass("dsblebutton");
+        $.post(url, param, function (data) {
+            if (data.code === 1) {
+                window.location.href = $SCRIPT_ROOT + '/';
+            } else {
+                $("#error").Popup(data.result, {type: 'alert', duration: 3000});
+            }
+        })
+            .error(function () {
+                $("#error").Popup("Cannot send your account identifier please try again!!",
+                                  {type: 'alert', duration: 3000});
+            })
+            .complete(function () {
+                $("#login").removeClass('dsblebutton').addClass('button');
+                send = false;
+            });
+        return false;
     });
-    return false;
-	});
-});
\ No newline at end of file
+});
diff --git a/slapos/runner/static/js/scripts/process.js b/slapos/runner/static/js/scripts/process.js
index e8cb66b39f39c7f905513b7ed8aa68dae566b21c..6256393784231ee3f8a1cecf5b69d37732c60560 100644
--- a/slapos/runner/static/js/scripts/process.js
+++ b/slapos/runner/static/js/scripts/process.js
@@ -1,5 +1,13 @@
+/*jslint undef: true */
+/*global $, window, $SCRIPT_ROOT, setRunningState, setCookie, getCookie, deleteCookie */
+/*global currentState: true, running: true, $current: true, processType: true, currentProcess: true */
+/*global sendStop: true, processState: true, openedlogpage: true, logReadingPosition: true, speed: true */
+/*global isRunning: true */
+/* vim: set et sts=4: */
+
 //Global Traitment!!!
-var url = $SCRIPT_ROOT + "/slapgridResult"
+
+var url = $SCRIPT_ROOT + "/slapgridResult";
 var currentState = false;
 var running = true;
 var $current;
@@ -10,151 +18,183 @@ var processState = "Checking"; //define slapgrid running state
 var openedlogpage = ""; //content software or instance if the current page is software or instance log, otherwise nothing
 var logReadingPosition = 0;
 var speed = 5000;
-var isRunning = function(){
-  if (running){
-    $("#error").Popup("Slapgrid is currently under execution!", {type:'alert', duration:3000});
-  }
-  return running;
-}
-function setSpeed(value){
-  if (openedlogpage == ""){
-    speed = 5000;
-  }
-  else{ speed=value;}
-}
-function getRunningState(){
-  var param = {position:logReadingPosition, log:(processState!="Checking" && openedlogpage==processType.toLowerCase())? openedlogpage:""}
-  var jqxhr = $.post(url, param, function(data) {
-      setRunningState(data)
-      logReadingPosition = data.content.position;
-      if(data.content.content != ""){
-        $("#salpgridLog").append(data.content.content.toHtmlChar());
-        $("#salpgridLog")
-        .scrollTop($("#salpgridLog")[0].scrollHeight - $("#salpgridLog")
-          .height());
-      }
-      if (running && processState=="Checking" && openedlogpage != ""){$("#salpgridLog").show();$("#manualLog").hide();}
-      processState = (running)?"Running":"Stopped";
-  })
-  .error(function() { clearAll(false); })
-  .complete(function() {
-    if (running){
-      setTimeout(function(){
-        getRunningState();
-      }, speed);
+var isRunning = function () {
+    "use strict";
+    if (running) {
+        $("#error").Popup("Slapgrid is currently under execution!",
+                          {type: 'alert', duration: 3000});
+    }
+    return running;
+};
+
+function setSpeed(value) {
+    "use strict";
+    if (openedlogpage === "") {
+        speed = 5000;
+    } else {
+        speed = value;
     }
-  });
 }
-function clearAll(setStop){
-  currentState = false;
-  running = setStop;
+
+function clearAll(setStop) {
+    "use strict";
+    currentState = false;
+    running = setStop;
 }
-function bindRun(){
-  $("#softrun").click(function(){
-    if($("#softrun").text() == "Stop"){
-      stopProcess();
-    }
-    else{
-      if(!isRunning()){
-        setCookie("slapgridCMD", "Software");
-        location.href = $SCRIPT_ROOT + "/viewSoftwareLog";
-      }
-    }
-    return false;
-  });
-  $("#instrun").click(function(){
-    if($("#instrun").text() == "Stop"){
-      stopProcess();
-    }
-    else{
-      if(!isRunning()){
-        setCookie("slapgridCMD", "Instance");
-        location.href = $SCRIPT_ROOT + "/viewInstanceLog";
-      }
-    }
-    return false;
-  });
+
+function getRunningState() {
+    "use strict";
+    var param = {
+        position: logReadingPosition,
+        log: (processState !== "Checking" && openedlogpage === processType.toLowerCase()) ? openedlogpage : ""
+    },
+        jqxhr = $.post(url, param, function (data) {
+            setRunningState(data);
+            logReadingPosition = data.content.position;
+            if (data.content.content !== "") {
+                $("#salpgridLog").append(data.content.content.toHtmlChar());
+                $("#salpgridLog")
+                    .scrollTop($("#salpgridLog")[0].scrollHeight - $("#salpgridLog").height());
+            }
+            if (running && processState === "Checking" && openedlogpage !== "") {
+                $("#salpgridLog").show();
+                $("#manualLog").hide();
+            }
+            processState = running ? "Running" : "Stopped";
+        })
+        .error(function () {
+            clearAll(false);
+        })
+        .complete(function () {
+            if (running) {
+                setTimeout(function () {
+                    getRunningState();
+                }, speed);
+            }
+        });
 }
-function setRunningState(data){
-  if (data.result){
-    if(!currentState){
-      $("#running").show();
-      running = true;
-      //change run menu title and style
-      if(data.software){
-        $("#softrun").empty();
-        $("#softrun").append("Stop");
-        $("#softrun").css("color", "#0271BF");
-        $current = $("#softrun");
-        processType = "Software";
-      }
-      if(data.instance){
-        $("#instrun").empty();
-        $("#instrun").append("Stop");
-        $("#instrun").css("color", "#0271BF");
-        $current = $("#instrun");
-        processType = "Instance";
-      }
+
+function stopProcess() {
+    "use strict";
+    if (sendStop) {
+        return;
     }
-  }
-  else{
-    $("#running").hide();
-    running = false; //nothing is currently running
-    if ($current != undefined){
-      $current.empty();
-      $current.append("Run");
-      $current.css("color", "#000");
-      $current = undefined;
-      currentState = false;
-      $("#error").Popup("Slapgrid completely finish running your " + processType + " Profile", {type:'info', duration:3000});
+    if (running) {
+        sendStop = true;
+
+        var urlfor = $SCRIPT_ROOT + "stopSlapgrid",
+            type = "slapgrid-sr.pid";
+
+        if ($("#instrun").text() === "Stop") {
+            type = "slapgrid-cp.pid";
+        }
+        $.post(urlfor, {type: type}, function (data) {
+            //if (data.result) {
+                //$("#error").Popup("Failled to run Slapgrid", {type:'error', duration:3000}); });
+            //}
+        })
+            .error(function () {
+                $("#error").Popup("Failed to stop Slapgrid process", {type: 'error', duration: 3000});
+            })
+            .complete(function () {
+                sendStop = false;
+                processState = "Stopped";
+            });
     }
-  }
-  currentState = data.result;
 }
-function runProcess(urlfor, data){
-  if(!isRunning()){
-    running = true;
-    processState = "Running";
-    currentProcess = $.post(urlfor)
-    .error(function() {
-      $("#error").Popup("Failled to run Slapgrid", {type:'error', duration:3000}); });
-    setRunningState(data);
-    setTimeout("getRunningState()", 6000);
-  }
+
+function bindRun() {
+    "use strict";
+    $("#softrun").click(function () {
+        if ($("#softrun").text() === "Stop") {
+            stopProcess();
+        } else {
+            if (!isRunning()) {
+                setCookie("slapgridCMD", "Software");
+                window.location.href = $SCRIPT_ROOT + "/viewSoftwareLog";
+            }
+        }
+        return false;
+    });
+    $("#instrun").click(function () {
+        if ($("#instrun").text() === "Stop") {
+            stopProcess();
+        } else {
+            if (!isRunning()) {
+                setCookie("slapgridCMD", "Instance");
+                window.location.href = $SCRIPT_ROOT + "/viewInstanceLog";
+            }
+        }
+        return false;
+    });
 }
-function stopProcess(){
-  if (sendStop) return;
-  if (running){
-    sendStop = true;
-    var urlfor = $SCRIPT_ROOT + "stopSlapgrid"
-    var type = "slapgrid-sr.pid";
-    if($("#instrun").text() == "Stop"){
-      type = "slapgrid-cp.pid";
+
+function setRunningState(data) {
+    "use strict";
+    if (data.result) {
+        if (!currentState) {
+            $("#running").show();
+            running = true;
+            //change run menu title and style
+            if (data.software) {
+                $("#softrun").empty();
+                $("#softrun").append("Stop");
+                $("#softrun").css("color", "#0271BF");
+                $current = $("#softrun");
+                processType = "Software";
+            }
+            if (data.instance) {
+                $("#instrun").empty();
+                $("#instrun").append("Stop");
+                $("#instrun").css("color", "#0271BF");
+                $current = $("#instrun");
+                processType = "Instance";
+            }
+        }
+    } else {
+        $("#running").hide();
+        running = false; //nothing is currently running
+        if ($current !== undefined) {
+            $current.empty();
+            $current.append("Run");
+            $current.css("color", "#000");
+            $current = undefined;
+            currentState = false;
+            $("#error").Popup("Slapgrid completely finish running your " + processType + " Profile", {type: 'info', duration: 3000});
+        }
     }
-    $.post(urlfor, {type:type}, function(data){
-      //if (data.result){
-        //$("#error").Popup("Failled to run Slapgrid", {type:'error', duration:3000}); });
-      //}
-    })
-    .error(function() {
-      $("#error").Popup("Failled to stop Slapgrid process", {type:'error', duration:3000}); })
-    .complete(function() {sendStop = false;processState="Stopped";});
-  }
+    currentState = data.result;
 }
 
-function checkSavedCmd(){
-  var result = getCookie("slapgridCMD");
-  if (!result) return false;
-  if (result == "Software"){
-    running = false;
-    runProcess(($SCRIPT_ROOT + "/runSoftwareProfile"),
-      {result: true, instance:false, software:true});
-  }
-  else if(result == "Instance"){
-    running = false;
-    runProcess(($SCRIPT_ROOT + "/runInstanceProfile"),
-      {result: true, instance:true, software:false});
-  }
-  deleteCookie("slapgridCMD");
-  return (result != null);
-}
\ No newline at end of file
+function runProcess(urlfor, data) {
+    "use strict";
+    if (!isRunning()) {
+        running = true;
+        processState = "Running";
+        currentProcess = $.post(urlfor)
+            .error(function () {
+                $("#error").Popup("Failled to run Slapgrid", {type: 'error', duration: 3000});
+            });
+        setRunningState(data);
+        setTimeout(getRunningState, 6000);
+    }
+}
+
+function checkSavedCmd() {
+    "use strict";
+    var result = getCookie("slapgridCMD");
+    if (!result) {
+        return false;
+    }
+    if (result === "Software") {
+        running = false;
+        runProcess(($SCRIPT_ROOT + "/runSoftwareProfile"),
+                   {result: true, instance: false, software: true});
+    } else if (result === "Instance") {
+        running = false;
+        runProcess(($SCRIPT_ROOT + "/runInstanceProfile"),
+                   {result: true, instance: true, software: false});
+    }
+    deleteCookie("slapgridCMD");
+    return (result !== null);
+}
diff --git a/slapos/runner/static/js/scripts/project.js b/slapos/runner/static/js/scripts/project.js
index ef18888d7e2e63c5a017230b2cc44a17f3c66fbf..370ad7b7e6aa42cb4eb271cd645e17ba8fbf4462 100644
--- a/slapos/runner/static/js/scripts/project.js
+++ b/slapos/runner/static/js/scripts/project.js
@@ -1,99 +1,97 @@
-$(document).ready( function() {
-	var method = $("input#method").val();
-	var workdir = $("input#workdir").val();
-	if (method != "file"){
-		script = "/openFolder";
-		$('#fileTree').fileTree({ root: workdir, script: $SCRIPT_ROOT + script, folderEvent: 'click', expandSpeed: 750, collapseSpeed: 750, multiFolder: false, selectFolder: true }, function(file) { 
-			selectFile(file);
-		});
-	}
-	$("input#subfolder").val("");
-	$("#create").click(function(){
-		repo_url = $("input#software").val();
-		if($("input#software").val() == "" || !$("input#software").val().match(/^[\w\d._-]+$/)){
-			$("#error").Popup("Invalid Software name", {type:'alert', duration:3000})
-			return false;
-		}
-		if($("input#subfolder").val() == ""){
-			$("#error").Popup("Select the parent folder of your software!", {type:'alert', duration:3000})
-			return false;
-		}
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/createSoftware',
-			data: "folder=" + $("input#subfolder").val() + $("input#software").val(),
-			success: function(data){
-				if(data.code == 1){
-					location.href = $SCRIPT_ROOT + '/editSoftwareProfile'
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000})
-					
-				}
-			}
-		});
-		return false;
-	});
-	
-	$("#open").click(function(){
-		$("#flash").fadeOut('normal');
-		$("#flash").empty();
-		$("#flash").fadeIn('normal');
-		if($("input#path").val() == ""){
-			$("#error").Popup("Select a valid Software Release folder!", {type:'alert', duration:3000})
-			return false;
-		}
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/setCurrentProject',
-			data: "path=" + $("input#path").val(),
-			success: function(data){
-				if(data.code == 1){
-					location.href = $SCRIPT_ROOT + '/editSoftwareProfile'
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000})
-				}
-			}
-		});
-		return false;
-	});
-	
-	function selectFile(file){
-		$("#info").empty();		
-		$("input#subfolder").val(file);
-		path = "";
-		if(method == "open"){
-			$("#info").append("Selection: " + file);
-			checkFolder(file);
-		}
-		else{
-			if($("input#software").val() != "" && $("input#software").val().match(/^[\w\d._-]+$/)){
-				$("#info").append("New Software in: " + file + $("input#software").val());
-			}
-			else{
-				$("#info").append("Selection: " + file);
-			}
-		}
-		return;
-	}
-	
-	function checkFolder(path){
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/checkFolder',
-			data: "path=" + path,
-			success: function(data){
-				var path = data.result;
-				$("input#path").val(path);
-				if (path != ""){
-					$("#check").fadeIn('normal');					
-				}
-				else{
-					$("#check").hide();
-				}
-			}
-		});
-		return "";
-	}
-});
\ No newline at end of file
+/*jslint undef: true */
+/*global $, document, window, $SCRIPT_ROOT */
+/* vim: set et sts=4: */
+
+$(document).ready(function () {
+    "use strict";
+
+    var method = $("input#method").val(),
+        workdir = $("input#workdir").val();
+
+    function checkFolder(path) {
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/checkFolder',
+            data: "path=" + path,
+            success: function (data) {
+                var path = data.result;
+                $("input#path").val(path);
+                if (path !== "") {
+                    $("#check").fadeIn('normal');
+                } else {
+                    $("#check").hide();
+                }
+            }
+        });
+        return "";
+    }
+
+    function selectFile(file) {
+        $("#info").empty();
+        $("input#subfolder").val(file);
+        if (method === "open") {
+            $("#info").append("Selection: " + file);
+            checkFolder(file);
+        } else {
+            if ($("input#software").val() !== "" && $("input#software").val().match(/^[\w\d._\-]+$/)) {
+                $("#info").append("New Software in: " + file + $("input#software").val());
+            } else {
+                $("#info").append("Selection: " + file);
+            }
+        }
+        return;
+    }
+
+    if (method !== "file") {
+        $('#fileTree').fileTree({root: workdir, script: $SCRIPT_ROOT + '/openFolder', folderEvent: 'click', expandSpeed: 750, collapseSpeed: 750, multiFolder: false, selectFolder: true }, function (file) {
+            selectFile(file);
+        });
+    }
+    $("input#subfolder").val("");
+    $("#create").click(function () {
+        if ($("input#software").val() === "" || !$("input#software").val().match(/^[\w\d._\-]+$/)) {
+            $("#error").Popup("Invalid Software name", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if ($("input#subfolder").val() === "") {
+            $("#error").Popup("Select the parent folder of your software!", {type: 'alert', duration: 3000});
+            return false;
+        }
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/createSoftware',
+            data: "folder=" + $("input#subfolder").val() + $("input#software").val(),
+            success: function (data) {
+                if (data.code === 1) {
+                    window.location.href = $SCRIPT_ROOT + '/editSoftwareProfile';
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
+        return false;
+    });
+
+    $("#open").click(function () {
+        $("#flash").fadeOut('normal');
+        $("#flash").empty();
+        $("#flash").fadeIn('normal');
+        if ($("input#path").val() === "") {
+            $("#error").Popup("Select a valid Software Release folder!", {type: 'alert', duration: 3000});
+            return false;
+        }
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/setCurrentProject',
+            data: "path=" + $("input#path").val(),
+            success: function (data) {
+                if (data.code === 1) {
+                    window.location.href = $SCRIPT_ROOT + '/editSoftwareProfile';
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
+        return false;
+    });
+});
diff --git a/slapos/runner/static/js/scripts/repo.js b/slapos/runner/static/js/scripts/repo.js
index 326e57a279d19d1153bb36d22d7e6c8c46e94a3d..7965d5c22e35b9690fda3d3f63344a6594fd7b05 100644
--- a/slapos/runner/static/js/scripts/repo.js
+++ b/slapos/runner/static/js/scripts/repo.js
@@ -1,180 +1,194 @@
-$(document).ready( function() {
-	var send = false;
-	var getStatus;
-	gitStatus();
-	$("#project").change(function(){
-		if (send){
-			getStatus.abort();
-			send=false;
-		}
-		gitStatus();
-	});
-	$("#activebranch").change(function(){
-		var branch = $("#activebranch").val();
-		var project = $("#project").val();
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/changeBranch',
-			data: "project=" + $("input#workdir").val() + "/" + project + "&name=" + branch,
-			success: function(data){
-				if(data.code == 1){
-					gitStatus();
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-			}
-		});
-	});
-	$("#addbranch").click(function(){
-		checkout("1");
-		return false;
-	});
-	$("#docheckout").click(function(){
-		checkout("0");
-		return false;
-	});
-	$("#commit").click(function(){
-		if($("input#commitmsg").val() == "" ||
-			$("input#commitmsg").val() == "Enter message..."){
-			$("#error").Popup("Please Enter the commit message", {type:'alert', duration:3000});
-			return false;
-		}
-		if (send){
-			return false;
-		}
-		send = true;
-		var project = $("#project").val();
-		$("#imgwaitting").fadeIn('normal');
-		$("#commit").empty();
-		$("#commit").attr("value", "Wait...");
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/pushProjectFiles',
-			data: {project: $("input#workdir").val() + "/" + project, msg: $("input#commitmsg").val()},
-			success: function(data){
-				if(data.code == 1){
-					if (data.result != ""){
-						$("#error").Popup(data.result, {type:'error', duration:5000});
-					}
-					else
-						$("#error").Popup("Commit done!", {type:'confirm', duration:3000});
-					gitStatus();
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error'});
-				}
-				$("#imgwaitting").hide()
-				$("#commit").empty();
-				$("#commit").attr("value", "Commit");
-				send = false;
-			}
-		});
-		return false;
-	});
-	/*
-	$("#pullbranch").click(function(){
-		if (send){
-			return false;
-		}
-		send = true;
-		var project = $("#project").val();
-		$("#pullimgwaitting").fadeIn('normal');
-		$("#pullbranch").empty();
-		$("#pullbranch").attr("value", "Wait...");
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/pullProjectFiles',
-			data: "project=" + $("input#workdir").val() + "/" + project,
-			success: function(data){
-				if(data.code == 1){
-					if (data.result != ""){
-						error(data.result);
-					}
-					else
-						error("Pull done!");
-					gitStatus();
-				}
-				else{
-					error(data.result);
-				}
-				$("#pullimgwaitting").hide()
-				$("#pullbranch").empty();
-				$("#pullbranch").attr("value", "Git Pull");
-				send = false;
-			}
-		});
-		return false;
-	});*/
-	function gitStatus(){
-		var project = $("#project").val();
-		$("#status").empty();
-		$("#push").hide();
-		$("#flash").empty();
-		if (project == ""){
-			$("#status").append("<h2>Please select one project...</h2><br/><br/>");
-			$("#branchlist").hide();
-			return;
-		}
-		send = true;
-		var urldata = $("input#workdir").val() + "/" + project;
-		getStatus = $.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/getProjectStatus',
-			data: "project=" + urldata,
-			success: function(data){
-				if(data.code == 1){
-					$("#branchlist").show();
-					$("#status").append("<h2>Your Repository status</h2>");
-					message = data.result.split('\n').join('<br/>');
-					//alert(message);
-					$("#status").append("<p>" + message + "</p>");
-					if(data.dirty){
-						$("#push").show();
-						$("#status").append("<br/><h2>Display Diff for current Project</h2>");
-						$("#status").append("<p style='font-size:15px;'>You have changes in your project." +
-							" <a href='" + $SCRIPT_ROOT + "/getProjectDiff/"
-							+ encodeURI(project) + "'>Watch the diff</a></p>");
-					}
-					loadBranch(data.branch);
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-				send = false;
-			}
-		});
-	}
-	function checkout(mode){
-		if($("input#branchname").val() == "" ||
-			$("input#branchname").val() == "Enter the branch name..."){
-			$("#error").Popup("Please Enter the branch name", {type:'alert', duration:3000});
-			return false;
-		}
-		var project = $("#project").val();
-		var branch = $("input#branchname").val();
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/newBranch',
-			data: {project:$("input#workdir").val() + "/" + project, name:branch, create:mode},
-			success: function(data){
-				if(data.code == 1){
-					$("input#branchname").val("Enter the branch name...");
-					gitStatus();
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error'});
-				}
-			}
-		});
-		return false;
-	}
-	function loadBranch(branch){
-		$("#activebranch").empty();
-		for(i=0; i< branch.length; i++){
-			selected = (branch[i].indexOf('*') == 0)? "selected":"";
-			$("#activebranch").append("<option value='" + branch[i] +
-				"' " + selected + ">" + branch[i] + "</option>");
-		}
-	}
-});
\ No newline at end of file
+/*jslint undef: true */
+/*global $, document, $SCRIPT_ROOT */
+/* vim: set et sts=4: */
+
+$(document).ready(function () {
+    "use strict";
+
+    var send = false,
+        getStatus;
+
+    function loadBranch(branch) {
+        var i, selected;
+        $("#activebranch").empty();
+        for (i = 0; i < branch.length; i += 1) {
+            selected = (branch[i].indexOf('*') === 0) ? "selected" : "";
+            $("#activebranch").append("<option value='" + branch[i] +
+                "' " + selected + ">" + branch[i] + "</option>");
+        }
+    }
+
+    function gitStatus() {
+        var project = $("#project").val(),
+            urldata = $("input#workdir").val() + "/" + project;
+
+        $("#status").empty();
+        $("#push").hide();
+        $("#flash").empty();
+        if (project === "") {
+            $("#status").append("<h2>Please select one project...</h2><br/><br/>");
+            $("#branchlist").hide();
+            return;
+        }
+        send = true;
+        getStatus = $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/getProjectStatus',
+            data: "project=" + urldata,
+            success: function (data) {
+                var message;
+
+                if (data.code === 1) {
+                    $("#branchlist").show();
+                    $("#status").append("<h2>Your Repository status</h2>");
+                    message = data.result.split('\n').join('<br/>');
+                    //alert(message);
+                    $("#status").append("<p>" + message + "</p>");
+                    if (data.dirty) {
+                        $("#push").show();
+                        $("#status").append("<br/><h2>Display Diff for current Project</h2>");
+                        $("#status").append("<p style='font-size:15px;'>You have changes in your project." +
+                            " <a href='" + $SCRIPT_ROOT + "/getProjectDiff/"
+                            + encodeURI(project) + "'>Watch the diff</a></p>");
+                    }
+                    loadBranch(data.branch);
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+                send = false;
+            }
+        });
+    }
+
+    function checkout(mode) {
+        if ($("input#branchname").val() === "" ||
+                $("input#branchname").val() === "Enter the branch name...") {
+            $("#error").Popup("Please Enter the branch name", {type: 'alert', duration: 3000});
+            return false;
+        }
+        var project = $("#project").val(),
+            branch = $("input#branchname").val();
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/newBranch',
+            data: {project: $("input#workdir").val() + "/" + project, name: branch, create: mode},
+            success: function (data) {
+                if (data.code === 1) {
+                    $("input#branchname").val("Enter the branch name...");
+                    gitStatus();
+                } else {
+                    $("#error").Popup(data.result, {type: 'error'});
+                }
+            }
+        });
+        return false;
+    }
+
+
+    gitStatus();
+
+    $("#project").change(function () {
+        if (send) {
+            getStatus.abort();
+            send = false;
+        }
+        gitStatus();
+    });
+    $("#activebranch").change(function () {
+        var branch = $("#activebranch").val(),
+            project = $("#project").val();
+
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/changeBranch',
+            data: "project=" + $("input#workdir").val() + "/" + project + "&name=" + branch,
+            success: function (data) {
+                if (data.code === 1) {
+                    gitStatus();
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+            }
+        });
+    });
+    $("#addbranch").click(function () {
+        checkout("1");
+        return false;
+    });
+    $("#docheckout").click(function () {
+        checkout("0");
+        return false;
+    });
+    $("#commit").click(function () {
+        if ($("input#commitmsg").val() === "" ||
+                $("input#commitmsg").val() === "Enter message...") {
+            $("#error").Popup("Please Enter the commit message", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if (send) {
+            return false;
+        }
+        send = true;
+        var project = $("#project").val();
+        $("#imgwaitting").fadeIn('normal');
+        $("#commit").empty();
+        $("#commit").attr("value", "Wait...");
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/pushProjectFiles',
+            data: {project: $("input#workdir").val() + "/" + project, msg: $("input#commitmsg").val()},
+            success: function (data) {
+                if (data.code === 1) {
+                    if (data.result !== "") {
+                        $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                    } else {
+                        $("#error").Popup("Commit done!", {type: 'confirm', duration: 3000});
+                    }
+                    gitStatus();
+                } else {
+                    $("#error").Popup(data.result, {type: 'error'});
+                }
+                $("#imgwaitting").hide();
+                $("#commit").empty();
+                $("#commit").attr("value", "Commit");
+                send = false;
+            }
+        });
+        return false;
+    });
+
+    /*
+    $("#pullbranch").click(function (){
+      if (send){
+        return false;
+      }
+      send = true;
+      var project = $("#project").val();
+      $("#pullimgwaitting").fadeIn('normal');
+      $("#pullbranch").empty();
+      $("#pullbranch").attr("value", "Wait...");
+      $.ajax({
+        type: "POST",
+        url: $SCRIPT_ROOT + '/pullProjectFiles',
+        data: "project=" + $("input#workdir").val() + "/" + project,
+        success: function (data){
+          if (data.code == 1){
+            if (data.result != ""){
+              error(data.result);
+            }
+            else
+              error("Pull done!");
+            gitStatus();
+          } else {
+            error(data.result);
+          }
+          $("#pullimgwaitting").hide()
+          $("#pullbranch").empty();
+          $("#pullbranch").attr("value", "Git Pull");
+          send = false;
+        }
+      });
+      return false;
+    });*/
+
+});
diff --git a/slapos/runner/static/js/scripts/softwareFolder.js b/slapos/runner/static/js/scripts/softwareFolder.js
index 2ea94b92d86833bc9832d7871d5f6e8c8287f93c..238c06c19340ec0fbaad2053935be0dfab69e71a 100644
--- a/slapos/runner/static/js/scripts/softwareFolder.js
+++ b/slapos/runner/static/js/scripts/softwareFolder.js
@@ -1,275 +1,299 @@
-$(document).ready( function() {
-	var editor = ace.edit("editor");
-	editor.setTheme("ace/theme/crimson_editor");
+/*jslint undef: true */
+/*global $, document, $SCRIPT_ROOT, ace */
+/*global path: true */
+/* vim: set et sts=4: */
 
-	var CurentMode = require("ace/mode/text").Mode;
-	editor.getSession().setMode(new CurentMode());
-	editor.getSession().setTabSize(2);
-	editor.getSession().setUseSoftTabs(true);
-	editor.renderer.setHScrollBarAlwaysVisible(false);
 
-	var script = "/readFolder";
-	var softwareDisplay = true;
-	var Mode = function(name, desc, clazz, extensions) {
-		this.name = name;
-		this.desc = desc;
-		this.clazz = clazz;
-		this.mode = new clazz();
-		this.mode.name = name;
+$(document).ready(function () {
+    "use strict";
 
-		this.extRe = new RegExp("^.*\\.(" + extensions.join("|") + ")$");
-	};
-	var modes = [
-		new Mode("php", "PHP",require("ace/mode/php").Mode, ["php", "in", "inc"]),
-		new Mode("python", "Python", require("ace/mode/python").Mode, ["py"]),
-		new Mode("buildout", "Python Buildout config", require("ace/mode/buildout").Mode, ["cfg"])
-	    ];
-	var projectDir = $("input#project").val();
-	var workdir = $("input#workdir").val();
-	var currentProject = workdir + "/" + projectDir.replace(workdir, "").split('/')[1];
-	var send = false;
-	var edit = false;
-	$('#fileTree').fileTree({ root: projectDir, script: $SCRIPT_ROOT + script, folderEvent: 'click', expandSpeed: 750, collapseSpeed: 750, multiFolder: false, selectFolder: true }, function(file) {
-		selectFile(file);
-	});
-	setDetailBox();
-	$("#add").click(function(){
-		var path = (softwareDisplay)? projectDir:currentProject;
-		if (send) return false;
-		if($("input#file").val() == "" ||
-			$("input#file").val() == "Enter name here..."){
-			$("#error").Popup("Please enter your file or folder name", {type:'alert', duration:3000});
-			return false;
-		}
-		if($("input#subfolder").val() != ""){
-			path = $("input#subfolder").val();
-		}
-		path = path + "/" + $("input#file").val();
-		send = true;
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/createFile',
-			data: "file=" + path + "&type=" + $("#type").val(),
-			success: function(data){
-				if(data.code == 1){
-					switchContent();
-					$("input#file").val("");
-					$("#flash").fadeOut('normal');
-					$("#flash").empty();
-					$("#info").empty();
-					$("#info").append("Select parent directory or nothing for root...");
-					$("input#subfolder").val("");
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-				send = false;
-			}
-		});
-		return false;
-	});
+    var editor = ace.edit("editor"),
+        CurrentMode,
+        script = "/readFolder",
+        softwareDisplay = true,
+        Mode,
+        modes,
+        projectDir = $("input#project").val(),
+        workdir = $("input#workdir").val(),
+        currentProject = workdir + "/" + projectDir.replace(workdir, "").split('/')[1],
+        send = false,
+        edit = false;
 
-	$("#save").click(function(){
-		if(!edit){
-			$("#error").Popup("Please select the file to edit", {type:'alert', duration:3000});
-			return false;
-		}
-		if (send) return false;
-		send = true;
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/saveFileContent',
-			data: {file: $("input#subfolder").val(), content: editor.getSession().getValue()},
-			success: function(data){
-				if(data.code == 1){
-					$("#error").Popup("File saved succefuly!", {type:'confirm', duration:3000});
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-				send = false;
-			}
-		});
-		return false;
-	});
 
-	$("#details_head").click(function(){
-	    setDetailBox();
-	});
+    function setEditMode(file) {
+        var i,
+            CurrentMode = require("ace/mode/text").Mode;
+        editor.getSession().setMode(new CurrentMode());
+        for (i = 0; i < modes.length; i += 1) {
+            if (modes[i].extRe.test(file)) {
+                editor.getSession().setMode(modes[i].mode);
+                break;
+            }
+        }
+    }
 
-	$("#switch").click(function(){
-	    softwareDisplay = !softwareDisplay;
-	    switchContent();
-	    return false;
-	});
-	$("#getmd5").click(function(){
-		getmd5sum();
-		return false;
-	});
+    function selectFile(file) {
+        $("#info").empty();
+        $("#info").append(file);
+        $("input#subfolder").val(file);
+        $("#md5sum").empty();
+        path = "";
+        send = false;
+        edit = false;
+        if (file.substr(-1) !== "/") {
+            $.ajax({
+                type: "POST",
+                url: $SCRIPT_ROOT + '/getFileContent',
+                data: {file: file},
+                success: function (data) {
+                    var name, start;
+                    if (data.code === 1) {
+                        $("#edit_info").empty();
+                        name = file.split('/');
+                        if (file.length > 65) {
+                            //substring title.
+                            start = file.length - 65;
+                            file = "..." + file.substring(file.indexOf("/", (start + 1)));
+                        }
+                        $("#edit_info").append("Current file: " + file);
+                        $("a#option").show();
+                        editor.getSession().setValue(data.result);
+                        setEditMode(name[name.length - 1]);
+                        edit = true;
+                    } else {
+                        $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                    }
+                    send = false;
+                }
+            });
+        } else {
+            $("#edit_info").empty();
+            $("#edit_info").append("No file selected");
+            $("a#option").hide();
+            editor.getSession().setValue("");
+        }
+        return;
+    }
 
-	$("#clearselect").click(function(){
-	    $("#info").empty();
-	    $("#info").append("Select directory or nothing for root directory...");
-	    $("input#subfolder").val("");
-	    $("#edit_info").empty();
-	    $("#edit_info").append("No file selected");
-	    editor.getSession().setValue("");
-	    $("#md5sum").empty();
-	    $("a#option").hide();
-	    return false;
-	});
-	$("#adddevelop").click(function(){
-	    var developList = new Array();
-	    var i=0;
-	    $("#plist li").each(function(index){
-		var elt = $(this).find("input:checkbox");
-		if (elt.is(":checked")){
-		    developList[i] = workdir+"/"+elt.val();
-		    i++;
-		    elt.attr("checked", false);
-		}
-	    });
-	    if (developList.length > 0){setDevelop(developList);}
-	    return false;
-	});
 
-	function getmd5sum(){
-		var file = $("input#subfolder").val();
-		if (send) return;
-		send =true
-		$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/getmd5sum',
-			data: {file: $("input#subfolder").val()},
-			success: function(data){
-				if(data.code == 1){
-					$("#md5sum").empty();
-					$("#md5sum").append('md5sum : <span>' + data.result + '</span>');
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-				send = false;
-			}
-		});
-	}
+    function setDetailBox() {
+        var state = $("#details_box").css("display");
+        if (state === "none") {
+            $("#details_box").slideDown("normal");
+            $("#details_head").removeClass("hide");
+            $("#details_head").addClass("show");
+        } else {
+            $("#details_box").slideUp("normal");
+            $("#details_head").removeClass("show");
+            $("#details_head").addClass("hide");
+        }
+    }
 
-	function switchContent(){
-	    var root = projectDir;
-	    if(!softwareDisplay){
-		$("#switch").empty();
-		$("#switch").append("Switch to Software files");
-		root = currentProject;
-	    }
-	    else{
-		$("#switch").empty();
-		$("#switch").append("Switch to Project files");
-	    }
-	    $('#fileTree').fileTree({ root: root, script: $SCRIPT_ROOT + script, folderEvent: 'click', expandSpeed: 750, collapseSpeed: 750, multiFolder: false, selectFolder: true }, function(file) {
-	        selectFile(file);
-	    });
-	    $("#info").empty();
-	    $("#info").append("Select directory or nothing for root directory...");
-	    $("input#subfolder").val("");
-	}
+    function switchContent() {
+        var root = projectDir;
+        if (!softwareDisplay) {
+            $("#switch").empty();
+            $("#switch").append("Switch to Software files");
+            root = currentProject;
+        } else {
+            $("#switch").empty();
+            $("#switch").append("Switch to Project files");
+        }
+        $('#fileTree').fileTree({ root: root, script: $SCRIPT_ROOT + script, folderEvent: 'click', expandSpeed: 750, collapseSpeed: 750, multiFolder: false, selectFolder: true }, function (file) {
+            selectFile(file);
+        });
+        $("#info").empty();
+        $("#info").append("Select directory or nothing for root directory...");
+        $("input#subfolder").val("");
+    }
 
-	function setDetailBox(){
-	    var state = $("#details_box").css("display");
-	    if (state == "none"){
-		$("#details_box").slideDown("normal");
-		$("#details_head").removeClass("hide");
-		$("#details_head").addClass("show");
-	    }
-	    else{
-		$("#details_box").slideUp("normal");
-		$("#details_head").removeClass("show");
-		$("#details_head").addClass("hide");
-	    }
-	}
+    function getmd5sum() {
+        var file = $("input#subfolder").val();
+        if (send) {
+            return;
+        }
+        send = true;
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/getmd5sum',
+            data: {file: $("input#subfolder").val()},
+            success: function (data) {
+                if (data.code === 1) {
+                    $("#md5sum").empty();
+                    $("#md5sum").append('md5sum : <span>' + data.result + '</span>');
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+                send = false;
+            }
+        });
+    }
 
-	function selectFile(file){
-		$("#info").empty();
-		$("#info").append(file);
-		$("input#subfolder").val(file);
-		$("#md5sum").empty();
-		path = "";
-		send = false;
-		edit = false;
-		if(file.substr(-1) != "/"){
-			$.ajax({
-			type: "POST",
-			url: $SCRIPT_ROOT + '/getFileContent',
-			data: {file: file},
-			success: function(data){
-				if(data.code == 1){
-					$("#edit_info").empty();
-					var name = file.split('/');
-					if(file.length > 65){
-						//substring title.
-						var start = file.length - 65;
-						file = "..." + file.substring(file.indexOf("/", (start + 1)));
-					}
-					$("#edit_info").append("Current file: " +
-						file);
-					$("a#option").show();
-					editor.getSession().setValue(data.result);
-					setEditMode(name[name.length - 1]);
-					edit = true;
-				}
-				else{
-					$("#error").Popup(data.result, {type:'error', duration:5000});
-				}
-				send = false;
-			}
-		});
-		}
-		else{
-			$("#edit_info").empty();
-			$("#edit_info").append("No file selected");
-			$("a#option").hide();
-			editor.getSession().setValue("");
-		}
-		return;
-	}
+    function setDevelop(developList) {
+        if (developList === null || developList.length <= 0) {
+            return;
+        }
+        editor.navigateFileStart();
+        editor.find('buildout', {caseSensitive: true, wholeWord: true});
+        if (!editor.getSelectionRange().isEmpty()) {
+            //editor.find("",{caseSensitive: true,wholeWord: true,regExp: true});
+            //if (!editor.getSelectionRange().isEmpty()) {
+                    //alert("found");
+            //}
+            //else{alert("no found");
+            //}
+        } else {
+            $("#error").Popup("Can not found part [buildout]! Please make sure that you have a cfg file", {type: 'alert', duration: 3000});
+            return;
+        }
+        editor.navigateLineEnd();
+        $.post($SCRIPT_ROOT + "/getPath", {file: developList.join("#")}, function (data) {
+            var result, i;
+            if (data.code === 1) {
+                result = data.result.split('#');
+                editor.insert("\ndevelop =\n\t" + result[0] + "\n");
+                for (i = 1; i < result.length; i += 1) {
+                    editor.insert("\t" + result[i] + "\n");
+                }
+            }
+        })
+            .error(function () {})
+            .complete(function () {});
+        editor.insert("\n");
+    }
 
-	function setEditMode(file){
-		var CurentMode = require("ace/mode/text").Mode;
-		editor.getSession().setMode(new CurentMode());
-		for (var i=0; i< modes.length; i++){
-			if(modes[i].extRe.test(file)){
-				editor.getSession().setMode(modes[i].mode);
-				set = true;
-				break;
-			}
-		}
-	}
-	function setDevelop(developList){
-	    if (developList==null || developList.length <= 0) return;
-	    editor.navigateFileStart();
-	    editor.find('buildout',{caseSensitive: true,wholeWord: true});
-	    if(!editor.getSelectionRange().isEmpty()){
-		//editor.find("",{caseSensitive: true,wholeWord: true,regExp: true});
-		//if(!editor.getSelectionRange().isEmpty()){
-			//alert("found");
-		//}
-		//else{alert("no found");
-		//}
-	    }
-	    else{
-		$("#error").Popup("Can not found part [buildout]! Please make sure that you have a cfg file", {type:'alert', duration:3000});
-		return;
-	    }
-	    editor.navigateLineEnd();
-	    $.post($SCRIPT_ROOT+"/getPath", {file:developList.join("#")}, function(data) {
-		    if(data.code==1){
-			var result = data.result.split('#');
-			editor.insert("\ndevelop =\n\t" + result[0] + "\n");
-			for(var i=1; i<result.length; i++)
-			    editor.insert("\t" + result[i] + "\n");
-		    }
-	    })
-	    .error(function() {  })
-	    .complete(function(){});
-	    editor.insert("\n");
-	}
-});
\ No newline at end of file
+
+    editor.setTheme("ace/theme/crimson_editor");
+
+    CurrentMode = require("ace/mode/text").Mode;
+    editor.getSession().setMode(new CurrentMode());
+    editor.getSession().setTabSize(2);
+    editor.getSession().setUseSoftTabs(true);
+    editor.renderer.setHScrollBarAlwaysVisible(false);
+
+    Mode = function (name, desc, Clazz, extensions) {
+        this.name = name;
+        this.desc = desc;
+        this.clazz = Clazz;
+        this.mode = new Clazz();
+        this.mode.name = name;
+
+        this.extRe = new RegExp("^.*\\.(" + extensions.join("|") + ")$");
+    };
+    modes = [
+        new Mode("php", "PHP", require("ace/mode/php").Mode, ["php", "in", "inc"]),
+        new Mode("python", "Python", require("ace/mode/python").Mode, ["py"]),
+        new Mode("buildout", "Python Buildout config", require("ace/mode/buildout").Mode, ["cfg"])
+    ];
+    $('#fileTree').fileTree({ root: projectDir, script: $SCRIPT_ROOT + script, folderEvent: 'click', expandSpeed: 750, collapseSpeed: 750, multiFolder: false, selectFolder: true }, function (file) {
+        selectFile(file);
+    });
+    setDetailBox();
+    $("#add").click(function () {
+        var path = softwareDisplay ? projectDir : currentProject;
+        if (send) {
+            return false;
+        }
+        if ($("input#file").val() === "" || $("input#file").val() === "Enter name here...") {
+            $("#error").Popup("Please enter your file or folder name", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if ($("input#subfolder").val() !== "") {
+            path = $("input#subfolder").val();
+        }
+        path = path + "/" + $("input#file").val();
+        send = true;
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/createFile',
+            data: "file=" + path + "&type=" + $("#type").val(),
+            success: function (data) {
+                if (data.code === 1) {
+                    switchContent();
+                    $("input#file").val("");
+                    $("#flash").fadeOut('normal');
+                    $("#flash").empty();
+                    $("#info").empty();
+                    $("#info").append("Select parent directory or nothing for root...");
+                    $("input#subfolder").val("");
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+                send = false;
+            }
+        });
+        return false;
+    });
+
+    $("#save").click(function () {
+        if (!edit) {
+            $("#error").Popup("Please select the file to edit", {type: 'alert', duration: 3000});
+            return false;
+        }
+        if (send) {
+            return false;
+        }
+        send = true;
+        $.ajax({
+            type: "POST",
+            url: $SCRIPT_ROOT + '/saveFileContent',
+            data: {
+                file: $("input#subfolder").val(),
+                content: editor.getSession().getValue()
+            },
+            success: function (data) {
+                if (data.code === 1) {
+                    $("#error").Popup("File saved succefuly!", {type: 'confirm', duration: 3000});
+                } else {
+                    $("#error").Popup(data.result, {type: 'error', duration: 5000});
+                }
+                send = false;
+            }
+        });
+        return false;
+    });
+
+    $("#details_head").click(function () {
+        setDetailBox();
+    });
+
+    $("#switch").click(function () {
+        softwareDisplay = !softwareDisplay;
+        switchContent();
+        return false;
+    });
+    $("#getmd5").click(function () {
+        getmd5sum();
+        return false;
+    });
+
+    $("#clearselect").click(function () {
+        $("#info").empty();
+        $("#info").append("Select directory or nothing for root directory...");
+        $("input#subfolder").val("");
+        $("#edit_info").empty();
+        $("#edit_info").append("No file selected");
+        editor.getSession().setValue("");
+        $("#md5sum").empty();
+        $("a#option").hide();
+        return false;
+    });
+    $("#adddevelop").click(function () {
+        var developList = [],
+            i = 0;
+        $("#plist li").each(function (index) {
+            var elt = $(this).find("input:checkbox");
+            if (elt.is(":checked")) {
+                developList[i] = workdir + "/" + elt.val();
+                i += 1;
+                elt.attr("checked", false);
+            }
+        });
+        if (developList.length > 0) {
+            setDevelop(developList);
+        }
+        return false;
+    });
+
+
+});
diff --git a/slapos/runner/static/js/scripts/viewlog.js b/slapos/runner/static/js/scripts/viewlog.js
index aab4e748412a198f7bca150e999be175f0ed1ba7..110660fa988b4f024d3031241c9ec3b80a9a8bcb 100644
--- a/slapos/runner/static/js/scripts/viewlog.js
+++ b/slapos/runner/static/js/scripts/viewlog.js
@@ -1,57 +1,81 @@
-$(document).ready( function() {
-  openedlogpage = $("input#type").val();
-  updatelogBox();
-  var state = getCookie("autoUpdate");
-
-  $("#logheader").click(function(){
-    setupBox();
-  });
-  $("#manual").change(function(){
-    setCookie("autoUpdate", "manual");
-    if ($("input#type").val() == "instance"){location.href = $SCRIPT_ROOT + "/viewInstanceLog";}
-    else{location.href = $SCRIPT_ROOT + "/viewSoftwareLog";}
-  });
-  $("#live").change(function(){
-    updatelogBox();$("#logconfigbox").find("input:radio").attr('checked', false);$("#live").attr('checked', true);
-    setSpeed(100);setCookie("autoUpdate", "live");openedlogpage = $("input#type").val();});
-  $("#slow").change(function(){
-    updatelogBox();$("#logconfigbox").find("input:radio").attr('checked', false);$("#slow").attr('checked', true);
-    setSpeed(2500);setCookie("autoUpdate", "slow");openedlogpage = $("input#type").val();});
-  if(state){
-    $("#"+state).attr('checked', true);
-    updatelogBox();
-    if (state == "manual"){
-      openedlogpage = ""; setSpeed(0);
-    }
-    else{setSpeed((state=="live")?100:2500);}
-  }
-  else{$("#slow").attr('checked', true);}
-
-  function setupBox(){
-    var state = $("#logconfigbox").css("display");
-    if (state == "none"){
-      $("#logconfigbox").slideDown("normal");
-      $("#logheader").removeClass("hide");
-      $("#logheader").addClass("show");
-    }
-    else{
-      $("#logconfigbox").slideUp("normal");
-      $("#logheader").removeClass("show");
-      $("#logheader").addClass("hide");
+/*jslint undef: true */
+/*global $, document, window, processState, getCookie, setCookie, setSpeed, $SCRIPT_ROOT */
+/*global openedlogpage: true */
+/* vim: set et sts=4: */
+
+$(document).ready(function () {
+    "use strict";
+
+    function setupBox() {
+        var state = $("#logconfigbox").css("display");
+        if (state === "none") {
+            $("#logconfigbox").slideDown("normal");
+            $("#logheader").removeClass("hide");
+            $("#logheader").addClass("show");
+        } else {
+            $("#logconfigbox").slideUp("normal");
+            $("#logheader").removeClass("show");
+            $("#logheader").addClass("hide");
+        }
     }
-  }
-
-  function updatelogBox(){
-    if(processState=="Stopped" || processState=="Checking" || $("#manual").is(":checked")){
-      $("#salpgridLog").hide();
-      $("#manualLog").show();
-      $("#manualLog")
-        .scrollTop($("#manualLog")[0].scrollHeight - $("#manualLog")
-          .height());
+
+    function updatelogBox() {
+        if (processState === "Stopped" || processState === "Checking" || $("#manual").is(":checked")) {
+            $("#salpgridLog").hide();
+            $("#manualLog").show();
+            $("#manualLog")
+                .scrollTop($("#manualLog")[0].scrollHeight - $("#manualLog").height());
+        } else {
+            $("#salpgridLog").show();
+            $("#manualLog").hide();
+        }
     }
-    else{
-      $("#salpgridLog").show();
-      $("#manualLog").hide();
+
+    openedlogpage = $("input#type").val();
+    updatelogBox();
+    var state = getCookie("autoUpdate");
+
+    $("#logheader").click(function () {
+        setupBox();
+    });
+
+    $("#manual").change(function () {
+        setCookie("autoUpdate", "manual");
+        if ($("input#type").val() === "instance") {
+            window.location.href = $SCRIPT_ROOT + "/viewInstanceLog";
+        } else {
+            window.location.href = $SCRIPT_ROOT + "/viewSoftwareLog";
+        }
+    });
+
+    $("#live").change(function () {
+        updatelogBox();
+        $("#logconfigbox").find("input:radio").attr('checked', false);
+        $("#live").attr('checked', true);
+        setSpeed(100);
+        setCookie("autoUpdate", "live");
+        openedlogpage = $("input#type").val();
+    });
+
+    $("#slow").change(function () {
+        updatelogBox();
+        $("#logconfigbox").find("input:radio").attr('checked', false);
+        $("#slow").attr('checked', true);
+        setSpeed(2500);
+        setCookie("autoUpdate", "slow");
+        openedlogpage = $("input#type").val();
+    });
+
+    if (state) {
+        $("#" + state).attr('checked', true);
+        updatelogBox();
+        if (state === "manual") {
+            openedlogpage = "";
+            setSpeed(0);
+        } else {
+            setSpeed((state === "live") ? 100 : 2500);
+        }
+    } else {
+        $("#slow").attr('checked', true);
     }
-  }
-});
\ No newline at end of file
+});
diff --git a/slapos/shacache/config.py b/slapos/shacache/config.py
index 43f62e957157c695a2777dcf5912db5a6cdcf7e1..28176f827bebbfbc59103718b58865f32878b2b7 100644
--- a/slapos/shacache/config.py
+++ b/slapos/shacache/config.py
@@ -26,7 +26,7 @@ class NetworkcacheParser(OptionParser):
   """
   def __init__(self, usage=None, version=None):
     """
-    Initialize all options possibles.
+    Initialize all possible options.
     """
     OptionParser.__init__(self, usage=usage, version=version,
                           option_list=[