diff --git a/skeleton/Program/Build/RaspberryCloud.sdf b/skeleton/Program/Build/RaspberryCloud.sdf
index 91ba34f0698f6bd2a2b93a41016139ecda53dad1..b02189586fc087e4ab4ae27e22e2a36710253432 100644
Binary files a/skeleton/Program/Build/RaspberryCloud.sdf and b/skeleton/Program/Build/RaspberryCloud.sdf differ
diff --git a/skeleton/Program/Build/RaspberryCloud.v12.suo b/skeleton/Program/Build/RaspberryCloud.v12.suo
index 8b277e7538bdb15dbfc9ef54f71888b851971cdb..e88b00ad8041e9b08d41c2bca7937b00532b09eb 100644
Binary files a/skeleton/Program/Build/RaspberryCloud.v12.suo and b/skeleton/Program/Build/RaspberryCloud.v12.suo differ
diff --git a/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj b/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj
index f1382ae2a8aec920161e0dff8606622c965d58fa..294671174eeb561188030ae310270bfcf1285438 100644
--- a/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj
+++ b/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj
@@ -42,7 +42,7 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <LinkIncremental>true</LinkIncremental>
     <IncludePath>C:\KodoDependencies;$(IncludePath)</IncludePath>
-    <LibraryPath>c:\KodoDependencies\DependencyLIBS\;$(LibraryPath)</LibraryPath>
+    <LibraryPath>c:\KodoDependencies\DependencyLIBS\;C:\;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <LinkIncremental>false</LinkIncremental>
@@ -60,7 +60,9 @@
     <Link>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>c:\KodoDependencies\DependencyLIBS\*.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>c:\KodoDependencies\DependencyLIBS\</AdditionalLibraryDirectories>
+      <ShowProgress>LinkVerbose</ShowProgress>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
diff --git a/skeleton/Program/Build/RaspberryCloud/store.dat b/skeleton/Program/Build/RaspberryCloud/store.dat
index abe4227f7e8745374d1e7bb056cd166c8d9a5ce7..5e39d336a9d3bd58d2cda90215f1fb3843eebb7e 100644
--- a/skeleton/Program/Build/RaspberryCloud/store.dat
+++ b/skeleton/Program/Build/RaspberryCloud/store.dat
@@ -1,11 +1,24 @@
-2
-three.txt
-104
 1
-3.txt
+test.jpg
+283725
+10
+frag_000_000.frg
 localcm
-two.txt
-104
-1
-2.txt
+frag_000_001.frg
+localcm
+frag_000_002.frg
+localcm
+frag_000_003.frg
+localcm
+frag_000_004.frg
+localcm
+frag_000_005.frg
+localcm
+frag_000_006.frg
+localcm
+frag_000_007.frg
+localcm
+frag_000_008.frg
+localcm
+frag_000_009.frg
 localcm
diff --git a/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp b/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp
index bd1854b9066a8aed7cb7c4b69108bc2c659aa227..164fd476d83f3d17e7ce32467129e8f6e187310d 100644
--- a/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp
+++ b/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp
@@ -2,6 +2,8 @@
 #include "logger\\Logger.h"
 #include <fstream>
 
+#include <boost/filesystem.hpp>
+
 using namespace std;
 /**
 * LocalCloudAdapter implementation
@@ -12,6 +14,14 @@ LocalCloudAdapter::LocalCloudAdapter(string _cloudID) : CloudAdapter(_cloudID) {
 bool LocalCloudAdapter::upload(CloudFile cloudFile) {
 	LOG_ENTER_EXIT;
 
+	boost::filesystem::path cloudLocation = cloudFolder + cloudFile.getCloudFileID();
+	boost::filesystem::path cloudParentDir = cloudLocation.parent_path();
+
+	if (!boost::filesystem::exists(cloudParentDir))
+	{
+		boost::filesystem::create_directories(cloudParentDir);
+	}
+
 	//upload file
 	ifstream src(fragFolder + cloudFile.getCloudFileID(), std::ios::binary);
 	ofstream dst(cloudFolder + cloudFile.getCloudFileID(), std::ios::binary);
diff --git a/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp b/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp
index 54a6dab39eb1a824c6218ff8ab6f0fdc84ed7154..215a21d7803ab2063ec9992239b4171967d74fa7 100644
--- a/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp
+++ b/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp
@@ -52,7 +52,7 @@ string ComputeOnClient::getFile(FileDescriptor fileDescriptor) {
 			FileDescriptor* downloaded = cloudFileSystem.getCloudAccessLayer()->download(*fileToDownload);
 			cloudFileSystem.unlock(*fileToDownload);
 
-			return Decoder::decode(downloaded);
+			return Decoder::decode(fileToDownload);
 		}
 		else
 		{
diff --git a/skeleton/Program/Source/dataAccess/Decoder.cpp b/skeleton/Program/Source/dataAccess/Decoder.cpp
index bd17d22c2e464d3afacc23f13a05c5d0e905b026..711b3a73ea62c0b6556a58d990308f651749c9ed 100644
--- a/skeleton/Program/Source/dataAccess/Decoder.cpp
+++ b/skeleton/Program/Source/dataAccess/Decoder.cpp
@@ -4,6 +4,11 @@
 #include "Encoder.h"
 #include <string>
 #include <fstream>
+
+#include <kodo/object/file_decoder.hpp>
+#include <kodo/rlnc/full_rlnc_codes.hpp>
+
+#include <boost/format.hpp>
 /**
  * Decoder implementation
  */
