 		// Start streaming failed requests from the current frame
 		for regionId in frameChunkRequests {
 			let chunkName = chunkLodName(regionId, atLod: streamedLodLevel)
-			let runtimeLodKey = regionHashLodKey(regionId.hashed, atLod: streamedLodLevel)
+			let request = ChunkRequest(regionId, atLod: streamedLodLevel)
+			pendingChunks.insert(request)
 			
-			pendingChunks.insert(ChunkRequest(regionId, atLod: streamedLodLevel))
-			
-			streamQueue.async {
+			streamQueue.async {																				// OK to load data concurrently...
 				if let tessellation = self.loadGeometry(chunkName) {
-					// Create the render primitive and update book-keeping on the main thread
-					DispatchQueue.main.async {
-						self.tessellationCache[runtimeLodKey] = tessellation
+					DispatchQueue.main.sync {	// $ Idiotic
+						os_unfair_lock_lock(&self.readTessellationLock)				// But inserting must be done exclusively
+						self.deliveredChunks.append((request, tessellation))
+						os_unfair_lock_unlock(&self.readTessellationLock)			// $ Could this be barrier blocks now that loading doesn't block as bad?
 					}
 				} else {
 					print("No geometry chunk available for \(chunkName)")

	let fileData: Data	// fileData is memory-mapped so no need to attach a FileHandle here
	let fileHeader: WorldHeader
	let chunkTable: ChunkTable
	let streamQueue: DispatchQueue
	
	var wantedLodLevel: Int
	var actualLodLevel: Int = 10
	var lodCacheMiss: Bool = true
	var frameChunkRequests: [RegionId] = []
	var pendingChunks: Set<ChunkRequest> = []
	var tessellationCache: [Int : GeoTessellation] = [:]
	var primitiveCache: [Int : IndexedRenderPrimitive<Vertex>] = [:]
	var regionIdLookup: [RegionHash : RegionId] = [:]	// To avoid dependency on RuntimeWorld

	}
	
	private func streamMissingPrimitive(for regionHash: RegionHash) {
		guard let regionId = regionIdLookup[regionHash] else {
			print("RegionId lookup failed for hash \(regionHash)")
			return
