diff --git a/pps_ws/src/d_fall_pps/CMakeLists.txt b/pps_ws/src/d_fall_pps/CMakeLists.txt
index 3dbceb99a15b237f5eab79f282b68988f00cd4fa..0b32f4a8c4f1111776a17aac090a83a005c73273 100755
--- a/pps_ws/src/d_fall_pps/CMakeLists.txt
+++ b/pps_ws/src/d_fall_pps/CMakeLists.txt
@@ -215,7 +215,7 @@ add_executable(ViconDataPublisher src/ViconDataPublisher.cpp)
 add_executable(PPSClient src/PPSClient.cpp)
 add_executable(SafeControllerService src/SafeControllerService.cpp)
 add_executable(CustomControllerService src/CustomControllerService.cpp)
-add_executable(CentralManagerService src/CentralManagerService.cpp)
+add_executable(CentralManagerService src/CentralManagerService.cpp src/CrazyflieIO.cpp)
 
 
 
diff --git a/pps_ws/src/d_fall_pps/include/CrazyflieIO.h b/pps_ws/src/d_fall_pps/include/CrazyflieIO.h
new file mode 100644
index 0000000000000000000000000000000000000000..d736fe522044f766fe5f500df3a4c5a4fd34a55f
--- /dev/null
+++ b/pps_ws/src/d_fall_pps/include/CrazyflieIO.h
@@ -0,0 +1,9 @@
+#include "d_fall_pps/CrazyflieDB.h"
+
+namespace d_fall_pps {
+
+void readCrazyflieDB(CrazyflieDB& cfdb);
+
+void writeCrazyflieDB(CrazyflieDB& cfdb);
+
+}
\ No newline at end of file
diff --git a/pps_ws/src/d_fall_pps/src/CentralManagerService.cpp b/pps_ws/src/d_fall_pps/src/CentralManagerService.cpp
index 2be7fccdf14bcdab6b4a100e7236a9c1cd00b47a..0b8babb0b426d3eacf7ea8e6ce36f3747cdeaf6d 100755
--- a/pps_ws/src/d_fall_pps/src/CentralManagerService.cpp
+++ b/pps_ws/src/d_fall_pps/src/CentralManagerService.cpp
@@ -15,13 +15,10 @@
 //    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <stdlib.h>
-#include "ros/ros.h"
-#include <ros/package.h>
-#include "rosbag/bag.h"
+#include <ros/ros.h>
 #include "d_fall_pps/CentralManager.h"
 #include "d_fall_pps/CrazyflieContext.h"
 #include "d_fall_pps/CrazyflieDB.h"
-#include "d_fall_pps/CrazyflieContext.h"
 
 #include "d_fall_pps/CMRead.h"
 #include "d_fall_pps/CMQuery.h"
@@ -29,22 +26,12 @@
 #include "d_fall_pps/CMCommand.h"
 #include "CentralManagerService.h"
 
+#include "CrazyflieIO.h"
+
 using namespace d_fall_pps;
 using namespace std;
 
 CrazyflieDB crazyflieDB;
