diff --git a/public/js/src/vc.js b/public/js/src/vc.js
index d9cde4e..42e51c3 100644
--- a/public/js/src/vc.js
+++ b/public/js/src/vc.js
@@ -1,8 +1,9 @@
 var KorAP = KorAP || {};
 
 // TODO: Implement a working localization solution!
-// TODO: Support 'update' method to update elements on change
-// TODO: Implement "toQuery"
+// TODO: Remove "and" or "or" in case it's followed
+//       by an unspecified document
+// TODO: Add 'or' or 'and' on root
 
 /*
   Error codes:
@@ -56,10 +57,11 @@
   };
 
 
-  // Add doc
+  // Add new unspecified document
   KorAP._add = function (obj, type) {
     var ref = obj.parentNode.refTo;
     var parent = ref.parent();
+
     if (ref.ldType() === 'docGroup') {
 
       // Check that the action differs from the type
@@ -75,8 +77,11 @@
       };
     }
     else if (ref.ldType() === 'doc') {
-// Todo: Check if parent is a group
-      if (parent.operation() === type) {
+
+      if (parent.ldType() === null) {
+	return ref.wrapOnRoot(type);
+      }
+      else if (parent.operation() === type) {
 	return parent.newAfter(ref);
       }
       else {
@@ -97,13 +102,16 @@
     return KorAP._add(this, 'or');
   };
 
+
   // Remove doc or docGroup
   KorAP._delete = function () {
     var ref = this.parentNode.refTo;
-    if (ref.parent().ldType() !== null)
-      ref.parent().delOperand(ref).update();
-    else
+    if (ref.parent().ldType() !== null) {
+      return ref.parent().delOperand(ref).update();
+    }
+    else {
       ref.parent().clean();
+    };
   };
 
 
@@ -159,9 +167,7 @@
       if (arguments.length === 1) {
 	var e = this.element();
 	if (e.firstChild !== null) {
-	  console.log(e.firstChild);
 	  if (e.firstChild !== obj.element()) {
-console.log(e.firstChild);
 	    e.replaceChild(obj.element(), e.firstChild);
 	  };
 	}
@@ -669,7 +675,7 @@
     },
 
     newAfter : function (obj) {
-      for (var i in this._operands) {
+      for (var i = 0; i < this._operands.length; i++) {
 	if (this._operands[i] === obj) {
 	  var operand = KorAP.UnspecifiedDoc.create(this);
 	  this._operands.splice(i + 1, 0, operand);
@@ -728,25 +734,11 @@
       };
     },
 
-    // Wrap a new operation around the root group element 
-    wrapOnRoot : function () {
-      var parent = this.parent();
-
-      var group = KorAP.DocGroup.create(parent);
-      group.operation(
-	this.operation() === 'and' ? 'or' : 'and'
-      );
-      group.append(this);
-      this.parent(group);
-      group.append();
-      group.element(); // Init (seems to be necessary)
-      parent.root(group);
-      return this.parent();
-    },
-
     update : function () {
       // There is only one operand in group
+
       if (this._operands.length === 1) {
+
 	var parent = this.parent();
 	var op = this.getOperand(0);
 
@@ -755,9 +747,8 @@
 	this._operands = [];
 
 	// Parent is a group
-	if (parent.ldType() !== null) {
+	if (parent.ldType() !== null)
 	  return parent.replaceOperand(this, op).update();
-	}
 
 	// Parent is vc
 	else {
@@ -778,7 +769,7 @@
       _removeChildren(group);
 
       // Append operands
-      for (var i in this._operands) {
+      for (var i = 0; i < this._operands.length; i++) {
 	group.appendChild(
 	  this.getOperand(i).element()
 	);
@@ -834,11 +825,13 @@
 
     // Replace operand
     replaceOperand : function (oldOp, newOp) {
-      for (var i in this._operands) {
+
+      for (var i = 0; i < this._operands.length; i++) {
 	if (this._operands[i] === oldOp) {
 
 	  // Just insert a doc or ...
 	  if (newOp.ldType() === "doc" ||
+	      newOp.ldType() === "non" ||
 	      // ... insert a group of a different operation
 	      // (i.e. "and" in "or"/"or" in "and")
 	      newOp.operation() != this.operation()) {
@@ -869,7 +862,7 @@
 
     // Delete operand from group
     delOperand : function (obj) {
-      for (var i in this._operands) {
+      for (var i = 0; i < this._operands.length; i++) {
 	if (this._operands[i] === obj) {
 
 	  // Delete identified operand
@@ -923,7 +916,7 @@
 
     toJson : function () {
       var opArray = new Array();
-      for (var i in this._operands) {
+      for (var i = 0; i < this._operands.length; i++) {
 	if (this._operands[i].ldType() !== 'non')
 	  opArray.push(this._operands[i].toJson());
       };
@@ -1005,12 +998,31 @@
 
       // In case of a group, destroy all operands
       if (this._operands !== undefined) {
-	for (var i in this._operands)
+      for (var i = 0; i < this._operands.length; i++)
 	  this.getOperand(i).destroy();
 	this._operands = [];
       };
     },
 
+    // Wrap a new operation around the root group element 
+    wrapOnRoot : function (op) {
+      var parent = this.parent();
+
+      var group = KorAP.DocGroup.create(parent);
+      if (arguments.length === 1)
+	group.operation(op);
+      else
+	group.operation(
+	  this.operation() === 'and' ? 'or' : 'and'
+	);
+      group.append(this);
+      this.parent(group);
+      group.append();
+      group.element(); // Init (seems to be necessary)
+      parent.root(group);
+      return this.parent();
+    },
+
     // Be aware! This may be cyclic
     operators : function (and, or, del) {
       if (arguments === 0)
