     # Starting to download some buckets
     while @batchCount < @BATCH_LIMIT and @queue.length
 
-      items = @queue.splice(0, Math.min(@BATCH_SIZE, @queue.length))
-      batch = (item.bucket for item in items)
-      @pullBatch(batch)
+      batch = []
+      while batch.length < @BATCH_SIZE and @queue.length
+        address = @queue.shift().bucket
+        bucket = @cube.getBucketByZoomedAddress(address)
+
+        continue unless bucket.needsRequest()
+
+        batch.push(address)
+        bucket.pull()
+
+      if batch.length > 0
+        @pullBatch(batch)
 
 
   pullBatch : (batch) ->

        bucket[1] << (zoomStep + @cube.BUCKET_SIZE_P)
        bucket[2] << (zoomStep + @cube.BUCKET_SIZE_P)
      )

    if transmitBuffer.length == 0
      return

    # Measuring the time until response arrives to select appropriate preloading strategy
    roundTripBeginTime = new Date()


    transmitBuffer = []
    for bucket in batch
      zoomStep = bucket[3]
      transmitBuffer.push(
        zoomStep
