diff --git a/dev/demo/alldemo.js b/dev/demo/alldemo.js
index 29dd405..547a09f 100644
--- a/dev/demo/alldemo.js
+++ b/dev/demo/alldemo.js
@@ -224,13 +224,13 @@
       "operands":[
         {
           "@type":"koral:doc",
-          "key":"Titel",
+          "key":"title",
           "value":"Der Birnbaum",
           "match":"match:eq"
         },
         {
           "@type":"koral:doc",
-          "key":"Veröffentlichungsort",
+          "key":"pubPlace",
           "value":"Mannheim",
           "match":"match:eq"
         },
@@ -240,13 +240,13 @@
           "operands":[
             {
               "@type":"koral:doc",
-              "key":"Untertitel",
+              "key":"subTitle",
               "value":"Aufzucht und Pflege",
               "match":"match:eq"
             },
             {
               "@type":"koral:doc",
-              "key":"Untertitel",
+              "key":"subTitle",
               "value":"Gedichte",
               "match":"match:eq",
               "rewrites" : [
@@ -263,7 +263,7 @@
     },
     {
       "@type":"koral:doc",
-      "key":"Veröffentlichungsdatum",
+      "key":"pubDate",
       "type":"type:date",
       "value":"2015-03-05",
       "match":"match:geq"
@@ -428,6 +428,9 @@
 
   KorAP.hintArray = hintArray;
 
+  // Set current virtual collection
+  KorAP.currentVC = vcExample;
+
   // Parse and show the table
   // Override getMatchInfo API call
   KorAP.API.getMatchInfo = function(match, callObj, cb) {
diff --git a/dev/demo/vcdemo.js b/dev/demo/vcdemo.js
index ff93f27..e92b324 100644
--- a/dev/demo/vcdemo.js
+++ b/dev/demo/vcdemo.js
@@ -77,12 +77,12 @@
 
     // Create a new virtual collection by passing a based json object and
     // field menu information
-    var vc = vcClass.render(json, [
+    var vc = vcClass.create([
       ['title', 'string'],
       ['subTitle', 'string'],
       ['pubDate', 'date'],
       ['author', 'string']
-    ]);
+    ]).fromJson(json);
     document.getElementById('vc').appendChild(vc.element());
 
     // show the current JSON serialization
diff --git a/dev/js/spec/vcSpec.js b/dev/js/spec/vcSpec.js
index 3dd0749..792dc3e 100644
--- a/dev/js/spec/vcSpec.js
+++ b/dev/js/spec/vcSpec.js
@@ -21,10 +21,7 @@
 	for (var prop in overwrites) {
 	  newObj[prop] = overwrites[prop];
 	};
-	if (objClass === vcClass)
-	  return objClass.render(newObj);
-	else
-	  return objClass.create().fromJson(newObj);
+	return objClass.create().fromJson(newObj);
       }
     }
   };
@@ -625,7 +622,7 @@
     });
 
     it('should be replaceable on root', function () {
-      var vc = vcClass.render();
+      var vc = vcClass.create();
       expect(vc.toQuery()).toEqual("");
 
       expect(vc.root().ldType()).toEqual("non");
@@ -874,7 +871,7 @@
     });
     
     it('should be initializable', function () {
-      var vc = vcClass.render();
+      var vc = vcClass.create();
       expect(vc.element().getAttribute('class')).toEqual('vc');
       expect(vc.root().element().getAttribute('class')).toEqual('doc unspecified');
 
@@ -883,7 +880,7 @@
     });
 
     it('should be based on a doc', function () {
-      var vc = vcClass.render({
+      var vc = vcClass.create().fromJson({
 	"@type" : "koral:doc",
 	"key":"Titel",
 	"value":"Baum",
@@ -905,7 +902,7 @@
     });
 
     it('should be based on a docGroup', function () {
-      var vc = vcClass.render(simpleGroupFactory.create().toJson());
+      var vc = vcClass.create().fromJson(simpleGroupFactory.create().toJson());
 
       expect(vc.element().getAttribute('class')).toEqual('vc');
       expect(vc.root().element().getAttribute('class')).toEqual('docGroup');
@@ -1122,7 +1119,7 @@
     });
 
     it('should flatten on import', function () {
-      var vc = vcClass.create().render({
+      var vc = vcClass.create().fromJson({
 	"@type":"koral:docGroup",
 	"operation":"operation:or",
 	"operands":[
@@ -1247,7 +1244,7 @@
     });
 
     it('should clean on root docs', function () {
-      var vc = vcClass.render({
+      var vc = vcClass.create().fromJson({
 	"@type": 'koral:doc',
 	"key": 'pubDate',
 	"match": 'match:eq',
@@ -1265,7 +1262,7 @@
     });
 
     it('should remove on nested docs', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:docGroup',
 	  'operation' : 'operation:and',
@@ -1295,7 +1292,7 @@
     });
 
     it('should clean on doc groups', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:docGroup',
 	  'operation' : 'operation:and',
@@ -1369,7 +1366,7 @@
     });
 
     it('should remove on nested doc groups (list flattening)', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:docGroup',
 	  'operation' : 'operation:or',
@@ -1480,7 +1477,7 @@
     });
 
     it('should add new unspecified doc with "and"', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:docGroup',
 	  'operation' : 'operation:and',
@@ -1525,7 +1522,7 @@
     });
 
     it('should add new unspecified doc with "or"', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:docGroup',
 	  'operation' : 'operation:and',
@@ -1724,7 +1721,7 @@
     });
 
     it('should wrap on root', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:docGroup',
 	  'operation' : 'operation:and',
@@ -1758,7 +1755,7 @@
     });
 
     it('should add on root (case "and")', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:doc',
 	  "key": 'pubDate',
@@ -1780,7 +1777,7 @@
     });
 
     it('should add on root (case "or")', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:doc',
 	  "key": 'pubDate',
@@ -1801,7 +1798,7 @@
     });
 
     it('should support multiple sub groups per group', function () {
-      var vc = vcClass.render(
+      var vc = vcClass.create().fromJson(
 	{
 	  "@type": 'koral:docGroup',
 	  'operation' : 'operation:or',
@@ -1857,8 +1854,9 @@
     });
   });
 
-  describe('KorAP.Rewrite', function () {
 
+
+  describe('KorAP.Rewrite', function () {
     it('should be initializable', function () {
       var rewrite = rewriteClass.create({
 	"@type" : "koral:rewrite",
@@ -1902,10 +1900,41 @@
       expect(doc.element().classList.contains('doc')).toBeTruthy();
       expect(doc.element().classList.contains('rewritten')).toBeTruthy();
     });
-    /*
-      it('should be deserialized by docGroups', function () {
-      });
-    */
+
+    xit('should be deserialized by docGroups', function () {
+      var docGroup = docGroupClass.create(
+	undefined,
+	{
+	  "@type" : "koral:docGroup",
+	  "operation" : "operation:or",
+	  "operands" : [
+	    {
+	      "@type" : "doc",
+	      "key" : "pubDate",
+	      "type" : "type:date",
+	      "value" : "2014-12-05"
+	    },
+	    {
+	      "@type" : "doc",
+	      "key" : "pubDate",
+	      "type" : "type:date",
+	      "value" : "2014-12-06"
+	    }
+	  ],
+	  "rewrites" : [
+	    {
+	      "@type" : "koral:rewrite",
+	      "operation" : "operation:modification",
+	      "src" : "querySerializer",
+	      "scope" : "tree"
+	    }
+	  ]
+	}
+      );
+
+      expect(doc.element().classList.contains('docgroup')).toBeTruthy();
+      expect(doc.element().classList.contains('rewritten')).toBe(false);
+    });
   });
   /*
     describe('KorAP.DocKey', function () {
diff --git a/dev/js/src/init.js b/dev/js/src/init.js
index 66bc081..cd0adfc 100644
--- a/dev/js/src/init.js
+++ b/dev/js/src/init.js
@@ -70,11 +70,37 @@
 	)
       );
       input.parentNode.insertBefore(vcname, input);
-      
+
+      /**
+       * Toggle the Virtual Collection builder
+       */
+      var vc;
       vcname.onclick = function () {
-	var vc = vcClass.render(vcExample);
 	var view = document.getElementById('vc-view');
-	view.appendChild(vc.element());
+
+	// The vc is visible
+	if (this.classList.contains('active')) {
+	  view.removeChild(vc.element());
+	  this.classList.remove('active');
+	}
+
+	// The vc is not visible
+	else {
+	  // The vc is not rendered yet
+	  if (vc === undefined) {
+	    vc = vcClass.create([
+	      ['title', 'string'],
+	      ['subTitle', 'string'],
+	      ['pubDate', 'date'],
+	      ['author', 'string']
+	    ]);
+
+	    if (KorAP.currentVC !== undefined)
+	      vc.fromJson(KorAP.currentVC);
+	  };
+	  view.appendChild(vc.element());
+	  this.classList.add('active');
+	};
       };
     };
 
diff --git a/dev/js/src/vc.js b/dev/js/src/vc.js
index 80f6627..c816883 100644
--- a/dev/js/src/vc.js
+++ b/dev/js/src/vc.js
@@ -131,32 +131,25 @@
      * Create a new virtual collection.
      */
     create : function (keyList) {
-      return Object.create(this)._init(keyList);
-    },
-
-    clean : function () {
-      if (this._root.ldType() !== "non") {
-	this._root.destroy();
-	this.root(unspecDocClass.create(this));
-      };
-      return this;
+      var obj = Object.create(this)._init(keyList);
+      obj._root = unspecDocClass.create(obj);
+      return obj;
     },
 
     /**
      * Create and render a new virtual collection
      * based on a KoralQuery collection document 
      */
-    render : function (json, keyList) {
-      var obj = Object.create(this)._init(keyList);
+    fromJson : function (json) {
 
       if (json !== undefined) {
 	// Parse root document
 	if (json['@type'] == 'koral:doc') {
-	  obj._root = docClass.create(obj, json);
+	  this._root = docClass.create(this, json);
 	}
 	// parse root group
 	else if (json['@type'] == 'koral:docGroup') {
-	  obj._root = docGroupClass.create(obj, json);
+	  this._root = docGroupClass.create(this, json);
 	}
 	// Unknown collection type
 	else {
@@ -167,13 +160,21 @@
 
       else {
 	// Add unspecified object
-	obj._root = unspecDocClass.create(obj);
+	this._root = unspecDocClass.create(this);
       };
 
       // Init element and update
-      obj.update();
+      this.update();
 
-      return obj;
+      return this;
+    },
+
+    clean : function () {
+      if (this._root.ldType() !== "non") {
+	this._root.destroy();
+	this.root(unspecDocClass.create(this));
+      };
+      return this;
     },
 
     /**
diff --git a/dev/js/src/vc/doc.js b/dev/js/src/vc/doc.js
index 10a49a8..5571cf7 100644
--- a/dev/js/src/vc/doc.js
+++ b/dev/js/src/vc/doc.js
@@ -335,10 +335,13 @@
       if (arguments.length === 1) {
 	var m = match.replace(/^match:/, '');
 	if (
-	  (
-	    (this._type === 'string' || this._type === 'regex') &&
-	      KorAP._validStringMatchRE.test(m)
-	  ) ||
+	  (this._type === undefined)
+	    ||
+	    (
+	      (this._type === 'string' || this._type === 'regex') &&
+		KorAP._validStringMatchRE.test(m)
+	    )
+	    ||
 	    (this._type === 'date' && KorAP._validDateMatchRE.test(m))
 	) {
 	  this._matchop = m;