-rosbag::Bag bag;
-
-void saveCrazyflieDB() {
-    string packagePath = ros::package::getPath("d_fall_pps") + "/";
-    string dbFile = packagePath + "crazyflie.db";
-    bag.open(dbFile, rosbag::bagmode::Write);
-    bag.write("crazyflie_db", ros::Time::now(), crazyflieDB);
-}
-
-void loadCrazyflieDB() {
-//
-}
 
 bool cmRead(CMRead::Request &request, CMRead::Response &response) {
     response.crazyflieDB = crazyflieDB;
@@ -113,12 +100,13 @@ bool cmUpdate(CMUpdate::Request &request, CMUpdate::Response &response) {
 bool cmCommand(CMCommand::Request &request, CMCommand::Response &response) {
     switch(request.command) {
         case CMD_SAVE: {
-            //writeCrazyflieDB(crazyflieDB);
+            writeCrazyflieDB(crazyflieDB);
             return true;
         }
 
         case CMD_RELOAD: {
-            //crazyflieDB = readCrazyflieDB();
+            crazyflieDB.crazyflieEntries.clear();
+            readCrazyflieDB(crazyflieDB);
             return true;
         }
 
@@ -130,6 +118,8 @@ int main(int argc, char* argv[]) {
     ros::init(argc, argv, "CentralManagerService");
 
     ros::NodeHandle nodeHandle("~");
+    
+    readCrazyflieDB(crazyflieDB);
 
     ros::ServiceServer readService = nodeHandle.advertiseService("Read", cmRead);
     ros::ServiceServer queryService = nodeHandle.advertiseService("Query", cmQuery);
diff --git a/pps_ws/src/d_fall_pps/src/CrazyflieIO.cpp b/pps_ws/src/d_fall_pps/src/CrazyflieIO.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..dbf23672288a91fa948fee181313b79e591727ac
--- /dev/null
+++ b/pps_ws/src/d_fall_pps/src/CrazyflieIO.cpp
@@ -0,0 +1,150 @@
+#include "CrazyflieIO.h"
+#include <stdlib.h>
+#include <ros/ros.h>
+#include <ros/package.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include "d_fall_pps/CrazyflieContext.h"
+#include "d_fall_pps/CrazyflieEntry.h"
+#include "d_fall_pps/CrazyflieDB.h"
+
+using namespace std;
+
+namespace d_fall_pps {
+
+string escape(string input) {
+    string escaped;
+    for (string::const_iterator i = input.begin(), end = input.end(); i != end; ++i) {
+        unsigned char c = *i;
+        switch(c) {
+            case '\\': escaped += "\\\\"; break;
+            case '\r': escaped += "\\r"; break;
+            case '\n': escaped += "\\n"; break;
+            case '\t': escaped += "\\t"; break;
+            case ',': escaped += "\\c"; break;
+            default: escaped += c; break;
+        }
+    }
+    return escaped;
+}
+
+string unescape(string input) {
+    string unescaped;
+    bool escapeSeq = false;
+    for (string::const_iterator i = input.begin(), end = input.end(); i != end; ++i) {
+        unsigned char c = *i;
+
+        if(!escapeSeq) {
+            if(c == '\\') {
+                escapeSeq = true;
+            } else {
+                unescaped += c;
+            }
+        } else {
+            switch(c) {
+                case '\\': unescaped += "\\"; break;
+                case 'r': unescaped += "\r"; break;
+                case 'n': unescaped += "\n"; break;
+                case 't': unescaped += "\t"; break;
+                case 'c': unescaped += ","; break;
+                default: ROS_ERROR_STREAM("illegal escape sequence: \"\\" << c << "\"");
+            }
+            escapeSeq = false;
+        }
+    }
+    return unescaped;
+}
+
+vector<string> nextLine(istream& str) {
+    vector<string> result;
+    string line;
+    getline(str,line);
+
+    stringstream lineStream(line);
+    string cell;
+
+    while(getline(lineStream, cell, ',')) {
+        result.push_back(cell);
+    }
+
+    //if there is a trailing comma with no data after it
+    if (!lineStream && cell.empty()) {
+        result.push_back("");
+    }
+
+    return result;
+}
+
+string getCrazyflieDBPath() {
+    string packagePath = ros::package::getPath("d_fall_pps") + "/";
+    string dbFile = packagePath + "param/Crazyflie.db";
+    return dbFile;
+}
+
+void readCrazyflieDB(CrazyflieDB& db) {
+    ifstream dbFile;
+    dbFile.open(getCrazyflieDBPath());
+
+    while(dbFile.peek() != EOF) {
+        vector<string> dataRow = nextLine(dbFile);
+
+        if(dataRow.size() == 0) {
+        } else if(dataRow.size() != 9) {
+            ROS_ERROR_STREAM("row in csv file has not the right amount of data fields, skipped");
+        } else {
+
+            CrazyflieEntry entry;
+            entry.studentID = stoi(dataRow[0]);
+
+            CrazyflieContext context;
+            context.crazyflieName = unescape(dataRow[1]);
+            context.crazyflieAddress = unescape(dataRow[2]);
+
+            AreaBounds area;
+
+            area.xmin = stof(dataRow[3]);
+            area.xmin = stof(dataRow[4]);
+            area.zmin = stof(dataRow[5]);
+
+            area.xmax = stof(dataRow[6]);
+            area.ymax = stof(dataRow[7]);
+            area.zmax = stof(dataRow[8]);
+
+            context.localArea = area;
+            entry.crazyflieContext = context;
+            db.crazyflieEntries.push_back(entry);
+        }
+    }
+}
+
+void writeCrazyflieDB(CrazyflieDB& db) {
+    ofstream dbFile;
+    dbFile.open(getCrazyflieDBPath());
+
+    for(int i = 0; i < db.crazyflieEntries.size(); ++i) {
+    	CrazyflieEntry entry = db.crazyflieEntries[i];
+    	CrazyflieContext context = entry.crazyflieContext;
+
+    	dbFile << entry.studentID << ',';
+    	dbFile << escape(context.crazyflieName) << ',';
+    	dbFile << escape(context.crazyflieAddress) << ',';
+
+    	AreaBounds area = context.localArea;
+
+    	dbFile << area.xmin << ',';
+    	dbFile << area.ymin << ',';
+    	dbFile << area.zmin << ',';
+
+    	dbFile << area.xmax << ',';
+    	dbFile << area.ymax << ',';
+    	dbFile << area.zmax;
+
+    	dbFile << '\n';
+    }
+
+    dbFile.close();
+}
+
+}
\ No newline at end of file