 		return PropertyOf(_executing)
 	}
 
+	private let _executing: MutableProperty<Bool> = MutableProperty(false)
+
 	/// Whether the action is currently enabled.
 	public var enabled: PropertyOf<Bool> {
-		return PropertyOf(_enabled)
+		let property = MutableProperty(false)
+
+		userEnabled.producer
+			|> combineLatestWith(executing.producer)
+			|> map(self.dynamicType.shouldBeEnabled)
+			// FIXME: Workaround for <~ being disabled on SignalProducers.
+			|> startWithSignal { signal, disposable in
+				let bindDisposable = property <~ signal
+				disposable.addDisposable(bindDisposable)
+			}
+
+		return PropertyOf(property)
 	}
 
-	private let _executing: MutableProperty<Bool> = MutableProperty(false)
-	private let _enabled: MutableProperty<Bool> = MutableProperty(true)
+	/// Whether the instantiator of this action wants it to be enabled.
+	private let userEnabled: PropertyOf<Bool>
+
+	/// This queue is used for read-modify-write operations on the `_executing`
+	/// property.
+	private let executingQueue = dispatch_queue_create("org.reactivecocoa.ReactiveCocoa.Action.executingQueue", DISPATCH_QUEUE_SERIAL)
 
 	/// Whether the action should be enabled for the given combination of user
 	/// enabledness and executing status.
-	private func shouldBeEnabled(#userEnabled: Bool, executing: Bool) -> Bool {
+	private class func shouldBeEnabled(#userEnabled: Bool, executing: Bool) -> Bool {
 		return userEnabled && !executing
 	}
 

	/// `RACError.ActionNotEnabled`, and nothing will be sent upon `values` or
	/// `errors` for that particular signal.
	public func apply(input: Input) -> SignalProducer<Output> {
		fatalError("TODO")
	}
}

		let (eSig, eSink) = Signal<NSError>.pipe()
		errorsObserver = eSink
		errors = eSig
	}

	/// Initializes an action that will be enabled by default, and create a
