 				let semaphore = DispatchSemaphore(value: 0)
 				let progress = mcSession.sendResource(at: localURL, withName: resourceRequest.resourceName, toPeer: peer) { error in
 					if let error = error {
-						receipt.eventObserver.observe(.transferFailed(resourceRequest, peer, error))
+						receipt.eventObserver.observe(.failed(resourceRequest, peer, error))
 					} else {
-						receipt.eventObserver.observe(.transferFinished(resourceRequest, peer, localURL))
+						receipt.eventObserver.observe(.finished(resourceRequest, peer, localURL))
 					}
 					semaphore.signal()
 				}
 				receipt.disposable += { progress?.cancel() }
-				receipt.eventObserver.observe(.transferStarted(resourceRequest, peer, progress))
+				receipt.eventObserver.observe(.started(resourceRequest, peer, progress))
 				semaphore.wait()
 			}
 			receipt.disposable += { item.cancel() }

import Foundation
import MultipeerConnectivity

public final class ResourceRequestReceipt<Request: ResourceRequestProtocol>: RequestReceiptProtocol {
	public typealias Peer = Session.Peer
	public typealias Event = ResourceEvent<Request>

	public let request: Request
	public let peers: [Peer]

}

extension Session {
	public func submit<T: ResourceRequestProtocol>(_ resourceRequest: T, withResourceAt localURL: URL, to peers: [MCPeerID]) throws -> ResourceTransferOperation<T> {
		try send(resourceRequest, to: peers)

		let receipt = ResourceTransferOperation(request: resourceRequest, peers: peers)
		let transferQueue = DispatchQueue(label: "com.junpluse.Tuka.Session.ResourceTransferQueue")

		peers.forEach { peer in
