An autonomic software architecture for distributed applications