AEM: Availability Enhancing Middleware - An Approach for Enhancing the Availability of Software Applications