diff --git a/webconsole/src/main/resources/res/ui/bundles.js b/webconsole/src/main/resources/res/ui/bundles.js
index 588a9ec..a5ab7e5 100644
--- a/webconsole/src/main/resources/res/ui/bundles.js
+++ b/webconsole/src/main/resources/res/ui/bundles.js
@@ -243,13 +243,20 @@
             }
             return node.innerHTML;
         };
+        // check for cookie
+        var cv = $.cookies.get("webconsolebundlelist");
+        var lo = (cv ? cv.split(",") : [1,0]);
         $("#plugin_table").tablesorter({
             headers: {
         	    0: { sorter:"digit"},
                 5: { sorter: false }
             },
-            sortList: [[1,0]],
+            sortList: [cv],
             textExtraction:extractMethod 
         });
+        $("#plugin_table").bind("sortEnd", function() {
+        	var table = $("#plugin_table").eq(0).attr("config");
+        	$.cookies.set("webconsolebundlelist", table.sortList.toString());
+        });
     });
 }
diff --git a/webconsole/src/main/resources/res/ui/jquery.cookies-2.1.0.min.js b/webconsole/src/main/resources/res/ui/jquery.cookies-2.1.0.min.js
new file mode 100644
index 0000000..143a9e6
--- /dev/null
+++ b/webconsole/src/main/resources/res/ui/jquery.cookies-2.1.0.min.js
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2005 - 2009, James Auldridge
+ * All rights reserved.
+ *
+ * Licensed under the BSD, MIT, and GPL (your choice!) Licenses:
+ *  http://code.google.com/p/cookies/wiki/License
+ *
+ */
+var jaaulde=window.jaaulde||{};jaaulde.utils=jaaulde.utils||{};jaaulde.utils.cookies=(function()
+{var cookies=[];var defaultOptions={hoursToLive:null,path:'/',domain:null,secure:false};var resolveOptions=function(options)
+{var returnValue;if(typeof options!=='object'||options===null)
+{returnValue=defaultOptions;}
+else
+{returnValue={hoursToLive:(typeof options.hoursToLive==='number'&&options.hoursToLive!==0?options.hoursToLive:defaultOptions.hoursToLive),path:(typeof options.path==='string'&&options.path!==''?options.path:defaultOptions.path),domain:(typeof options.domain==='string'&&options.domain!==''?options.domain:defaultOptions.domain),secure:(typeof options.secure==='boolean'&&options.secure?options.secure:defaultOptions.secure)};}
+return returnValue;};var expiresGMTString=function(hoursToLive)
+{var dateObject=new Date();dateObject.setTime(dateObject.getTime()+(hoursToLive*60*60*1000));return dateObject.toGMTString();};var assembleOptionsString=function(options)
+{options=resolveOptions(options);return((typeof options.hoursToLive==='number'?'; expires='+expiresGMTString(options.hoursToLive):'')+'; path='+options.path+
+(typeof options.domain==='string'?'; domain='+options.domain:'')+
+(options.secure===true?'; secure':''));};var splitCookies=function()
+{cookies={};var pair,name,value,separated=document.cookie.split(';');for(var i=0;i<separated.length;i=i+1)
+{pair=separated[i].split('=');name=pair[0].replace(/^\s*/,'').replace(/\s*$/,'');value=decodeURIComponent(pair[1]);cookies[name]=value;}
+return cookies;};var constructor=function(){};constructor.prototype.get=function(cookieName)
+{var returnValue;splitCookies();if(typeof cookieName==='string')
+{returnValue=(typeof cookies[cookieName]!=='undefined')?cookies[cookieName]:null;}
+else if(typeof cookieName==='object'&&cookieName!==null)
+{returnValue={};for(var item in cookieName)
+{if(typeof cookies[cookieName[item]]!=='undefined')
+{returnValue[cookieName[item]]=cookies[cookieName[item]];}
+else
+{returnValue[cookieName[item]]=null;}}}
+else
+{returnValue=cookies;}
+return returnValue;};constructor.prototype.filter=function(cookieNameRegExp)
+{var returnValue={};splitCookies();if(typeof cookieNameRegExp==='string')
+{cookieNameRegExp=new RegExp(cookieNameRegExp);}
+for(var cookieName in cookies)
+{if(cookieName.match(cookieNameRegExp))
+{returnValue[cookieName]=cookies[cookieName];}}
+return returnValue;};constructor.prototype.set=function(cookieName,value,options)
+{if(typeof value==='undefined'||value===null)
+{if(typeof options!=='object'||options===null)
+{options={};}
+value='';options.hoursToLive=-8760;}
+var optionsString=assembleOptionsString(options);document.cookie=cookieName+'='+encodeURIComponent(value)+optionsString;};constructor.prototype.del=function(cookieName,options)
+{var allCookies={};if(typeof options!=='object'||options===null)
+{options={};}
+if(typeof cookieName==='boolean'&&cookieName===true)
+{allCookies=this.get();}
+else if(typeof cookieName==='string')
+{allCookies[cookieName]=true;}
+for(var name in allCookies)
+{if(typeof name==='string'&&name!=='')
+{this.set(name,null,options);}}};constructor.prototype.test=function()
+{var returnValue=false,testName='cT',testValue='data';this.set(testName,testValue);if(this.get(testName)===testValue)
+{this.del(testName);returnValue=true;}
+return returnValue;};constructor.prototype.setOptions=function(options)
+{if(typeof options!=='object')
+{options=null;}
+defaultOptions=resolveOptions(options);};return new constructor();})();(function()
+{if(window.jQuery)
+{(function($)
+{$.cookies=jaaulde.utils.cookies;var extensions={cookify:function(options)
+{return this.each(function()
+{var i,resolvedName=false,resolvedValue=false,name='',value='',nameAttrs=['name','id'],nodeName,inputType;for(i in nameAttrs)
+{if(!isNaN(i))
+{name=$(this).attr(nameAttrs[i]);if(typeof name==='string'&&name!=='')
+{resolvedName=true;break;}}}
+if(resolvedName)
+{nodeName=this.nodeName.toLowerCase();if(nodeName!=='input'&&nodeName!=='textarea'&&nodeName!=='select'&&nodeName!=='img')
+{value=$(this).html();resolvedValue=true;}
+else
+{inputType=$(this).attr('type');if(typeof inputType==='string'&&inputType!=='')
+{inputType=inputType.toLowerCase();}
+if(inputType!=='radio'&&inputType!=='checkbox')
+{value=$(this).val();resolvedValue=true;}}
+if(resolvedValue)
+{if(typeof value!=='string'||value==='')
+{value=null;}
+$.cookies.set(name,value,options);}}});},cookieFill:function()
+{return this.each(function()
+{var i,resolvedName=false,name='',value,nameAttrs=['name','id'],iteration=0,nodeName;for(i in nameAttrs)
+{if(!isNaN(i))
+{name=$(this).attr(nameAttrs[i]);if(typeof name==='string'&&name!=='')
+{resolvedName=true;break;}}}
+if(resolvedName)
+{value=$.cookies.get(name);if(value!==null)
+{nodeName=this.nodeName.toLowerCase();if(nodeName==='input'||nodeName==='textarea'||nodeName==='select')
+{$(this).val(value);}
+else
+{$(this).html(value);}}}
+iteration=0;});},cookieBind:function(options)
+{return this.each(function()
+{$(this).cookieFill().change(function()
+{$(this).cookify(options);});});}};$.each(extensions,function(i)
+{$.fn[i]=this;});})(window.jQuery);}})();
\ No newline at end of file
