 	}
 
 	@final func filter(initialValue: T, pred: T -> Bool) -> Observable<T> {
-		return self
-			.map { value in
+		return Observable(initialValue: initialValue) { send in
+			return self.observe { value in
 				if pred(value) {
-					return value
-				} else {
-					return nil
-				}
-			}
-			.removeNil(identity, initialValue: initialValue)
+					send(value)
+				}
+			}
+		}
 	}
 
 	@final func skipRepeats<U: Equatable>(evidence: Observable<T> -> Observable<U>) -> Observable<U> {

	}

	@final func map<U>(f: T -> U) -> Observable<U> {
		return mapAccumulate(()) { (_, value) in
			return ((), f(value))
		}
	}

	@final func scan<U>(initialValue: U, _ f: (U, T) -> U) -> Observable<U> {
		return mapAccumulate(initialValue) { (previous, current) in
			let mapped = f(previous, current)
			return (mapped, mapped)
		}
	}

	@final func take(count: Int) -> Observable<T> {
		assert(count > 0)

		return mapAccumulate(0) { (n, value) in
			let newN: Int? = (n + 1 < count ? n + 1 : nil)
			return (newN, value)
		}
	}

	@final func takeWhileThenNil(pred: T -> Bool) -> Observable<T?> {
		return mapAccumulate(true) { (taking, value) in
			if taking && pred(value) {
				return (true, value)
			} else {
				return (nil, nil)
			}
		}
	}

	@final func combinePrevious(initialValue: T) -> Observable<(T, T)> {
		return mapAccumulate(initialValue) { (previous, current) in
			return (current, (previous, current))
		}
	}

	@final func skipAsNil(count: Int) -> Observable<T?> {
		return mapAccumulate(0) { (n, value) in
			if n >= count {
				return (count, value)
			} else {
				return (n + 1, nil)
			}
		}
	}

	@final func skipAsNilWhile(pred: T -> Bool) -> Observable<T?> {
		return mapAccumulate(true) { (skipping, value) in
			if !skipping || !pred(value) {
				return (false, value)
			} else {
				return (true, nil)
			}
		}
	}

		}
	}

	@final func ignoreNil<U>(evidence: Observable<T> -> Observable<U?>, initialValue: U) -> Observable<U> {
		return Observable<U>(initialValue: initialValue) { send in
			return evidence(self).observe { maybeValue in
				if let value = maybeValue {
