A data storage system comprising: at least two universal nodes each comprising: CPU resources, memory resources, network interface resources, and a storage virtualiser; and a system controller, each storage virtualizer in each universal node is allocated by the system controller a number of storage provider resources that it manages, the system controller maintaining a map for dependency of virtual appliances to storage providers recources, and storing context and state of each storage virtualizer wherein each storage virtualizer is a slave device, each storage virtualiser provides storage to dependent virtual appliances, said storage being to said storage providers through a network protocol (35, N_IOC, S_IOC), each storage virtualizer is adapted to manage storage providers and is tolerant to fault conditions and the fault tolerance is achieved by an ability of the storage virtualiser to migrate from one universal node to any other universal node, in which if any universal node fails any other universal node can be reconfigured by the system controller to take over the storage providers by recovering storage virtualizer context and state held by the system controller; virtual appliances (17(a)) may run locally on a universal node where the storage virtualizer has migrated to or can be run on another universal node, and in that the system controller is adapted to execute an algorithm for leadership election between peer universal nodes for failover protection, wherein the system controller is adapted to allow each universal node to paritcipate in a leadership election, and wherein each universal node is adapted to execute a leadership role which follows a state machine, and in which an elected leader is responsible for logically organising the universal nodes into teams with failure links, and is adapted to create a configuration of nodes, and in the case of a node failure, the remaining configured nodes use their knowledge of pairing to recover from the failure, and wherein failover and/or failback of resources occurs between paired nodes, the leader is responsible for creating pairs, and all nodes are responsible for ensuring that their pairs are present and functioning. at least two universal nodes each comprising: CPU resources, memory resources, network interface resources, and a storage virtualiser; and a system controller, CPU resources, memory resources, network interface resources, and a storage virtualiser; and a system controller, each storage virtualizer in each universal node is allocated by the system controller a number of storage provider resources that it manages, the system controller maintaining a map for dependency of virtual appliances to storage providers recources, and storing context and state of each storage virtualizer wherein each storage virtualizer is a slave device, each storage virtualiser provides storage to dependent virtual appliances, said storage being to said storage providers through a network protocol (35, N_IOC, S_IOC), each storage virtualizer is adapted to manage storage providers and is tolerant to fault conditions and the fault tolerance is achieved by an ability of the storage virtualiser to migrate from one universal node to any other universal node, in which if any universal node fails any other universal node can be reconfigured by the system controller to take over the storage providers by recovering storage virtualizer context and state held by the system controller; virtual appliances (17(a)) may run locally on a universal node where the storage virtualizer has migrated to or can be run on another universal node, and in that the system controller is adapted to execute an algorithm for leadership election between peer universal nodes for failover protection, wherein the system controller is adapted to allow each universal node to paritcipate in a leadership election, and wherein each universal node is adapted to execute a leadership role which follows a state machine, and in which an elected leader is responsible for logically organising the universal nodes into teams with failure links, and is adapted to create a configuration of nodes, and in the case of a node failure, the remaining configured nodes use their knowledge of pairing to recover from the failure, and wherein failover and/or failback of resources occurs between paired nodes, the leader is responsible for creating pairs, and all nodes are responsible for ensuring that their pairs are present and functioning.