     }
     
     /// creates new KVO Signal (initial + new value)
-    public func startingSignal(#keyPath: String) -> Signal<AnyObject?>
-    {
-        return self.signal(keyPath: keyPath).startWith(self.valueForKeyPath(keyPath))
+    public func startingSignal(#keyPath: String, nilValue: AnyObject? = nil) -> Signal<AnyObject?>
+    {
+        let initial: AnyObject? = self.valueForKeyPath(keyPath)
+        return self.signal(keyPath: keyPath, nilValue: nilValue).startWith((initial is NSNull) ? nilValue : initial)
     }
     
     ///

    /// let itemsProxy = model.mutableArrayValueForKey("items")
    /// itemsProxy.insertObject(newItem, atIndex: 0) // itemsSignal will send **both** `newItem` and `index`
    ///
    public func detailedSignal(#keyPath: String) -> Signal<(AnyObject?, NSKeyValueChange, NSIndexSet?)>
    {
        return Signal { [weak self] progress, fulfill, reject, configure in
            
            if let self_ = self {
                let observer = _KVOProxy(target: self_, keyPath: keyPath) { value, change, indexSet in
                    progress(value, change, indexSet)
                }
                
                configure.pause = { observer.stop() }

public struct KVO
{
    /// creates new KVO Signal (new value only)
    public static func signal(object: NSObject, _ keyPath: String, _ nilValue: AnyObject? = nil) -> Signal<AnyObject?>
    {
        return object.signal(keyPath: keyPath, nilValue: nilValue)
    }
    
    /// creates new KVO Signal (initial + new value)
    public static func startingSignal(object: NSObject, _ keyPath: String, _ nilValue: AnyObject? = nil) -> Signal<AnyObject?>
    {
        return object.startingSignal(keyPath: keyPath, nilValue: nilValue)
    }

    /// creates new KVO Signal (new value, keyValueChange, indexSet)
    public static func detailedSignal(object: NSObject, _ keyPath: String, _ nilValue: AnyObject? = nil) -> Signal<(AnyObject?, NSKeyValueChange, NSIndexSet?)>
    {
        return object.detailedSignal(keyPath: keyPath, nilValue: nilValue)
    }
}