@@ -17,29 +22,60 @@ string Decoder::decode(FileDescriptor* fileDescriptor) {
 		return "unable to decode";
 	}
 
-	vector<Fragment> frags = fileDescriptor->getFragments();
-	if (frags.size() > 0)
+	auto fragments = fileDescriptor->getFragments();
+	if (fragments.size() > 0)
 	{
-		Fragment f = frags.at(0);
-		//check if file exists
-		if (!Encoder::exists(fragFolder+f.getCloudFileID())){
-			throw CloudException("No such file exists");
-			return NULL;
-		}
+		uint32_t max_symbols = 10;
+		uint32_t max_symbol_size = fileDescriptor->getSize() / 10 + 1;
+
+		using file_decoder = kodo::object::file_decoder<
+			kodo::shallow_full_rlnc_decoder<fifi::binary >> ;
+
+		file_decoder::factory decoder_factory(max_symbols, max_symbol_size);
+
+		decoder_factory.set_filename(dataFolder + fileDescriptor->getFileID());
+		decoder_factory.set_file_size(fileDescriptor->getSize());
+
+		auto decoder = decoder_factory.build();
 
-		ifstream src(fragFolder + f.getCloudFileID(), std::ios::binary);
-		ofstream dst(dataFolder + fileDescriptor->getFileID(), std::ios::binary);
-		dst << src.rdbuf();
+		for (uint32_t i = 0; i < decoder->blocks(); i++)
+		{
+			auto d = decoder->build(i);
 
-		src.close();
-		dst.close();
+			for (int fragNum = 0; fragNum < fragments.size() && !d->is_complete(); fragNum++)
+			{
+				std::vector<uint8_t> payload;
 
-		//delete temp
-		string spath = fragFolder + f.getCloudFileID();
-		const char* path = spath.c_str();
-		int res = remove(path);
-		cout << res;
-		cout << spath << endl;
+				std::ifstream fragFile(
+					fragFolder + fragments[fragNum].getCloudFileID(),
+					std::ios::in | std::ios::binary);
+
+				if (!fragFile) 
+				{
+					throw CloudException("No such file exists");
+				}
+
+				std::copy(std::istreambuf_iterator<char>(fragFile),
+					std::istreambuf_iterator<char>(),
+					std::back_inserter(payload));
+				fragFile.close();
+				payload.shrink_to_fit();
+
+				d->decode(payload.data());
+			}
+
+			// Not removed in previous loop, because that doesn't necessarily 
+			// iterate through every fragment
+			for each (Fragment fragment in fragments)
+			{
+				remove((fragFolder + fragment.getCloudFileID()).c_str());
+			}
+
+			if (!d->is_complete())
+			{
+				throw CloudException("Error while assembling file");
+			}
+		}
 
 		return "Successfully decoded " + fileDescriptor->getFileID();
 	} else {
diff --git a/skeleton/Program/Source/dataAccess/Encoder.cpp b/skeleton/Program/Source/dataAccess/Encoder.cpp
index c7632b351cc0f481b05837b9113e6c0f0f0365dc..eea3992cd010b1cb1da41235ca798cc047ca4ea8 100644
--- a/skeleton/Program/Source/dataAccess/Encoder.cpp
+++ b/skeleton/Program/Source/dataAccess/Encoder.cpp
@@ -4,52 +4,36 @@
 #include  <fstream>
 
 #include <kodo/object/file_encoder.hpp>
-#include <kodo/object/file_decoder.hpp>
 #include <kodo/rlnc/full_rlnc_codes.hpp>
 
 #include <boost/format.hpp>
+#include <boost/filesystem.hpp>
 
 /**
  * Encoder implementation
  */
 
-std::ifstream::pos_type filesize(std::string filename)
-{
-	std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
-	return in.tellg();
-}
-
 FileDescriptor* Encoder::encode(string localFileID, string destinationFileID) {
 	LOG_ENTER_EXIT;
 	string dataFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\data\\";
 	string fragFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\temp\\";
 
-	/*uint32_t max_symbols = 10;
-	uint32_t max_symbol_size = 5000;*/
-
 	std::string encode_filename = dataFolder + localFileID;
 
 	//check if file exists
-	if (!exists(encode_filename)){
+	if (!boost::filesystem::exists(encode_filename)){
 		throw CloudException("No such file exists");
-		return NULL;
 	}
 
-	ifstream src(dataFolder + localFileID, std::ios::binary);
-	ofstream dst(fragFolder + destinationFileID, std::ios::binary);
-	dst << src.rdbuf();
-	
-	src.close();
-	dst.close();
-
 	FileDescriptor* encoded = new FileDescriptor(localFileID);
 
-	ifstream in(dataFolder + localFileID, std::ifstream::ate | std::ifstream::binary);
-	long size = in.tellg(); 
-	encoded->setSize(size);
-	in.close();
+	long file_size = boost::filesystem::file_size(encode_filename);
+	encoded->setSize(file_size);
 
-	/*using file_encoder = kodo::object::file_encoder<
+	uint32_t max_symbols = 10;
+	uint32_t max_symbol_size = file_size / 10 + 1;
+
+	using file_encoder = kodo::object::file_encoder<
 		kodo::shallow_full_rlnc_encoder<fifi::binary >> ;
 
 	file_encoder::factory encoder_factory(max_symbols, max_symbol_size);
@@ -67,28 +51,25 @@ FileDescriptor* Encoder::encode(string localFileID, string destinationFileID) {
 		{
 			e->encode(payload.data());
 
-			std::string filename = (boost::format("frag_%1$02d_%2$02d.frg") % i % j).str();
+			std::string filename = (boost::format("%1%_%2$03d_%3$03d.frg") % destinationFileID % i % j).str();
+
+			boost::filesystem::path fragLocation = fragFolder + filename;
+			boost::filesystem::path fragParentDir = fragLocation.parent_path();
+
+			if (!boost::filesystem::exists(fragParentDir))
+			{
+				boost::filesystem::create_directories(fragParentDir);
+			}
 
 			std::ofstream fragFile(
-				fragFolder + filename,
+				fragLocation.c_str(),
 				std::ios::out | std::ios::binary);
 			std::copy(payload.begin(), payload.end(), std::ostreambuf_iterator<char>(fragFile));
 			fragFile.close();
 
-			encoded->addFragment(*(new Fragment("unset", filename)));
+			encoded->addFragment(Fragment("unset", filename));
 		}
-	}*/
+	}
 
-	encoded->addFragment(*(new Fragment("unset", destinationFileID)));
     return encoded;
-}
-
-bool Encoder::exists(string name) {
-	if (FILE *file = fopen(name.c_str(), "r")) {
-		fclose(file);
-		return true;
-	}
-	else {
-		return false;
-	}
 }
\ No newline at end of file
diff --git a/skeleton/Program/Source/dataAccess/Encoder.h b/skeleton/Program/Source/dataAccess/Encoder.h
index b46a38be5cbeab2198e2f061e62478085d1ee69e..ea46d69a8615032e74fdc68ca0b2688588164238 100644
--- a/skeleton/Program/Source/dataAccess/Encoder.h
+++ b/skeleton/Program/Source/dataAccess/Encoder.h
@@ -16,8 +16,6 @@ public:
 	 * @param localFileID id of the file to encode
 	 */
 	static FileDescriptor* encode(string localFileID, string destinationFileID);
-
-	static bool exists(string name);
 };
 
 #endif //_ENCODER_H
\ No newline at end of file