 
 		// load up all ids so we know if some have been removed
 		var deleteOldIds: [BaseDataFileImportType: [String]] = [:]
-		for type in Array(Set(progressFiles.map({ $0.type }))) {
+		for type in Array(Set((progressFilesEvents + progressFilesOther).map({ $0.type }))) {
 			deleteOldIds[type] = self.getAllIds(type: type, with: manager)
 		}
-
-		for row in progressFiles {
-			let type = row.type
-			let filename = row.filename
-			let batchProgress = row.progress
-			do {
-				if let file = Bundle.main.path(forResource: filename, ofType: "json") {
-                    let data = try Data(contentsOf: URL(fileURLWithPath: file))
-					let ids = importData(data, with: manager)
-					deleteOldIds[type] = Array(Set(deleteOldIds[type] ?? []).subtracting(ids))
-				}
-			} catch {
-				// failure
-				deleteOldIds[type] = [] // don't delete any rows
-				print("Failed to load file \(filename)")
-			}
-			progress += batchProgress
-			self.fireProgress(progress: progress, progressTotal: progressTotal)
-		}
+        
+        let queue = DispatchQueue.global(qos: .userInitiated)
+        let queueGroup = DispatchGroup()
+        
+        let markIdsImported: (BaseDataFileImportType, [String]) -> Void = { (type, ids) in
+            deleteOldIds[type] = Array(Set(deleteOldIds[type] ?? []).subtracting(ids))
+        }
+        let updateFileProgress: (Double) -> Void = { (batchProgress) in
+            progress += batchProgress
+            self.fireProgress(progress: progress, progressTotal: progressTotal)
+        }
+        
+        // process all events first
+        for row in progressFilesEvents {
+            queueGroup.enter()
+            queue.async(group: queueGroup) {
+                importFile(fileDefinition: row, markIdsImported: markIdsImported, updateProgress: updateFileProgress)
+                queueGroup.leave()
+            }
+        }
+        // wait for finish
+        queueGroup.wait()
+
+		for row in progressFilesOther {
+            queueGroup.enter()
+            queue.async(group: queueGroup) {
+                importFile(fileDefinition: row, markIdsImported: markIdsImported, updateProgress: updateFileProgress)
+                queueGroup.leave()
+            }
+		}
+        // wait for finish
+        queueGroup.wait()
 
 		// remove any old entries not included in this update
 		// (this is unsupported in XCTest inMemoryStore)

	}

	func addData() {
		let progressTotal = progressFiles.map { $0.progress }.reduce(0.0, +)
			+ (progressProcessImportChunk * 2.0) + progressFinalPadding
		importDataFiles(progress: 0.0, progressTotal: progressTotal)
		processImportedData(


		fireProgress(progress: progressTotal, progressTotal: progressTotal)
	}
    
    func importFile(
        fileDefinition: CoreDataFileImport,
        markIdsImported: @escaping ((BaseDataFileImportType, [String]) -> Void),
        updateProgress: @escaping ((Double) -> Void)
    ) {
        let type = fileDefinition.type
        let filename = fileDefinition.filename
        let batchProgress = fileDefinition.progress
        do {
            if let file = Bundle.main.path(forResource: filename, ofType: "json") {
                let data = try Data(contentsOf: URL(fileURLWithPath: file))
                let ids = importData(data, with: manager)
                markIdsImported(type, ids)
            }
        } catch {
            // failure
            print("Failed to load file \(filename)")
        }
        updateProgress(batchProgress)
    }
    
	func processImportedMapData(
		queue: DispatchQueue,
		updateProgress: @escaping ((Double, Bool) -> Void)
