1. A method performed by a cloud storage client in a client device for saving a plurality of files to a cloud file system, wherein the cloud file system resides, at least partially, in a cloud storage system, the method comprising the steps of: for each of the plurality of files, performing the following: splitting that file into a plurality of chunks, for each of the plurality of chunks, performing the following: generating an encryption key based on data with that chunk, encrypting that chunk using the generated encryption key, generating a chunk identifier based on data within the encrypted chunk, including the encryption key and the chunk identifier in the file manifest, determining whether the cloud storage system includes the encrypted chunk, and transmitting the encrypted chunk and chunk identifier to the cloud storage system only if it is determined that the cloud storage system does not contain the encrypted chunk, wherein the file manifest includes a list of the encryption keys and corresponding chunk identifiers for the plurality of chunks, generating a file manifest encryption key based on the data within the file manifest, encrypting the file manifest using the file manifest encryption key, generating a file manifest identifier based on data within the encrypted file manifest, including the file manifest encryption key and the file manifest identifier in a file system manifest, determining whether the cloud storage system includes the encrypted file manifest, and transmitting the encrypted file manifest and the file manifest identifier to the cloud storage system only if it is determined that the cloud storage system does not include the encrypted file manifest; wherein the file system manifest includes a listing of the file manifests for each of the plurality of files and a path of the plurality of files; encrypting the file system manifest; and transmitting the encrypted file system manifest to the cloud storage system.