docs: function(data) {
  			// NOTES: Do not touch data object
  		
  			var volumeid, contextmenu, emptyDirs = {}, stayDirs = {},
  				rmClass, hashes, calc, gc, collapsed, prevcwd, sorterStr;
  			
  			if (self.api >= 2.1) {
  				// support volume driver option `uiCmdMap`
  				self.commandMap = (data.options.uiCmdMap && Object.keys(data.options.uiCmdMap).length)? data.options.uiCmdMap : {};
  				if (uiCmdMapPrev !== JSON.stringify(self.commandMap)) {
  					uiCmdMapPrev = JSON.stringify(self.commandMap);
  				}
  			} else {
  				self.options.sync = 0;
  			}
  			
  			if (data.init) {
  				// init - reset cache
  				files = {};
  				ownFiles = {};
  			} else {
  				// remove only files from prev cwd
  				// and collapsed directory (included 100+ directories) to empty for perfomance tune in DnD
  				prevcwd = cwd;
  				rmClass = 'elfinder-subtree-loaded ' + self.res('class', 'navexpand');
  				collapsed = self.res('class', 'navcollapse');
  				hashes = Object.keys(files);
  				calc = function(i) {
  					if (!files[i]) {
  						return true;
  					}
  					
  					var isDir = (files[i].mime === 'directory'),
  						phash = files[i].phash,
  						pnav;
  					
  					if (
  						(!isDir
  							|| emptyDirs[phash]
  							|| (!stayDirs[phash]
  								&& $('#'+self.navHash2Id(files[i].hash)).is(':hidden')
  								&& $('#'+self.navHash2Id(phash)).next('.elfinder-navbar-subtree').children().length > 100
  							)
  						)
  						&& (isDir || phash !== cwd)
  						&& ! remember[i]
  					) {
  						if (isDir && !emptyDirs[phash]) {
  							emptyDirs[phash] = true;
  							$('#'+self.navHash2Id(phash))
  							 .removeClass(rmClass)
  							 .next('.elfinder-navbar-subtree').empty();
  						}
  						deleteCache(files[i]);
  					} else if (isDir) {
  						stayDirs[phash] = true;
  					}
  				};
  				gc = function() {
  					if (hashes.length) {
  						gcJobRes && gcJobRes._abort();
  						gcJobRes = self.asyncJob(calc, hashes, {
  							interval : 20,
  							numPerOnce : 100
  						});
  					}
  				};
  				
  				self.trigger('filesgc').one('filesgc', function() {
  					hashes = [];
  				});
  				
  				self.one('opendone', function() {
  					if (prevcwd !== cwd) {
  						if (! node.data('lazycnt')) {
  							gc();
  						} else {
  							self.one('lazydone', gc);
  						}
  					}
  				});
  			}
  
  			self.sorters = {};
  			cwd = data.cwd.hash;
  			cache(data.files);
  			if (!files[cwd]) {
  				cache([data.cwd]);
  			}
  
  			// trigger event 'sorterupdate'
  			sorterStr = JSON.stringify(self.sorters);
  			if (prevSorterStr !== sorterStr) {
  				self.trigger('sorterupdate');
  				prevSorterStr = sorterStr;
  			}
  
  			self.lastDir(cwd);
  			
  			self.autoSync();
  		}