Middleware demystified