diff --git a/src/libloom/data/index.cpp b/src/libloom/data/index.cpp
index 6ece13110a5d94a853c411ea2a13c68d282bd5b7..e1a07b99f0f7abe2bab2bd65da5da0af03f80614 100644
--- a/src/libloom/data/index.cpp
+++ b/src/libloom/data/index.cpp
@@ -48,7 +48,7 @@ std::shared_ptr<Data> Index::get_at_index(size_t index)
     size_t size = indices[index + 1] - addr;
 
     auto data = std::make_shared<RawData>();
-    data->init_empty_file(worker, size);
+    data->init_empty(worker, size);
     char *p2 = data->get_raw_data(worker);
     memcpy(p2, p1, size);
     return data;
@@ -77,7 +77,7 @@ std::shared_ptr<Data> Index::get_slice(size_t from, size_t to)
     size_t size = to_addr - from_addr;
 
     auto data = std::make_shared<RawData>();
-    data->init_empty_file(worker, size);
+    data->init_empty(worker, size);
     char *p2 = data->get_raw_data(worker);
     memcpy(p2, p1, size);
     return data;
diff --git a/src/libloom/data/rawdata.cpp b/src/libloom/data/rawdata.cpp
index 4e9405e1e1d8cfc53e0ef2c9206cee5d49ffd95a..1b89b49622bc5c602cd83cc8368de65b2bf87731 100644
--- a/src/libloom/data/rawdata.cpp
+++ b/src/libloom/data/rawdata.cpp
@@ -51,7 +51,7 @@ std::string RawData::get_type_name() const
     return data;
 }*/
 
-char* RawData::init_empty_file(Worker &worker, size_t size)
+char* RawData::init_empty(Worker &worker, size_t size)
 {
     assert(data == nullptr);
 
@@ -141,6 +141,13 @@ std::string RawData::get_info()
     return "RawData";
 }
 
+void RawData::init_from_string(Worker &worker, const std::string &str)
+{
+    auto size = str.size();
+    char *mem = init_empty(worker, size);
+    memcpy(mem, str.c_str(), size);
+}
+
 void RawData::serialize_data(Worker &worker, SendBuffer &buffer, std::shared_ptr<Data> &data_ptr)
 {
     buffer.add(data_ptr, get_raw_data(worker), size);
@@ -156,7 +163,7 @@ bool RawDataUnpacker::init(Worker &worker, Connection &connection, const loomcom
     this->data = std::make_shared<RawData>();
     RawData &data = static_cast<RawData&>(*this->data);
     size_t size = msg.size();
-    pointer = data.init_empty_file(worker, size);
+    pointer = data.init_empty(worker, size);
     if (size == 0) {
         return true;
     }
diff --git a/src/libloom/data/rawdata.h b/src/libloom/data/rawdata.h
index 94403a8727e2af7368271b4c842351e47c273b7c..6f9c29b5280fc022636759bde5a9d049f9c51f07 100644
--- a/src/libloom/data/rawdata.h
+++ b/src/libloom/data/rawdata.h
@@ -27,7 +27,8 @@ public:
 
     std::string get_info();
 
-    char* init_empty_file(Worker &worker, size_t size);
+    char* init_empty(Worker &worker, size_t size);
+    void init_from_string(Worker &worker, const std::string &str);
     void assign_filename(Worker &worker);
     void init_from_file(Worker &worker);
 
diff --git a/src/libloom/taskinstance.cpp b/src/libloom/taskinstance.cpp
index 02ecca592c722a5ef30d798536ab13a1f72eb7fc..bc2e301f80382ac35086b7e1ae365df44a7f5e37 100644
--- a/src/libloom/taskinstance.cpp
+++ b/src/libloom/taskinstance.cpp
@@ -43,7 +43,7 @@ void TaskInstance::fail_libuv(const std::string &error_msg, int error_code)
     fail(s.str());
 }
 
-void TaskInstance::finish(std::shared_ptr<Data> &output)
+void TaskInstance::finish(const std::shared_ptr<Data> &output)
 {
    assert(output);
    worker.publish_data(get_id(), output);
diff --git a/src/libloom/taskinstance.h b/src/libloom/taskinstance.h
index de483620a3f4d41412fe1ed2fbda2f59ca434bd9..0225ed57ee06fcd7ea70aacdd8778dffcb40f2c8 100644
--- a/src/libloom/taskinstance.h
+++ b/src/libloom/taskinstance.h
@@ -46,7 +46,8 @@ public:
 protected:
     void fail(const std::string &error_msg);
     void fail_libuv(const std::string &error_msg, int error_code);
-    void finish(std::shared_ptr<Data> &output);
+    void finish(const std::shared_ptr<Data> &output);
+
 
     Worker &worker;
     std::unique_ptr<Task> task;
diff --git a/src/libloom/tasks/basetasks.cpp b/src/libloom/tasks/basetasks.cpp
index 22a213d168e06ed340e31c926b2a0f3cff350354..623c0d017be9ccd7e4d6ca2637816f7eea4c9065 100644
--- a/src/libloom/tasks/basetasks.cpp
+++ b/src/libloom/tasks/basetasks.cpp
@@ -34,7 +34,7 @@ void SizeTask::start(DataVector &inputs)
     }
     std::shared_ptr<Data> output = std::make_shared<RawData>();
     RawData &data = static_cast<RawData&>(*output);
-    memcpy(data.init_empty_file(worker, sizeof(size_t)), &size, sizeof(size_t));
+    memcpy(data.init_empty(worker, sizeof(size_t)), &size, sizeof(size_t));
     finish(output);
 }
 
