As we're kicking development off for the next version of MahTweets in the coming weeks, the team has been looking at experimenting with new technology and bringing the most useful stuff into the application.
Filtering is one of the things that MahTweets is famous for, but we're always looking for ways to make it better and easier. We've been experimenting with using the Reactive Extensions (Rx) for .NET to simplify the entire pipeline and provide more freedom in the application.
MahTweets allow the user to filter streams by update type, contact or text. Filters can be applied to individual streams or globally.
Roughly speaking, this is how the filters are applied.

Updates from external services are added to the queue, which then raises CollectionChangedEvent notifications to each views. The view is responsible for running an update through its configured filters.
Limitations about this approach:
FYI: If you're not familiar with the Observer Pattern, check out the Wikipedia article for starters. Rx uses the Observer pattern heavily.
We had a habit of using the phrase "filter" in many places of the application. To clarify our intent, we introduced two specific interfaces:
Replacing the Queue of messages with an IObservable/IObserver dual allows the application to leverage the Subject<T> class to manage the interactions between the services and the clients. This class resides in System.Reactive.dll and implements both IObservable<T> and IObserver<T>.
MahTweets also had some demo plugins for stream analytics, and abstracting away the queue support allows the application to plug in additional "global" services, using the same interfaces. Rx also allows observers to specify which thread to execute on, so the usage of the Dispatcher, TaskPool or ThreadPool (depending on scenario) can be configured without any plumbing code.
The interactions between these components now looks like:

The biggest change is that subscribers interact with the IObservable, rather than being encompassed within the view. Each list still combines a set of filters, which display the combined set of results on-screen. However, when multiple filters are run in parallel, invalid items may appear.
Limitations about this approach:
So after some shut-eye and sun, I revisited the initial design for the IObservable implementation. What stood out to me was that:
After some more musing, I formed an opinion about subscriber rules (only mine so far):
An exclude rule is applied globally. An include rule is applied locally.
From my experiences with using Twitter, the typical use cases for exclude filters are:
On the other hand, the use cases for include filters can be like:
Compare and contract (perhaps your experiences differ).
The second cut of the design allows for three subscriber hooks:

An internal subscriber verifies a status against a list of exclusions, and propogates the status further if it is valid. Each view only requires its inclusion rules (or a wildcard rule if no rules specified) to display results.