A method for providing cluster-wide access to a shared key-value repository, the repository comprising: an application programming layer presenting a common interface to all clients through which clients can make calls to store, access and manage key-value pairs in the repository, a service abstraction layer to process calls from the API layer, a messaging and cache layer including routines that may be called by components of the repository to communicate with other components of the repository and which manage accesses to a cache of key-value pairs, and a storage abstraction layer including plug-ins (152,154) each plug-in being adapted to a respective storage subsystem associated with it and exposing the same API, wherein a cluster comprises a set of nodes (102,104) that are able to communicate with each other, wherein each node comprises at least one client and component of the repository, wherein each node (102,104) has a single caching component, wherein a client is any form of software program that requires access to key-value pairs, each client being associated with a respective component, wherein one component of the repository is designated as the master component and has rights to interact with the storage abstraction layer, the method comprising: receiving, from a first client through said API layer, at a first component on a first node, a request to manage key-value pairs of the shared key-value repository; in response to receiving the request at the first component, determining at the service abstraction layer whether the first component has been designated as a caching component for the first node; in response to determining that the first component has not been designated as a caching component for the first node, the service abstraction layer determines whether a second component on the first node has been designated as a caching component for the first node, wherein the second component is associated with a second client on the first node, the request being passed by the messaging and cache layer to the second component; in response to receiving the request at the second component, the service abstraction layer of the second component determines via the messaging and cache layer of the second component whether information required by said request is contained in a local cache on the first node; in response to determining that the information required by said request is not contained in the local cache on the first node, the messaging and cache layer sends a message to a routine in the messaging and cache layer of the master component whereupon a routine of the service abstraction layer of the master component determines that the master cache should be inspected to determine if it contains the requested information; if the master cache contains the information, the information is passed back to the first client via the messaging and cache layer; if the master cache does not contain the required information, a message is sent to a plug-in in the storage abstraction layer to retrieve the information from the storage sub-system. an application programming layer presenting a common interface to all clients through which clients can make calls to store, access and manage key-value pairs in the repository, a service abstraction layer to process calls from the API layer, a messaging and cache layer including routines that may be called by components of the repository to communicate with other components of the repository and which manage accesses to a cache of key-value pairs, and a storage abstraction layer including plug-ins (152,154) each plug-in being adapted to a respective storage subsystem associated with it and exposing the same API, receiving, from a first client through said API layer, at a first component on a first node, a request to manage key-value pairs of the shared key-value repository; in response to receiving the request at the first component, determining at the service abstraction layer whether the first component has been designated as a caching component for the first node; in response to determining that the first component has not been designated as a caching component for the first node, the service abstraction layer determines whether a second component on the first node has been designated as a caching component for the first node, wherein the second component is associated with a second client on the first node, the request being passed by the messaging and cache layer to the second component; in response to receiving the request at the second component, the service abstraction layer of the second component determines via the messaging and cache layer of the second component whether information required by said request is contained in a local cache on the first node; in response to determining that the information required by said request is not contained in the local cache on the first node, the messaging and cache layer sends a message to a routine in the messaging and cache layer of the master component whereupon a routine of the service abstraction layer of the master component determines that the master cache should be inspected to determine if it contains the requested information; if the master cache contains the information, the information is passed back to the first client via the messaging and cache layer; if the master cache does not contain the required information, a message is sent to a plug-in in the storage abstraction layer to retrieve the information from the storage sub-system.