 				if (!boundsArray)
 					_keyToBoundsMap[key] = boundsArray = [];
 				
+				// this may trigger callbacks, which would cause us to skip the new key
+				// at index 0 if we did not have _iterate0 as part of the async task
 				_plotter.getDataBoundsFromRecordKey(key, boundsArray);
 				
 				if (_keyToGeometriesMap != null)

			if (debug)
				debugTrace(plotter,this,'createIndex');
			
			_queryMissingBounds = queryMissingBounds;
			
			var key:IQualifiedKey;
			var bounds:IBounds2D;
			var i:int;
			
			if (plotter is IPlotterWithGeometries)
				_keyToGeometriesMap = new Dictionary();
			else 
				_keyToGeometriesMap = null;
			
			_keysArray.length = 0; // hack to prevent callbacks
			clear();
			_plotter = plotter;

			// make a copy of the keys vector
			if (plotter)
				VectorUtils.copy(plotter.filteredKeySet.keys, _keysArray);			
			
			// if auto-balance is disabled, randomize insertion order
			if (!_kdTree.autoBalance)

			if (debug)
				debugTrace(_plotter,this,'keys',_keysArray.length);
			
			return 1;
		}
		
		private function _iterate1(stopTime:int):Number
		{
			for (; _keysIndex < _keysArray.length; _keysIndex++)
			{
				if (_restarted)
					return 0;
				if (getTimer() > stopTime)
					return _keysIndex / _keysArray.length;
				
