 		Self.resetCurrent()
 	}
 	static func resetDirty() {
-		Self.remove(at: Self.dirtyPath)
+		Self.cached.set(value: nil, forKey: Self.dirtyPath)
+		Self.removeArchive(at: Self.dirtyPath)
 	}
 	static func unarchiveDirty() -> Self {
-		return Self.unarchive(from: Self.dirtyPath) ?? Self.unarchiveCurrent()
+		if let cached = Self.cached.getValue(forKey: Self.dirtyPath), let ret = cached.copy() as? Self {
+			return ret
+		} else {
+			let dirty = Self.unarchive(from: Self.dirtyPath) ?? Self.unarchiveCurrent()
+			Self.cached.set(value: dirty.copy() as? Self, forKey: Self.dirtyPath)
+			return dirty
+		}
 	}
 	static func modifyAll(with block: (Self) -> Void) {
+		Self.modifyDirty(with: block)
+		Self.modifyCurrent(with: block)
+	}
+	static func modifyDirty(with block: (Self) -> Void) {
 		let du = Self.unarchiveDirty()
 		block(du)
 		du.archiveDirty()
-
-		let cu = Self.unarchiveCurrent()
-		block(cu)
-		cu.archiveCurrent()
 	}
 }

	static func unarchiveDirty() -> Self
	func handleDirtyChanges(old: Self, new: Self)
	static func modifyAll(with block: (Self) -> Void)
}

protocol ArchivableCurrent {

		if var copy = self.copy() as? Self {
			copy.version = version + 1
			let old = Self.unarchiveDirty()
			Self.cached.set(value: self.copy() as? Self, forKey: Self.dirtyPath)
			copy.archive(at: Self.dirtyPath)
			handleDirtyChanges(old: old, new: self)
		}
