Phil, that's a huge help, thanks so much for pointing me in the right direction. The notion of the factory being persistent and "owning" a protocol for each connection was what I needed to wrap my head around the problem. In fact, when I thought about it some more, I realized that the factory should "own" the inotify watcher. This then makes it straightforward for the factory to pass in its instance method as inotify's callback. I've implemented your suggestions and retooled my "Echo" example as "TmpTell" (attached). When you run it, it creates several persistent clients (one for each port number listed on the command line). Then, each time a file is created in /tmp, each client tells its server about the new file. here's an example usage. first, start up a "server" $ socat - tcp4-listen:1234 and another: $ socat - tcp4-listen:1235 now start up tmptell: $ python tmptell.py 1234 1235 calling TmpTellClientFactory.__init__ calling TmpTellClientFactory.startFactory calling TmpTellClientFactory.startedConnecting calling TmpTellClientFactory.startedConnecting calling TmpTellClientFactory.buildProtocol calling TmpTell.__init__ calling TmpTellClientFactory.buildProtocol calling TmpTell.__init__ finally, in a third terminal, run 'mktemp': $ mktemp /tmp/tmp.1xtuY16NKr you will then see this additional output in the tmptell terminal: calling TmpTellClientFactory.inotifyEventHappened calling TmpTell.announceNewFile calling TmpTell.announceNewFile and your "servers" will look like this: $ socat - tcp4-listen:1234 new file created at FilePath('/tmp/tmp.1xtuY16NKr') $ socat - tcp4-listen:1235 new file created at FilePath('/tmp/tmp.1xtuY16NKr') if you kill one of the servers with CTRL+c, you see this in the tmptell terminal: calling TmpTell.connectionLost calling TmpTellClientFactory.removeProtocolObject calling TmpTellClientFactory.clientConnectionLost and now we run mktemp a second time: $ mktemp /tmp/tmp.L5EeFSdXRJ and now tmptell correctly calls announceNewFile just once, instead of twice: calling TmpTellClientFactory.inotifyEventHappened calling TmpTell.announceNewFile and the server we didn't kill looks like this now: $ socat - tcp4-listen:1235 new file created at FilePath('/tmp/tmp.1xtuY16NKr') new file created at FilePath('/tmp/tmp.L5EeFSdXRJ') Thanks again Phil, I think I've got it now! -jason