diff --git a/src/cs-S3Zip.Tests/S3ZipTests.cs b/src/cs-S3Zip.Tests/S3ZipTests.cs
index 09f4c7958c662362b07daac5ac93a662517c49b9..966c81a271912a222a12b7a92abd5243bacf8202 100644
--- a/src/cs-S3Zip.Tests/S3ZipTests.cs
+++ b/src/cs-S3Zip.Tests/S3ZipTests.cs
@@ -1,22 +1,27 @@
 
 using Amazon.S3;
-using coscine.cs_S3Zip;
+using Amazon.S3.Model;
 using NUnit.Framework;
 using System;
+using System.IO;
+using System.Linq;
+using System.Security.Cryptography;
 
-namespace cs_S3Zip.Tests
+namespace coscine.cs_S3Zip.Tests
 {
     [TestFixture]
     public class S3ZipTests
     {
-
         private readonly S3MultipartStreamConfiguration _s3MultipartStreamConfiguration;
 
+        private readonly int ONE_MB;
+
         public S3ZipTests()
         {
-            var accessKey = Environment.GetEnvironmentVariable("AccessKey", EnvironmentVariableTarget.User);
-            var secretKey = Environment.GetEnvironmentVariable("SecretKey", EnvironmentVariableTarget.User);
+            var accessKey = Environment.GetEnvironmentVariable("S3_ACCESS_KEY", EnvironmentVariableTarget.User);
+            var secretKey = Environment.GetEnvironmentVariable("S3_SECRET_KEY", EnvironmentVariableTarget.User);
 
+            ONE_MB = (int)Math.Pow(2, 20);
 
             _s3MultipartStreamConfiguration = new S3MultipartStreamConfiguration
             {
@@ -31,18 +36,73 @@ namespace cs_S3Zip.Tests
             };
         }
 
-        [Test]
+        /*[Test]
         public void ZipAndUpload()
         {
-            //var s3 = new S3Zip(_s3MultipartStreamConfiguration);
-            //s3.ZipAndUploadFolder(@"c:\temp\test", "zipTest4.zip");
+            var s3 = new S3Zip(_s3MultipartStreamConfiguration);
+            s3.ZipAndUploadFolder(@"c:\temp\test", "zipTest4.zip");
             Assert.IsTrue(true);
-        }
+        }*/
 
-        [Test]
-        public void S3StreamTest()
+        [TestCase(110, 50)]
+        [TestCase(110, 5)]
+        [TestCase(30, 50)]
+        [TestCase(30, 5)]
+        public void S3StreamTest(int length, int chunkSize)
         {
-            Assert.IsTrue(true);
+            var key = "S3StreamTest.txt";
+            var chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();
+            var random = new Random();
+            var randomArray = new byte[length * ONE_MB];
+
+            var oldChunkSize = _s3MultipartStreamConfiguration.ChunckSize;
+            _s3MultipartStreamConfiguration.ChunckSize = chunkSize * ONE_MB;
+
+            // fill array with random data
+            for (int i = 0; i < randomArray.Length; i++)
+            {
+                randomArray[i] = (byte)chars[random.Next(chars.Length)];
+            }
+
+            using (var s3Stream = new S3MultipartStream(key, _s3MultipartStreamConfiguration))
+            {
+                for (int i = 0; i < length; i++)
+                {
+                    s3Stream.Write(randomArray, i * ONE_MB, ONE_MB);
+                }
+            }
+
+            var request = new GetObjectRequest
+            {
+                BucketName = _s3MultipartStreamConfiguration.BucketName,
+                Key = key
+            };
+
+            using (var client = new AmazonS3Client(_s3MultipartStreamConfiguration.AccessKey, _s3MultipartStreamConfiguration.SecretKey, _s3MultipartStreamConfiguration.AmazonS3Config))
+            {
+                var buffer = new byte[ONE_MB];
+                using (var response = client.GetObject(request))
+                {
+                    // Was request successfull?
+                    Assert.IsTrue(response.HttpStatusCode == System.Net.HttpStatusCode.OK);
+                    // Has the correct length?
+                    Assert.IsTrue(response.ContentLength == length * ONE_MB);
+
+                    using (var responseStream = response.ResponseStream)
+                    {
+                        int alreadyRead = 0;
+                        for (int i = 0; i < length; i++)
+                        {
+                            int read = responseStream.Read(buffer, 0, buffer.Length);
+                            // check if the data is equal to the previously generated one.
+                            Assert.IsTrue(Enumerable.SequenceEqual(randomArray.Skip(alreadyRead).Take(read), buffer.Take(read)));
+                            alreadyRead += read;
+                        }
+                    }
+                }
+            }
+
+            _s3MultipartStreamConfiguration.ChunckSize = oldChunkSize;
         }
     }
 }
diff --git a/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj b/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj
index 19cc3c0d7c39ee2c1f5a3965ea1d98bafba67df5..2cfe828b83a8aae8cc8c24ac945b09aa16437566 100644
--- a/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj
+++ b/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj
@@ -9,7 +9,7 @@
     <ProjectGuid>{6B58EB5E-D857-464B-8174-C17375BAE1CF}</ProjectGuid>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>cs_S3Zip.Tests</RootNamespace>
+    <RootNamespace>coscine.cs_S3Zip.Tests</RootNamespace>
     <AssemblyName>cs-S3Zip.Tests</AssemblyName>
     <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
diff --git a/src/cs-S3Zip/S3MultipartStream.cs b/src/cs-S3Zip/S3MultipartStream.cs
index cfa88b60703cb1b4723390b14770ace8700eb86d..028be4a4c5e397f47628bca03cfb7fda31cfbd03 100644
--- a/src/cs-S3Zip/S3MultipartStream.cs
+++ b/src/cs-S3Zip/S3MultipartStream.cs
@@ -8,18 +8,18 @@ namespace coscine.cs_S3Zip
 {
     public class S3MultipartStream : Stream
     {
-        private MemoryStream _internalStream;
+        private readonly Stream _internalStream;
         private readonly InitiateMultipartUploadResponse _initiateMultipartUploadResponse;
         private readonly List<UploadPartResponse> _uploadPartResponses;
         private int _part;
         private int _length;
         private int _position;
 
-        public S3MultipartStream(string key, S3MultipartStreamConfiguration s3MultipartStreamConfiguration)
+        public S3MultipartStream(string key, S3MultipartStreamConfiguration s3MultipartStreamConfiguration, Stream internalStream)
         {
             S3MultipartStreamConfiguration = s3MultipartStreamConfiguration;
 
-            _internalStream = new MemoryStream(S3MultipartStreamConfiguration.ChunckSize);
+            _internalStream = internalStream;
             _uploadPartResponses = new List<UploadPartResponse>();
             _part = 0;
             _length = 0;
@@ -39,6 +39,11 @@ namespace coscine.cs_S3Zip
             }
         }
 
+        public S3MultipartStream(string key, S3MultipartStreamConfiguration s3MultipartStreamConfiguration) : this(key, s3MultipartStreamConfiguration, new MemoryStream(s3MultipartStreamConfiguration.ChunckSize))
+        {
+
+        }
+
         public string Key { get; }
 
         public S3MultipartStreamConfiguration S3MultipartStreamConfiguration { get; set; }
@@ -115,8 +120,8 @@ namespace coscine.cs_S3Zip
                     InputStream = _internalStream
                 };
 
-                _part++;
                 _uploadPartResponses.Add(client.UploadPart(uploadPartRequest));
+                _part++;
             }
         }