                 fatalError("Expected class, found struct/enum: \(subscriber)")
             }
             let identifier = ObjectIdentifier(eventType)
+            var subscribers = self.subscribers[identifier] ?? []
             let weakSubscriber = WeakSubscriber(subscriber as AnyObject)
-            let _ = self.subscribers[identifier]?.remove(weakSubscriber)
-            self.cleanup(eventType)
+            let _ = subscribers.remove(weakSubscriber)
+            self.subscribers[identifier] = Set(subscribers.filter { $0.inner is T })
+        }
+    }
+
+    public func remove<T>(subscriber: T) {
+        self.serialQueue.sync {
+            guard type(of: subscriber) is AnyClass else {
+                fatalError("Expected class, found struct/enum: \(subscriber)")
+            }
+            for (identifier, var subscribers) in self.subscribers {
+                let weakSubscriber = WeakSubscriber(subscriber as AnyObject)
+                let _ = subscribers.remove(weakSubscriber)
+                self.subscribers[identifier] = Set(subscribers.filter { $0.inner is T })
+            }
         }
     }
 

            var subscribers = self.subscribers[identifier] ?? []
            let weakSubscriber = WeakSubscriber(subscriber as AnyObject)
            subscribers.insert(weakSubscriber)
            self.subscribers[identifier] = subscribers
            self.cleanup(eventType)
        }
    }


/// Event bus
public class EventBus: EventNotifyable, EventSubscribable {

    struct WeakSubscriber : Hashable {
        weak var inner: AnyObject?

        init(_ inner: AnyObject) {
