 		if let found = geometryCache[key] {
 			return found.tessellation
 		} else if streamIfMissing {
-			_ = streamMissingPrimitive(for: regionHash)
+			streamMissingPrimitive(for: regionHash)
 		}
 		return nil
 	}
 	
-	func streamPrimitive(for regionId: RegionId) {
+	func evictPrimitive(for regionHash: RegionHash) {
+		for lod in 0 ..< chunkTable.lodCount {
+			let loddedRegionHash = regionHashLodKey(regionHash, atLod: lod)
+			geometryCache.removeValue(forKey: loddedRegionHash)
+		}
+	}
+	
+	private func streamMissingPrimitive(for regionHash: RegionHash) {
+		guard let regionId = regionIdLookup[regionHash] else {
+			print("RegionId lookup failed for hash \(regionHash)")
+			return
+		}
+		
 		let runtimeLodKey = regionHashLodKey(regionId.hashed, atLod: wantedLodLevel)
-		if pendingChunks.contains(ChunkRequest(runtimeLodKey)) {
-			return
-		}
-		
-		frameChunkRequests.append(regionId)
+		if !pendingChunks.contains(ChunkRequest(runtimeLodKey)) {
+			frameChunkRequests.append(regionId)
+			lodCacheMiss = true
+		}
 	}
 	
 	func updateStreaming() {

			return
		}
		
		for regionId in frameChunkRequests {
			let chunkName = chunkLodName(regionId, atLod: wantedLodLevel)
			let runtimeLodKey = regionHashLodKey(regionId.hashed, atLod: wantedLodLevel)

	
	func renderPrimitive(for regionHash: RegionHash) -> IndexedRenderPrimitive<Vertex>? {
		if primitiveHasWantedLod(for: regionHash) == false {
			streamMissingPrimitive(for: regionHash)
		}
		
		let actualRegionHash = regionHashLodKey(regionHash, atLod: actualLodLevel)
		return geometryCache[actualRegionHash]?.primitive
	}
	
	func tessellation(for regionHash: RegionHash, atLod lod: Int, streamIfMissing: Bool = false) -> GeoTessellation? {
