docs: function(removed) {
  			var l       = removed.length,
  				roots   = {},
  				rm      = function(hash) {
  					var file = files[hash], i;
  					if (file) {
  						if (file.mime === 'directory') {
  							if (roots[hash]) {
  								delete self.roots[roots[hash]];
  							}
  							// restore stats of deleted root parent directory
  							$.each(self.leafRoots, function(phash, roots) {
  								var idx, pdir;
  								if ((idx = $.inArray(hash, roots))!== -1) {
  									if (roots.length === 1) {
  										if ((pdir = Object.assign({}, files[phash])) && pdir._realStats) {
  											$.each(pdir._realStats, function(k, v) {
  												pdir[k] = v;
  											});
  											remove(files[phash]._realStats);
  											self.change({ changed: [pdir] });
  										}
  										delete self.leafRoots[phash];
  									} else {
  										self.leafRoots[phash].splice(idx, 1);
  									}
  								}
  							});
  							if (self.searchStatus.state < 2) {
  								$.each(files, function(h, f) {
  									f.phash == hash && rm(h);
  								});
  							}
  						}
  						if (file.phash) {
  							if (parents = self.parents(file.phash)) {
  								$.each(parents, function() {
  									changedParents[this] = true;
  								});
  							}
  						}
  						deleteCache(files[hash]);
  					}
  				},
  				changedParents = {},
  				parents;
  		
  			$.each(self.roots, function(k, v) {
  				roots[v] = k;
  			});
  			while (l--) {
  				rm(removed[l]);
  			}
  			// delete sizeInfo cache
  			$.each(Object.keys(changedParents), function() {
  				var target = files[this];
  				if (target && target.sizeInfo) {
  					delete target.sizeInfo;
  				}
  			});
  		}