@@ -46,6 +46,6 @@ void LengthTask::start(DataVector &inputs)
     }
     std::shared_ptr<Data> output = std::make_shared<RawData>();
     RawData &data = static_cast<RawData&>(*output);
-    memcpy(data.init_empty_file(worker, sizeof(size_t)), &length, sizeof(size_t));
+    memcpy(data.init_empty(worker, sizeof(size_t)), &length, sizeof(size_t));
     finish(output);
 }
diff --git a/src/libloom/tasks/rawdatatasks.cpp b/src/libloom/tasks/rawdatatasks.cpp
index 957ae7ade0a800bddabf3e8ba6939768c10da991..1ccfc0842fb9d5a80dd436857bed99f39fecb9ca 100644
--- a/src/libloom/tasks/rawdatatasks.cpp
+++ b/src/libloom/tasks/rawdatatasks.cpp
@@ -13,11 +13,9 @@ using namespace loom;
 
 void ConstTask::start(DataVector &inputs)
 {
-    auto& config = task->get_config();
-    std::shared_ptr<Data> output = std::make_shared<RawData>();
-    RawData &data = static_cast<RawData&>(*output);
-    memcpy(data.init_empty_file(worker, config.size()), config.c_str(), config.size());
-    finish(output);
+    auto output = std::make_shared<RawData>();
+    output->init_from_string(worker, task->get_config());
+    finish(std::static_pointer_cast<Data>(output));
 }
 
 /** If there are more then 50 input or size is bigger then 20000,
@@ -44,7 +42,7 @@ std::shared_ptr<Data> MergeTask::run() {
     }
     std::shared_ptr<Data> output = std::make_shared<RawData>();
     RawData &data = static_cast<RawData&>(*output);
-    data.init_empty_file(worker, size);
+    data.init_empty(worker, size);
     char *dst = output->get_raw_data(worker);
 
     for (auto& data : inputs) {
diff --git a/src/libloom/worker.cpp b/src/libloom/worker.cpp
index b457bfe240a864cee648efa9a00f2eb0c62037fa..13414b7175e2293ae0b076dab7e2c5928b8fac97 100644
--- a/src/libloom/worker.cpp
+++ b/src/libloom/worker.cpp
@@ -216,7 +216,7 @@ void Worker::start_task(std::unique_ptr<Task> task)
     t->start();
 }*/
 
-void Worker::publish_data(Id id, std::shared_ptr<Data> &data)
+void Worker::publish_data(Id id, const std::shared_ptr<Data> &data)
 {
     llog->debug("Publishing data id={} size={}", id, data->get_size());
     public_data[id] = data;
diff --git a/src/libloom/worker.h b/src/libloom/worker.h
index 043b36131c4cdd3e4273a558ab08c8505614331b..79098e3f9fe1be34d32da64f2ce5d1c559c12aa1 100644
--- a/src/libloom/worker.h
+++ b/src/libloom/worker.h
@@ -67,7 +67,7 @@ public:
 
     void task_finished(TaskInstance &task_instance, Data &data);
     void task_failed(TaskInstance &task_instance, const std::string &error_msg);
-    void publish_data(Id id, std::shared_ptr<Data> &data);
+    void publish_data(Id id, const std::shared_ptr<Data> &data);
     void remove_data(Id id);
 
     bool has_data(Id id) const