Middleware's success and proliferation has recreated—at a higher level—the very problem it was designed to address. Rather than having to deal with multiple different OSs, today?s distributed-application developers face multiple middleware approaches. Indeed, middleware does provide the promised abstractions, but different approaches provide different types of abstractions. For example, those found in message-queuing systems are quite different from the ones in distributed object systems.