diff --git a/pb/rebuild.sh b/pb/rebuild.sh
index a3b6e469a966f16dda5afc2f8395c20f63fea1bf..404afa470898c58ea8cf5b4be8909080026eebff 100644
--- a/pb/rebuild.sh
+++ b/pb/rebuild.sh
@@ -3,12 +3,13 @@
 BASE_DIR=`dirname $0`/..
 
 LIBLOOM_DIR=${BASE_DIR}/src/libloom
+LIBLOOMW_DIR=${BASE_DIR}/src/libloomw
 PYTHON_DIR=${BASE_DIR}/python/loom/pb
 
 # LIBLOOM
 protoc loomcomm.proto --cpp_out=${LIBLOOM_DIR}
 protoc loomplan.proto --cpp_out=${LIBLOOM_DIR}
-protoc loomrun.proto --cpp_out=${LIBLOOM_DIR}/tasks
+protoc loomrun.proto --cpp_out=${LIBLOOMW_DIR}/tasks
 
 # CLIENT (Python)
 protoc loomcomm.proto --python_out=${PYTHON_DIR}
diff --git a/src/libloom/CMakeLists.txt b/src/libloom/CMakeLists.txt
index 5ab0b0118389db96e010c46a673dc147a7191a9f..6a99f322e209340d9dc0ef8f8e6873841387a6e8 100644
--- a/src/libloom/CMakeLists.txt
+++ b/src/libloom/CMakeLists.txt
@@ -11,6 +11,13 @@ add_library(libloom
     log.h
     pbutils.h
     pbutils.cpp
+    dictionary.cpp
+    dictionary.h
+    types.h
+    loomcomm.pb.h
+    loomcomm.pb.cc
+    loomplan.pb.h
+    loomplan.pb.cc
 )
 
 target_include_directories(libloom PUBLIC ${PROJECT_SOURCE_DIR}/src)
diff --git a/src/libloom/compat.h b/src/libloom/compat.h
index 91b31ad84ffced08c408b0e1ccd991629d97ef79..f948f2e036eaa49b6a361b0c2e121c8ea49acb9a 100644
--- a/src/libloom/compat.h
+++ b/src/libloom/compat.h
@@ -5,8 +5,8 @@
   In the current version it provides std::make_unique
 */
 
-#ifndef LIBLOOMNET_COMPAT_H
-#define LIBLOOMNET_COMPAT_H
+#ifndef LIBLOOM_COMPAT_H
+#define LIBLOOM_COMPAT_H
 
 #include <cstddef>
 #include <memory>
diff --git a/src/libloomw/dictionary.cpp b/src/libloom/dictionary.cpp
similarity index 100%
rename from src/libloomw/dictionary.cpp
rename to src/libloom/dictionary.cpp
diff --git a/src/libloomw/dictionary.h b/src/libloom/dictionary.h
similarity index 50%
rename from src/libloomw/dictionary.h
rename to src/libloom/dictionary.h
index 692c7a73d255d049ec09e815d8840b1a3ea09fc3..83be72acbd5809f601f439ced5f8ce77003b6640 100644
--- a/src/libloomw/dictionary.h
+++ b/src/libloom/dictionary.h
@@ -8,6 +8,7 @@
 #include <vector>
 
 namespace loom {
+namespace base {
 
 /** Container for symbols */
 class Dictionary {
@@ -15,17 +16,18 @@ class Dictionary {
 public:
     Dictionary();
 
-    loom::Id find_symbol_or_fail(const std::string &symbol) const;
-    loom::Id find_symbol(const std::string &symbol) const;
-    loom::Id find_or_create(const std::string &symbol);
-    const std::string& translate(loom::Id id);
+    loom::base::Id find_symbol_or_fail(const std::string &symbol) const;
+    loom::base::Id find_symbol(const std::string &symbol) const;
+    loom::base::Id find_or_create(const std::string &symbol);
+    const std::string& translate(loom::base::Id id);
 
     std::vector<std::string> get_all_symbols() const;
 
 private:
-    std::unordered_map<std::string, loom::Id> symbol_to_id;
+    std::unordered_map<std::string, loom::base::Id> symbol_to_id;
 };
 
+}
 }
 
 #endif // LIBLOOM_DICTIONARY_H
diff --git a/src/libloom/listener.h b/src/libloom/listener.h
index 2d96a0b56058917ae62a23733e5bb0272523c023..f934788ad03826533bf2ba542928e6150d4a9b4d 100644
--- a/src/libloom/listener.h
+++ b/src/libloom/listener.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOMNET_LISTENER_H
-#define LIBLOOMNET_LISTENER_H
+#ifndef LIBLOOM_LISTENER_H
+#define LIBLOOM_LISTENER_H
 
 #include "socket.h"
 
@@ -31,4 +31,4 @@ protected:
 }
 }
 
-#endif // LIBLOOMNET_LISTENER_H
+#endif // LIBLOOM_LISTENER_H
diff --git a/src/libloom/log.h b/src/libloom/log.h
index e2fa92967459da1c103c0caebbe0f2996ce98b3d..00156ca9a8884860b0eae8cdb4d7180993d048ef 100644
--- a/src/libloom/log.h
+++ b/src/libloom/log.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOMNET_LOG_H
-#define LIBLOOMNET_LOG_H
+#ifndef LIBLOOM_LOG_H
+#define LIBLOOM_LOG_H
 
 #include <sys/types.h>
 #include "spdlog/spdlog.h"
diff --git a/src/libloomw/loomcomm.pb.cc b/src/libloom/loomcomm.pb.cc
similarity index 100%
rename from src/libloomw/loomcomm.pb.cc
rename to src/libloom/loomcomm.pb.cc
diff --git a/src/libloomw/loomcomm.pb.h b/src/libloom/loomcomm.pb.h
similarity index 100%
rename from src/libloomw/loomcomm.pb.h
rename to src/libloom/loomcomm.pb.h
diff --git a/src/libloomw/loomplan.pb.cc b/src/libloom/loomplan.pb.cc
similarity index 100%
rename from src/libloomw/loomplan.pb.cc
rename to src/libloom/loomplan.pb.cc
diff --git a/src/libloomw/loomplan.pb.h b/src/libloom/loomplan.pb.h
similarity index 100%
rename from src/libloomw/loomplan.pb.h
rename to src/libloom/loomplan.pb.h
diff --git a/src/libloom/pbutils.cpp b/src/libloom/pbutils.cpp
index f062960ea2c0083031b45a26c40ccae07387c3eb..f783615694fc76e5ad9bf0dce6daacc34a6c0100 100644
--- a/src/libloom/pbutils.cpp
+++ b/src/libloom/pbutils.cpp
@@ -1,5 +1,5 @@
 #include "pbutils.h"
-#include "libloomw/loomcomm.pb.h"
+#include "loomcomm.pb.h"
 
 #include "compat.h"
 
diff --git a/src/libloom/pbutils.h b/src/libloom/pbutils.h
index 04225ee7f003794a8641925234e8f63c23d7a9a0..0adb16f353e4476fd1caba74ae1c3f111869ce94 100644
--- a/src/libloom/pbutils.h
+++ b/src/libloom/pbutils.h
@@ -1,5 +1,5 @@
-#ifndef LOOM_SERVER_UTILS_H
-#define LOOM_SERVER_UTILS_H
+#ifndef LIBLOOM_UTILS_H
+#define LIBLOOM_UTILS_H
 
 #include "sendbuffer.h"
 #include "socket.h"
@@ -21,4 +21,4 @@ void send_message(loom::base::Socket &socket, ::google::protobuf::MessageLite &m
 }}
 
 
-#endif // LOOM_SERVER_UTILS_H
+#endif // LIBLOOM_UTILS_H
diff --git a/src/libloom/sendbuffer.h b/src/libloom/sendbuffer.h
index a8891621c81cb32f507f11976c9fba941ee361f2..8eb88fa1d349b321fecb7b4bd1b49b3af2f9b2bb 100644
--- a/src/libloom/sendbuffer.h
+++ b/src/libloom/sendbuffer.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOMNET_SENDBUFFER_H
-#define LIBLOOMNET_SENDBUFFER_H
+#ifndef LIBLOOM_SENDBUFFER_H
+#define LIBLOOM_SENDBUFFER_H
 
 #include <uv.h>
 #include <memory>
@@ -97,4 +97,4 @@ protected:
 
 }}
 
-#endif // LIBLOOMNET_SENDBUFFER_H
+#endif // LIBLOOM_SENDBUFFER_H
diff --git a/src/libloom/socket.h b/src/libloom/socket.h
index c03a069d3c58b8073ec23173f43b8d27a0ee5c12..780d4f18e102ff23bf363ecf8a5b566beb831e82 100644
--- a/src/libloom/socket.h
+++ b/src/libloom/socket.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOMNET_SOCKET_H
-#define LIBLOOMNET_SOCKET_H
+#ifndef LIBLOOM_SOCKET_H
+#define LIBLOOM_SOCKET_H
 
 #include "sendbuffer.h"
 
@@ -90,4 +90,4 @@ private:
 
 }}
 
-#endif // LIBLOOMNET_CONNECTION_H
+#endif // LIBLOOM_CONNECTION_H
diff --git a/src/libloomw/types.h b/src/libloom/types.h
similarity index 76%
rename from src/libloomw/types.h
rename to src/libloom/types.h
index b505c359f7f9d37a0eb37fd8880fd4c6cd666608..304a1b47e6ad855755d2a63f0b114c69bc0a26e0 100644
--- a/src/libloomw/types.h
+++ b/src/libloom/types.h
@@ -2,13 +2,12 @@
 #define LIBLOOM_TYPES_H
 
 namespace loom {
+namespace base {
 
 const int PROTOCOL_VERSION = 1;
 
 typedef int Id;
-typedef int TaskId;
-typedef int DataTypeId;
-
+}
 }
 
 #endif // LIBLOOM_TYPES_H
diff --git a/src/libloomw/CMakeLists.txt b/src/libloomw/CMakeLists.txt
index 5c7ebf8fde98ae11ab85d92a94b7f6fd7cdf41be..a20006b5b1fd7c60621410ec17e5c91c880a790a 100644
--- a/src/libloomw/CMakeLists.txt
+++ b/src/libloomw/CMakeLists.txt
@@ -30,8 +30,6 @@ add_library(libloomw
             threadjob.h
             ttinstance.h
             taskfactory.h
-            dictionary.cpp
-            dictionary.h
             data.cpp
             data.h
             unpacking.cpp
@@ -41,11 +39,6 @@ add_library(libloomw
             task.cpp
             task.h
             taskdesc.h
-            loomcomm.pb.h
-            loomcomm.pb.cc
-            loomplan.pb.h
-            loomplan.pb.cc
-            types.h
             config.cpp
             config.h
             utils.h
diff --git a/src/libloomw/config.h b/src/libloomw/config.h
index 0791f84cf784de1c1c39a7e1bf48add97831be43..cb64a607ff0717782acd0b37df8c8f2a3757c7da 100644
--- a/src/libloomw/config.h
+++ b/src/libloomw/config.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOM_INIT_H
-#define LIBLOOM_INIT_H
+#ifndef LIBLOOMW_INIT_H
+#define LIBLOOMW_INIT_H
 
 #include <string>
 #include <argp.h>
@@ -48,6 +48,3 @@ private:
 
 
 #endif
-
-
-
diff --git a/src/libloomw/data.cpp b/src/libloomw/data.cpp
index f393af69c0b4bf2d3c38d58b674b54e9f57a1cd8..1a7ffec0aa752d07b795af049a813dc25fd787ca 100644
--- a/src/libloomw/data.cpp
+++ b/src/libloomw/data.cpp
@@ -37,7 +37,7 @@ bool Data::has_raw_data() const
    return false;
 }
 
-Id Data::get_type_id(Worker &worker) const
+base::Id Data::get_type_id(Worker &worker) const
 {
    return worker.get_dictionary().find_symbol(get_type_name());
 }
diff --git a/src/libloomw/data.h b/src/libloomw/data.h
index 8205a21d40e80b58b400f9ad93802859d856e32a..df570f8ad56d877964370952aa2a1505eabb7937 100644
--- a/src/libloomw/data.h
+++ b/src/libloomw/data.h
@@ -1,10 +1,10 @@
-#ifndef LOOM_DATA_H
-#define LOOM_DATA_H
+#ifndef LIBLOOMW_DATA_H
+#define LIBLOOMW_DATA_H
 
-#include "types.h"
 
-#include "loomcomm.pb.h"
 
+#include "libloom/loomcomm.pb.h"
+#include "libloom/types.h"
 #include "libloom/sendbuffer.h"
 
 #include <uv.h>
@@ -51,7 +51,7 @@ public:
 
     virtual bool has_raw_data() const;
 
-    loom::Id get_type_id(Worker &worker) const;
+    loom::base::Id get_type_id(Worker &worker) const;
 
 protected:
 };
@@ -72,4 +72,4 @@ typedef std::vector<std::shared_ptr<Data>> DataVector;
 
 }
 
-#endif // LOOM_DATA_H
+#endif // LIBLOOMW_DATA_H
diff --git a/src/libloomw/data/array.cpp b/src/libloomw/data/array.cpp
index 52f06558033add9b318206c81d0d709c76a5f84f..c07486a4050288c3b9ec34a873c74818fbe3a55c 100644
--- a/src/libloomw/data/array.cpp
+++ b/src/libloomw/data/array.cpp
@@ -77,8 +77,8 @@ std::shared_ptr<Data> Array::get_at_index(size_t index)
 
 size_t Array::serialize(Worker &worker, loom::base::SendBuffer &buffer, std::shared_ptr<Data> &data_ptr)
 {
-    auto types = std::make_unique<base::MemItemWithSz>(sizeof(loom::Id) * length);
-    loom::Id *ts = reinterpret_cast<loom::Id*>(types->get_ptr());
+    auto types = std::make_unique<base::MemItemWithSz>(sizeof(loom::base::Id) * length);
+    loom::base::Id *ts = reinterpret_cast<loom::base::Id*>(types->get_ptr());
     for (size_t i = 0; i < length; i++) {
         ts[i] = items[i]->get_type_id(worker);
     }
diff --git a/src/libloomw/data/array.h b/src/libloomw/data/array.h
index d7a4a5ee75a7925cdb99e1e4011743f6b1bb6dfc..97d6651b8596a40fded6a94998a1adef7002d8d2 100644
--- a/src/libloomw/data/array.h
+++ b/src/libloomw/data/array.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOM_DATA_ARRAY_H
-#define LIBLOOM_DATA_ARRAY_H
+#ifndef LIBLOOMW_DATA_ARRAY_H
+#define LIBLOOMW_DATA_ARRAY_H
 
 #include "../data.h"
 #include "../unpacking.h"
@@ -47,7 +47,7 @@ public:
 
 private:
    std::unique_ptr<DataUnpacker> unpacker;
-   std::vector<Id> types;
+   std::vector<loom::base::Id> types;
    std::unique_ptr<std::shared_ptr<Data>[]> items;
    size_t index;
    Worker &worker;
@@ -55,4 +55,4 @@ private:
 
 
 }
-#endif // LIBLOOM_DATA_ARRAY_H
+#endif // LIBLOOMW_DATA_ARRAY_H
diff --git a/src/libloomw/data/externfile.h b/src/libloomw/data/externfile.h
index d739a74a667a5e0a15847dd1b2f9be4914a549c6..d7f5d66c08a9ebdac604e212ee086daea68a54b4 100644
--- a/src/libloomw/data/externfile.h
+++ b/src/libloomw/data/externfile.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOM_EXTERNFILE_H
-#define LIBLOOM_EXTERNFILE_H
+#ifndef LIBLOOMW_EXTERNFILE_H
+#define LIBLOOMW_EXTERNFILE_H
 
 
 #include "../data.h"
@@ -46,4 +46,4 @@ protected:
 
 }
 
-#endif // LIBLOOM_EXTERNFILE_H
+#endif // LIBLOOMW_EXTERNFILE_H
diff --git a/src/libloomw/data/index.h b/src/libloomw/data/index.h
index a8f337396cfcbb21145bc66e3b1036be90d521f3..d1560a68051428616f911f9edd4c540cc497ba35 100644
--- a/src/libloomw/data/index.h
+++ b/src/libloomw/data/index.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOM_INDEX_H
-#define LIBLOOM_INDEX_H
+#ifndef LIBLOOMW_INDEX_H
+#define LIBLOOMW_INDEX_H
 
 #include "../data.h"
 #include "../unpacking.h"
@@ -50,4 +50,4 @@ public:
 };
 }
 
-#endif // LIBLOOM_INDEX_H
+#endif // LIBLOOMW_INDEX_H
diff --git a/src/libloomw/data/rawdata.h b/src/libloomw/data/rawdata.h
index 8f33d192b7c71af0fbb0ed888ef5e1e375375894..48989296028674bdc31d28fe934315ff3599dcd2 100644
--- a/src/libloomw/data/rawdata.h
+++ b/src/libloomw/data/rawdata.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOM_RAWDATA_H
-#define LIBLOOM_RAWDATA_H
+#ifndef LIBLOOMW_RAWDATA_H
+#define LIBLOOMW_RAWDATA_H
 
 #include "../data.h"
 #include "../unpacking.h"
@@ -71,4 +71,4 @@ private:
 
 }
 
-#endif // LIBLOOM_RAWDATA_H
+#endif // LIBLOOMW_RAWDATA_H
diff --git a/src/libloomw/interconnect.cpp b/src/libloomw/interconnect.cpp
index f5e95f2f6a0f846e35b5972620ccf3becd6de693..c448a59be82839792bd4ecc3dd55c3486570a250 100644
--- a/src/libloomw/interconnect.cpp
+++ b/src/libloomw/interconnect.cpp
@@ -1,6 +1,6 @@
 #include "interconnect.h"
 #include "worker.h"
-#include "loomcomm.pb.h"
+#include "libloom/loomcomm.pb.h"
 #include "libloom/log.h"
 #include "libloom/pbutils.h"
 #include "libloom/sendbuffer.h"
diff --git a/src/libloomw/interconnect.h b/src/libloomw/interconnect.h
index ff72a94dce05758166028a1c6ff111d6a6a6a79a..fb123ff8a291c6d6ecf1a2b5d97531c2f14f4839 100644
--- a/src/libloomw/interconnect.h
+++ b/src/libloomw/interconnect.h
@@ -1,5 +1,5 @@
-#ifndef LOOM_INTERCONNECT_H
-#define LOOM_INTERCONNECT_H
+#ifndef LIBLOOMW_INTERCONNECT_H
+#define LIBLOOMW_INTERCONNECT_H
 
 #include "libloom/socket.h"
 #include "libloom/listener.h"
@@ -22,7 +22,7 @@ public:
     InterConnection(Worker &worker);
     ~InterConnection();
 
-    void send(Id id, std::shared_ptr<Data> &data);
+    void send(base::Id id, std::shared_ptr<Data> &data);
 
     std::string get_peername() {
         return socket.get_peername();
@@ -57,7 +57,7 @@ protected:
     std::string address;
 
     std::unique_ptr<DataUnpacker> unpacker;
-    Id unpacking_data_id;
+    base::Id unpacking_data_id;
 
     static std::string make_address(const std::string &host, int port);
 
@@ -66,4 +66,4 @@ protected:
 
 }
 
-#endif // LOOM_INTERCONNECT_H
+#endif // LIBLOOMW_INTERCONNECT_H
diff --git a/src/libloomw/task.cpp b/src/libloomw/task.cpp
index 6616a861277ead81cb4b9c1cdcf0c0005876426c..c545a8e8be21f4f4b8b5c2118de5ce370c1a716b 100644
--- a/src/libloomw/task.cpp
+++ b/src/libloomw/task.cpp
@@ -5,7 +5,7 @@ using namespace loom;
 
 bool loom::Task::is_ready(const Worker &worker) const
 {
-    for (Id id : inputs) {
+    for (auto id : inputs) {
         if (!worker.has_data(id)) {
             return false;
         }
diff --git a/src/libloomw/task.h b/src/libloomw/task.h
index 21e3220ab5ca3ac5b86dacfc3d5489482f8f0493..f169fb039f1f89a4106df8bb0ac2ae35af632d2b 100644
--- a/src/libloomw/task.h
+++ b/src/libloomw/task.h
@@ -1,7 +1,7 @@
-#ifndef LIBLOOM_TASK_H
-#define LIBLOOM_TASK_H
+#ifndef LIBLOOMW_TASK_H
+#define LIBLOOMW_TASK_H
 
-#include "types.h"
+#include "libloom/types.h"
 #include <vector>
 #include <string>
 
@@ -13,17 +13,17 @@ class Worker;
 class Task {
 
 public:
-    Task(Id id, int task_type, const std::string &config)
+    Task(base::Id id, int task_type, const std::string &config)
         : id(id), task_type(task_type), config(config) {}
 
-    Task(Id id, int task_type, std::string &&config)
+    Task(base::Id id, int task_type, std::string &&config)
         : id(id), task_type(task_type), config(std::move(config)) {}
 
-    Id get_id() const {
+    base::Id get_id() const {
         return id;
     }
 
-    Id get_task_type() const {
+    base::Id get_task_type() const {
         return task_type;
     }
 
@@ -33,21 +33,21 @@ public:
 
     bool is_ready(const Worker &worker) const;
 
-    void add_input(Id id) {
+    void add_input(base::Id id) {
         inputs.push_back(id);
     }
 
-    const std::vector<Id>& get_inputs() const {
+    const std::vector<base::Id>& get_inputs() const {
         return inputs;
     }
 
 protected:
-    Id id;
-    Id task_type;
-    std::vector<Id> inputs;
+    base::Id id;
+    base::Id task_type;
+    std::vector<base::Id> inputs;
     std::string config;
 };
 
 }
 
-#endif // LIBLOOM_TASK_H
+#endif // LIBLOOMW_TASK_H
diff --git a/src/libloomw/taskdesc.h b/src/libloomw/taskdesc.h
index 3db0edd2c09a9fb7af36d3892fd6553fa54f8608..af0556845bb68040365458c33380ba03adaaf7a9 100644
--- a/src/libloomw/taskdesc.h
+++ b/src/libloomw/taskdesc.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOM_TASKREDIRECT_H
-#define LIBLOOM_TASKREDIRECT_H
+#ifndef LIBLOOMW_TASKREDIRECT_H
+#define LIBLOOMW_TASKREDIRECT_H
 
 
 #include "data.h"
@@ -16,4 +16,4 @@ struct TaskDescription
 
 }
 
-#endif // LIBLOOM_TASKREDIRECT_H
+#endif // LIBLOOMW_TASKREDIRECT_H
diff --git a/src/libloomw/taskfactory.h b/src/libloomw/taskfactory.h
index 8a49f435d1dcbd134ded80c05c6715e4b2b3be6e..c5b151c09ee01e8e642f9a085cdc9554b76f9f53 100644
--- a/src/libloomw/taskfactory.h
+++ b/src/libloomw/taskfactory.h
@@ -1,5 +1,5 @@
-#ifndef LOOM_TASK_FACTORY_H
-#define LOOM_TASK_FACTORY_H
+#ifndef LIBLOOMW_TASK_FACTORY_H
+#define LIBLOOMW_TASK_FACTORY_H
 
 #include "data.h"
 #include "task.h"
@@ -45,4 +45,4 @@ public:
 
 }
 
-#endif // LOOM_TASK_FACTORY_H
+#endif // LIBLOOMW_TASK_FACTORY_H
diff --git a/src/libloomw/taskinstance.h b/src/libloomw/taskinstance.h
index 6c7f77fc6d5f482be430e4b417c1e669c99f028d..c09616d4a1de943ac33b8b365536444a1527ebb4 100644
--- a/src/libloomw/taskinstance.h
+++ b/src/libloomw/taskinstance.h
@@ -1,5 +1,5 @@
-#ifndef LOOM_TASKINSTANCE_H
-#define LOOM_TASKINSTANCE_H
+#ifndef LIBLOOMW_TASKINSTANCE_H
+#define LIBLOOMW_TASKINSTANCE_H
 
 #include "data.h"
 #include "task.h"
@@ -30,11 +30,11 @@ public:
 
     virtual ~TaskInstance();
 
-    int get_id() const {
+    base::Id get_id() const {
         return task->get_id();
     }
 
-    const std::vector<Id>& get_inputs() {
+    const std::vector<base::Id>& get_inputs() {
         return task->get_inputs();
     }
 
@@ -56,4 +56,4 @@ protected:
 
 }
 
-#endif // LOOM_TASKINSTANCE_H
+#endif // LIBLOOMW_TASKINSTANCE_H
diff --git a/src/libloomw/threadjob.h b/src/libloomw/threadjob.h
index 149a6a570890f76b9b737b8a466a12e1228ad130..e2c6500319829e2e4825fb2160ff9426d1237e5b 100644
--- a/src/libloomw/threadjob.h
+++ b/src/libloomw/threadjob.h
@@ -1,5 +1,5 @@
-#ifndef LIBLOOM_THREADJOB_H
-#define LIBLOOM_THREADJOB_H
+#ifndef LIBLOOMW_THREADJOB_H
+#define LIBLOOMW_THREADJOB_H
 
 #include "data.h"
 #include "task.h"
@@ -55,4 +55,4 @@ protected:
 
 }
 
-#endif // LIBLOOM_THREADJOB_H
+#endif // LIBLOOMW_THREADJOB_H
diff --git a/src/libloomw/ttinstance.h b/src/libloomw/ttinstance.h
index 1869f82a02fb49f49424b9185a8b800649d1071d..e1eebad04c1093bf41d9cabd67433f7ba492d69e 100644
--- a/src/libloomw/ttinstance.h
+++ b/src/libloomw/ttinstance.h
@@ -1,5 +1,5 @@
-#ifndef LOOM_TTINSTANCE_H
-#define LOOM_TTINSTANCE_H
+#ifndef LIBLOOMW_TTINSTANCE_H
+#define LIBLOOMW_TTINSTANCE_H
 
 #include "data.h"
 #include "taskinstance.h"
@@ -69,4 +69,4 @@ protected:
 
 }
 
-#endif // LOOM_TASKINSTANCE_H
+#endif // LIBLOOMW_TASKINSTANCE_H
diff --git a/src/libloomw/unpacking.h b/src/libloomw/unpacking.h
index fb1dcad13abef2be0ec718b49874c0d85243cbb9..582c1f9c85468918bbf0b70d8ad69dd2aa316274 100644
--- a/src/libloomw/unpacking.h
+++ b/src/libloomw/unpacking.h
@@ -1,6 +1,6 @@
 
-#ifndef LIBLOOM_UNPACKING_H
-#define LIBLOOM_UNPACKING_H
+#ifndef LIBLOOMW_UNPACKING_H
+#define LIBLOOMW_UNPACKING_H
 
 #include "data.h"
 
@@ -29,4 +29,4 @@ using UnpackFactoryFn = std::function<std::unique_ptr<DataUnpacker>()>;
 
 }
 
-#endif // LIBLOOM_UNPACKING_H
+#endif // LIBLOOMW_UNPACKING_H
diff --git a/src/libloomw/utils.h b/src/libloomw/utils.h
index a8532f16ef4b8bef4c88de527d38377ffa72386d..e5d10911450bb8383d4ba03f0df88b1f2783777c 100644
--- a/src/libloomw/utils.h
+++ b/src/libloomw/utils.h
@@ -1,5 +1,5 @@
-#ifndef LOOM_UTILS_H
-#define LOOM_UTILS_H
+#ifndef LIBLOOMW_UTILS_H
+#define LIBLOOMW_UTILS_H
 
 #include <sys/types.h>
 #include <libloom/log.h>
@@ -14,4 +14,4 @@ size_t file_size(const char *path);
 
 }
 
-#endif // LOOM_UTILS_H
+#endif // LIBLOOMW_UTILS_H
diff --git a/src/libloomw/worker.cpp b/src/libloomw/worker.cpp
index e9f4fec3fc617c3be56f5fdd396e214881a92aeb..2dc3f3931c28eb0f80d9bc36c5e24fb79f525ff7 100644
--- a/src/libloomw/worker.cpp
+++ b/src/libloomw/worker.cpp
@@ -1,8 +1,6 @@
 #include "worker.h"
-#include "loomcomm.pb.h"
 #include "utils.h"
 
-#include "types.h"
 #include "config.h"
 
 #include "data/rawdata.h"
@@ -15,6 +13,8 @@
 #include "tasks/runtask.h"
 #include "tasks/python.h"
 
+#include "libloom/loomcomm.pb.h"
+#include "libloom/types.h"
 #include "libloom/log.h"
 #include "libloom/sendbuffer.h"
 #include "libloom/pbutils.h"
@@ -338,7 +338,7 @@ void Worker::add_unpacker(const std::string &symbol, const UnpackFactoryFn &unpa
     unregistered_unpack_ffs[symbol] = unpacker;
 }
 
-std::unique_ptr<DataUnpacker> Worker::get_unpacker(DataTypeId id)
+std::unique_ptr<DataUnpacker> Worker::get_unpacker(base::Id id)
 {
     auto i = unpack_ffs.find(id);
     assert(i != unpack_ffs.end());
@@ -348,14 +348,14 @@ std::unique_ptr<DataUnpacker> Worker::get_unpacker(DataTypeId id)
 void Worker::on_dictionary_updated()
 {
     for (auto &f : unregistered_task_factories) {
-        loom::Id id = dictionary.find_symbol_or_fail(f->get_name());
+        loom::base::Id id = dictionary.find_symbol_or_fail(f->get_name());
         logger->debug("Registering task_factory: {} = {}", f->get_name(), id);
         task_factories[id] = std::move(f);
     }
     unregistered_task_factories.clear();
 
     for (auto &pair : unregistered_unpack_ffs) {
-        loom::Id id = dictionary.find_symbol_or_fail(pair.first);
+        loom::base::Id id = dictionary.find_symbol_or_fail(pair.first);
         logger->debug("Registering unpack_factory: {} = {}", pair.first, id);
         unpack_ffs[id] = pair.second;
     }
@@ -411,7 +411,7 @@ void Worker::task_failed(TaskInstance &task, const std::string &error_msg)
 void Worker::task_redirect(TaskInstance &task,
                            std::unique_ptr<TaskDescription> new_task_desc)
 {
-    loom::Id id = task.get_id();
+    loom::base::Id id = task.get_id();
     logger->debug("Redirecting task id={} task_type={} n_inputs={}",
                 id, new_task_desc->task_type, new_task_desc->inputs.size());
     remove_task(task, false);
diff --git a/src/libloomw/worker.h b/src/libloomw/worker.h
index e4f521cbfec297885ea0e481e50ca313194d6cf5..ee672620875215f7a40a16e15b55a6a031bcc032 100644
--- a/src/libloomw/worker.h
+++ b/src/libloomw/worker.h
@@ -1,12 +1,12 @@
-#ifndef LOOM_WORKER_H
-#define LOOM_WORKER_H
+#ifndef LIBLOOMW_WORKER_H
+#define LIBLOOMW_WORKER_H
 
 #include "interconnect.h"
 #include "taskinstance.h"
 #include "unpacking.h"
 #include "taskfactory.h"
-#include "dictionary.h"
 
+#include "libloom/dictionary.h"
 #include "libloom/listener.h"
 
 #include <uv.h>
@@ -36,8 +36,8 @@ public:
     void register_basic_tasks();
     
     void new_task(std::unique_ptr<Task> task);
-    void send_data(const std::string &address, Id id, std::shared_ptr<Data> &data);
-    bool send_data(const std::string &address, Id id) {
+    void send_data(const std::string &address, base::Id id, std::shared_ptr<Data> &data);
+    bool send_data(const std::string &address, base::Id id) {
         auto& data = public_data[id];
         if (data.get() == nullptr) {
             return false;
@@ -49,15 +49,15 @@ public:
     void task_finished(TaskInstance &task_instance, Data &data);
     void task_failed(TaskInstance &task_instance, const std::string &error_msg);
     void task_redirect(TaskInstance &task, std::unique_ptr<TaskDescription> new_task_desc);
-    void publish_data(Id id, const std::shared_ptr<Data> &data);
-    void remove_data(Id id);
+    void publish_data(base::Id id, const std::shared_ptr<Data> &data);
+    void remove_data(base::Id id);
 
-    bool has_data(Id id) const
+    bool has_data(base::Id id) const
     {
         return public_data.find(id) != public_data.end();
     }
 
-    std::shared_ptr<Data>& get_data(Id id)
+    std::shared_ptr<Data>& get_data(base::Id id)
     {
         auto it = public_data.find(id);
         assert(it != public_data.end());
@@ -99,7 +99,7 @@ public:
         return work_dir;
     }
 
-    std::string get_run_dir(Id id);
+    std::string get_run_dir(base::Id id);
 
     void check_waiting_tasks();
     void check_ready_tasks();
@@ -108,9 +108,9 @@ public:
     void add_unpacker(const std::string &symbol, const UnpackFactoryFn &unpacker);
 
 
-    std::unique_ptr<DataUnpacker> get_unpacker(DataTypeId id);
+    std::unique_ptr<DataUnpacker> get_unpacker(base::Id id);
 
-    Dictionary& get_dictionary() {
+    base::Dictionary& get_dictionary() {
         return dictionary;
     }
 
@@ -131,18 +131,18 @@ private:
     std::vector<std::unique_ptr<TaskInstance>> active_tasks;
     std::vector<std::unique_ptr<Task>> ready_tasks;
     std::vector<std::unique_ptr<Task>> waiting_tasks;
-    std::unordered_map<Id, std::unique_ptr<TaskFactory>> task_factories;
+    std::unordered_map<base::Id, std::unique_ptr<TaskFactory>> task_factories;
 
     std::unordered_map<int, std::shared_ptr<Data>> public_data;
     std::string work_dir;
 
-    std::unordered_map<DataTypeId, UnpackFactoryFn> unpack_ffs;
+    std::unordered_map<base::Id, UnpackFactoryFn> unpack_ffs;
 
     base::Socket server_conn;
     std::unordered_map<std::string, std::unique_ptr<InterConnection>> connections;
     std::vector<std::unique_ptr<InterConnection>> nonregistered_connections;
 
-    Dictionary dictionary;
+    base::Dictionary dictionary;
 
     std::string server_address;
     int server_port;
@@ -157,4 +157,4 @@ private:
 
 }
 
-#endif // LOOM_WORKER_H
+#endif // LIBLOOMW_WORKER_H
diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt
index ca7467ac52c1ea97d90c9f0ac9830f79c8b031e0..a143a7e9c8335b8913937eda4299a7e403749781 100644
--- a/src/server/CMakeLists.txt
+++ b/src/server/CMakeLists.txt
@@ -29,7 +29,7 @@ add_executable(loom-server
                $<TARGET_OBJECTS:loom-server-lib>
                main.cpp)
 
-target_link_libraries(loom-server libloom libloomw ${LIBUV_LIBRARY} pthread)
+target_link_libraries(loom-server libloom ${LIBUV_LIBRARY} pthread)
 target_link_libraries(loom-server ${PROTOBUF_LIBRARIES})
 
 install (TARGETS loom-server DESTINATION bin)
diff --git a/src/server/clientconn.cpp b/src/server/clientconn.cpp
index 484627cad6d9e51d48a2b4660dbfd3333af3bb3b..a97985bbae126ecd3fd53753da5bd4e897395f5d 100644
--- a/src/server/clientconn.cpp
+++ b/src/server/clientconn.cpp
@@ -3,8 +3,8 @@
 
 
 
-#include "libloomw/loomplan.pb.h"
-#include "libloomw/loomcomm.pb.h"
+#include "libloom/loomplan.pb.h"
+#include "libloom/loomcomm.pb.h"
 #include "libloom/log.h"
 #include "libloom/compat.h"
 #include "libloom/pbutils.h"
@@ -48,7 +48,7 @@ void ClientConnection::on_message(const char *buffer, size_t size)
     auto& task_manager = server.get_task_manager();
 
     const loomplan::Plan &plan = submit.plan();
-    loom::Id id_base = server.new_id(plan.tasks_size());
+    loom::base::Id id_base = server.new_id(plan.tasks_size());
     task_manager.add_plan(Plan(plan, id_base, server.get_dictionary()), submit.report());
     logger->info("Plan submitted tasks={} report={}", plan.tasks_size(), submit.report());
 }
diff --git a/src/server/compstate.cpp b/src/server/compstate.cpp
index 62551769f488d429e78d001689524d2361211cb1..16a37116c7ca54acfb4d15ff85a0d078d36b23bb 100644
--- a/src/server/compstate.cpp
+++ b/src/server/compstate.cpp
@@ -11,7 +11,7 @@ using namespace loom::base;
 
 ComputationState::ComputationState(Server &server) : server(server)
 {
-   loom::Dictionary &dictionary = server.get_dictionary();
+   Dictionary &dictionary = server.get_dictionary();
    slice_task_id = dictionary.find_or_create("loom/base/slice");
    get_task_id = dictionary.find_or_create("loom/base/get");
    dslice_task_id = dictionary.find_or_create("loom/scheduler/dslice");
@@ -58,7 +58,7 @@ void ComputationState::set_task_finished(const PlanNode&node, size_t size, size_
    workers[wc].free_cpus += node.get_n_cpus();
 }
 
-void ComputationState::remove_state(loom::Id id)
+void ComputationState::remove_state(loom::base::Id id)
 {
    auto it = states.find(id);
    assert(it != states.end());
@@ -67,7 +67,7 @@ void ComputationState::remove_state(loom::Id id)
 
 void ComputationState::add_ready_nexts(const PlanNode &node)
 {
-   for (loom::Id id : node.get_nexts()) {
+   for (loom::base::Id id : node.get_nexts()) {
       const PlanNode &node = get_node(id);
       if (is_ready(node)) {
          if (node.get_policy() == PlanNode::POLICY_SCHEDULER) {
@@ -84,7 +84,7 @@ bool ComputationState::is_finished() const
     return states.empty();
 }
 
-void ComputationState::add_pending_task(loom::Id id)
+void ComputationState::add_pending_task(loom::base::Id id)
 {
    logger->debug("Add pending task and creating state id={}", id);
    auto pair = states.emplace(std::make_pair(id, TaskState(get_node(id))));
@@ -94,7 +94,7 @@ void ComputationState::add_pending_task(loom::Id id)
 
 void ComputationState::expand_node(const PlanNode &node)
 {
-   loom::Id id = node.get_task_type();
+   loom::base::Id id = node.get_task_type();
 
    if (id == dslice_task_id) {
       expand_dslice(node);
@@ -119,7 +119,7 @@ void ComputationState::expand_dslice(const PlanNode &node)
    // Do a copy again
    const PlanNode &node2 = get_node(node.get_nexts()[0]);
 
-   std::vector<loom::Id> inputs = node.get_inputs();
+   std::vector<loom::base::Id> inputs = node.get_inputs();
    assert(inputs.size() == 1);
    TaskState &input = get_state(inputs[0]);
    size_t length = input.get_length();
@@ -143,8 +143,8 @@ void ComputationState::expand_dslice(const PlanNode &node)
       configs.push_back(std::string(reinterpret_cast<char*>(&indices), sizeof(size_t) * 2));
    }
 
-   loom::Id id_base1 = server.new_id(configs.size());
-   loom::Id id_base2 = server.new_id(configs.size());
+   loom::base::Id id_base1 = server.new_id(configs.size());
+   loom::base::Id id_base2 = server.new_id(configs.size());
 
    logger->debug("Expanding 'dslice' id={} length={} pieces={} new_id_base={}",
                  node1.get_id(), length, configs.size(), id_base1);
@@ -161,7 +161,7 @@ void ComputationState::expand_dget(const PlanNode &node)
    // Do a copy again
    const PlanNode &node2 = get_node(node.get_nexts()[0]);
 
-   std::vector<loom::Id> inputs = node.get_inputs();
+   std::vector<loom::base::Id> inputs = node.get_inputs();
    assert(inputs.size() == 1);
    TaskState &input = get_state(inputs[0]);
    size_t length = input.get_length();
@@ -171,8 +171,8 @@ void ComputationState::expand_dget(const PlanNode &node)
       configs.push_back(std::string(reinterpret_cast<char*>(&i), sizeof(size_t)));
    }
 
-   loom::Id id_base1 = server.new_id(configs.size());
-   loom::Id id_base2 = server.new_id(configs.size());
+   loom::base::Id id_base1 = server.new_id(configs.size());
+   loom::base::Id id_base2 = server.new_id(configs.size());
 
    logger->debug("Expanding 'dget' id={} length={} new_id_base={}",
                  node1.get_id(), length, id_base1);
@@ -185,8 +185,8 @@ void ComputationState::expand_dget(const PlanNode &node)
 void ComputationState::make_expansion(std::vector<std::string> &configs,
                                       const PlanNode &n1,
                                       const PlanNode &n2,
-                                      loom::Id id_base1,
-                                      loom::Id id_base2)
+                                      loom::base::Id id_base1,
+                                      loom::base::Id id_base2)
 
 {
    PlanNode node1 = n1; // Make copy
@@ -205,7 +205,7 @@ void ComputationState::make_expansion(std::vector<std::string> &configs,
       PlanNode t1(id_base1, -1,
                   node1.get_policy(), node1.get_n_cpus(), false,
                   node1.get_task_type(), config1, node1.get_inputs());
-      t1.set_nexts(std::vector<loom::Id>{id_base2});
+      t1.set_nexts(std::vector<loom::base::Id>{id_base2});
       plan.add_node(std::move(t1));
 
       add_pending_task(id_base1);
@@ -223,12 +223,12 @@ void ComputationState::make_expansion(std::vector<std::string> &configs,
       id_base2++;
    }
 
-   for (loom::Id id : node1.get_inputs()) {
+   for (loom::base::Id id : node1.get_inputs()) {
       plan.get_node(id).replace_next(node1.get_id(), ids1);
       get_state(id).inc_ref_counter(size - 1);
    }
 
-   for (loom::Id id : node2.get_nexts()) {
+   for (loom::base::Id id : node2.get_nexts()) {
       plan.get_node(id).replace_input(node2.get_id(), ids2);
    }
 }
@@ -236,7 +236,7 @@ void ComputationState::make_expansion(std::vector<std::string> &configs,
 
 bool ComputationState::is_ready(const PlanNode &node)
 {
-   for (loom::Id id : node.get_inputs()) {
+   for (loom::base::Id id : node.get_inputs()) {
       if (states.find(id) == states.end()) {
          return false;
       }
@@ -258,7 +258,7 @@ int ComputationState::get_max_cpus()
     return max_cpus;
 }
 
-TaskState &ComputationState::get_state(loom::Id id)
+TaskState &ComputationState::get_state(loom::base::Id id)
 {
    auto it = states.find(id);
    if (it == states.end()) {
@@ -269,7 +269,7 @@ TaskState &ComputationState::get_state(loom::Id id)
 
 }
 
-/*TaskState &ComputationState::get_state_or_create(loom::Id id)
+/*TaskState &ComputationState::get_state_or_create(loom::base::Id id)
 {
    auto it = states.find(id);
    if (it == states.end()) {
@@ -280,18 +280,18 @@ TaskState &ComputationState::get_state(loom::Id id)
    return it->second;
 }*/
 
-void ComputationState::add_ready_nodes(const std::vector<loom::Id> &ids)
+void ComputationState::add_ready_nodes(const std::vector<loom::base::Id> &ids)
 {
-   for (loom::Id id : ids) {
+   for (loom::base::Id id : ids) {
       add_pending_task(id);
    }
 }
 
 void ComputationState::collect_requirements_for_node(WorkerConnection *wc,
                                                      const PlanNode &node,
-                                                     std::unordered_set<loom::Id> &nonlocals)
+                                                     std::unordered_set<loom::base::Id> &nonlocals)
 {
-   for (loom::Id id : node.get_inputs()) {
+   for (loom::base::Id id : node.get_inputs()) {
       TaskState &state = get_state(id);
       if (state.get_worker_status(wc) == TaskState::S_OWNER) {
          // nothing
diff --git a/src/server/compstate.h b/src/server/compstate.h
index 72606a9fa3d9a0f3f635a4f5d301ecf08df76d4d..8682d55f02c2196773eb3da15582fecb6c64de4a 100644
--- a/src/server/compstate.h
+++ b/src/server/compstate.h
@@ -23,9 +23,9 @@ public:
     /*TaskDistribution compute_initial_distribution();
     TaskDistribution compute_distribution();*/
 
-    TaskState& get_state(loom::Id id);
+    TaskState& get_state(loom::base::Id id);
 
-    TaskState* get_state_ptr(loom::Id id) {
+    TaskState* get_state_ptr(loom::base::Id id) {
         auto it = states.find(id);
         if (it != states.end()) {
             return &it->second;
@@ -34,20 +34,20 @@ public:
         }
     }
 
-    //TaskState& get_state_or_create(loom::Id id);
+    //TaskState& get_state_or_create(loom::base::Id id);
 
-    const PlanNode& get_node(loom::Id id) {
+    const PlanNode& get_node(loom::base::Id id) {
         return plan.get_node(id);
     }
 
-    void add_ready_nodes(const std::vector<loom::Id> &ids);
+    void add_ready_nodes(const std::vector<loom::base::Id> &ids);
     void set_task_finished(const PlanNode& node, size_t size, size_t length, WorkerConnection *wc);
 
     bool has_pending_tasks() const {
         return !pending_tasks.empty();
     }
 
-    const std::unordered_set<loom::Id>& get_pending_tasks() const {
+    const std::unordered_set<loom::base::Id>& get_pending_tasks() const {
         return pending_tasks;
     }
 
@@ -55,7 +55,7 @@ public:
         return plan;
     }
 
-    void remove_state(loom::Id id);
+    void remove_state(loom::base::Id id);
 
     bool is_ready(const PlanNode &node);
     void add_ready_nexts(const PlanNode &node);
@@ -71,19 +71,19 @@ public:
     }
 
 private:
-    std::unordered_map<loom::Id, TaskState> states;
+    std::unordered_map<loom::base::Id, TaskState> states;
     std::unordered_map<WorkerConnection*, WorkerInfo> workers;
-    std::unordered_set<loom::Id> pending_tasks;
+    std::unordered_set<loom::base::Id> pending_tasks;
     Plan plan;
     Server &server;
 
     uint64_t base_time;
 
-    loom::Id dslice_task_id;
-    loom::Id dget_task_id;
+    loom::base::Id dslice_task_id;
+    loom::base::Id dget_task_id;
 
-    loom::Id slice_task_id;
-    loom::Id get_task_id;
+    loom::base::Id slice_task_id;
+    loom::base::Id get_task_id;
 
 
     WorkerConnection *get_best_holder_of_deps(PlanNode *task);
@@ -93,12 +93,12 @@ private:
     void expand_dslice(const PlanNode &node);
     void expand_dget(const PlanNode &node);
     void make_expansion(std::vector<std::string> &configs, const PlanNode &node1,
-                        const PlanNode &node2, loom::Id id_base1, loom::Id id_base2);
+                        const PlanNode &node2, loom::base::Id id_base1, loom::base::Id id_base2);
     void collect_requirements_for_node(WorkerConnection *wc,
                                        const PlanNode &node,
-                                       std::unordered_set<loom::Id> &nonlocals);
+                                       std::unordered_set<loom::base::Id> &nonlocals);
     size_t task_transfer_cost(const PlanNode &node);
-    void add_pending_task(loom::Id id);
+    void add_pending_task(loom::base::Id id);
     int get_max_cpus();
 };
 
diff --git a/src/server/dummyworker.cpp b/src/server/dummyworker.cpp
index 0c231b3b6bfd0bb4805d5aa44bbd024b55ed38e2..6c3016da49ec4fbf022200a9a2eb1e95ca1ac5b5 100644
--- a/src/server/dummyworker.cpp
+++ b/src/server/dummyworker.cpp
@@ -6,7 +6,7 @@
 #include <libloom/pbutils.h>
 
 #include <libloom/log.h>
-#include <libloomw/loomcomm.pb.h>
+#include <libloom/loomcomm.pb.h>
 
 
 #include <sstream>
diff --git a/src/server/dummyworker.h b/src/server/dummyworker.h
index a6e05227edf139378090d120c44fb8ffac3727bc..741473b21baebe721d0a1fc7c228ea44f93e0c13 100644
--- a/src/server/dummyworker.h
+++ b/src/server/dummyworker.h
@@ -9,7 +9,7 @@
 #include <libloom/listener.h>
 #include <libloom/socket.h>
 #include <libloom/sendbuffer.h>
-#include <libloomw/types.h>
+#include <libloom/types.h>
 
 class Server;
 class DWConnection;
diff --git a/src/server/freshconn.cpp b/src/server/freshconn.cpp
index 8a684234aaf463b2b289231ff294c5e036f792e0..aa27145f0b7124163f97c4580df17d2e52e05f55 100644
--- a/src/server/freshconn.cpp
+++ b/src/server/freshconn.cpp
@@ -5,7 +5,7 @@
 
 #include "libloom/compat.h"
 #include "libloom/log.h"
-#include "libloomw/loomcomm.pb.h"
+#include "libloom/loomcomm.pb.h"
 
 #include <sstream>
 
diff --git a/src/server/plan.cpp b/src/server/plan.cpp
index b6c2df24d02b97c016791514d5eb4dacb9925ca3..3c1a720e998ce2e87f4a6e2a2cf6a2d44de735a4 100644
--- a/src/server/plan.cpp
+++ b/src/server/plan.cpp
@@ -2,7 +2,7 @@
 
 #include <algorithm>
 
-#include "libloomw/loomplan.pb.h"
+#include "libloom/loomplan.pb.h"
 #include "libloom/log.h"
 
 static PlanNode::Policy read_task_policy(loomplan::Task_Policy policy) {
@@ -24,11 +24,11 @@ Plan::Plan()
 
 }
 
-Plan::Plan(const loomplan::Plan &plan, loom::Id id_base, loom::Dictionary &dictionary)
+Plan::Plan(const loomplan::Plan &plan, loom::base::Id id_base, loom::base::Dictionary &dictionary)
 {
     std::vector<int> resources;
 
-    loom::Id resource_ncpus = dictionary.find_or_create("loom/resource/cpus");
+    loom::base::Id resource_ncpus = dictionary.find_or_create("loom/resource/cpus");
     auto rr_size = plan.resource_requests_size();
     for (int i = 0; i < rr_size; i++) {
         auto &rr = plan.resource_requests(i);
@@ -62,11 +62,11 @@ Plan::Plan(const loomplan::Plan &plan, loom::Id id_base, loom::Dictionary &dicti
 
     for (auto& pair : tasks) {
         auto& task = pair.second;
-        loom::Id my_id = task.id;
-        std::vector<loom::Id> inps(task.get_inputs());
+        loom::base::Id my_id = task.id;
+        std::vector<loom::base::Id> inps(task.get_inputs());
         std::sort(inps.begin(), inps.end());
-        loom::Id prev = -1;
-        for (loom::Id id : inps) {
+        loom::base::Id prev = -1;
+        for (loom::base::Id id : inps) {
             if (prev != id) {
                 auto it = tasks.find(id);
                 assert(it != tasks.end());
@@ -84,9 +84,9 @@ Plan::Plan(const loomplan::Plan &plan, loom::Id id_base, loom::Dictionary &dicti
     }
 }
 
-std::vector<loom::Id> Plan::get_init_tasks() const
+std::vector<loom::base::Id> Plan::get_init_tasks() const
 {
-    std::vector<loom::Id> result;
+    std::vector<loom::base::Id> result;
     foreach_task([&result](const PlanNode &node){
           if (node.get_inputs().empty()) {
             result.push_back(node.id);
diff --git a/src/server/plan.h b/src/server/plan.h
index 11111b50c6d41a7f53cfe2ce8de787e2d8986bfe..a1aa9575cc5abafe7e5dd9eadfecc6446cfacb08 100644
--- a/src/server/plan.h
+++ b/src/server/plan.h
@@ -3,7 +3,7 @@
 
 #include "plannode.h"
 
-#include <libloomw/dictionary.h>
+#include <libloom/dictionary.h>
 
 #include <unordered_map>
 #include <unordered_set>
@@ -17,7 +17,7 @@ class Plan {
 
 public:
     Plan();
-    Plan(const loomplan::Plan &plan, loom::Id id_base, loom::Dictionary &dictionary);
+    Plan(const loomplan::Plan &plan, loom::base::Id id_base, loom::base::Dictionary &dictionary);
 
     template<typename F> void foreach_task(F f) const {
         for (auto &pair : tasks) {
@@ -25,13 +25,13 @@ public:
         }
     }
 
-    const PlanNode& get_node(loom::Id id) const {
+    const PlanNode& get_node(loom::base::Id id) const {
         auto it = tasks.find(id);
         assert(it != tasks.end());
         return it->second;
     }
 
-    PlanNode& get_node(loom::Id id) {
+    PlanNode& get_node(loom::base::Id id) {
         auto it = tasks.find(id);
         assert(it != tasks.end());
         return it->second;
@@ -41,21 +41,21 @@ public:
         return tasks.size();
     }
 
-    std::vector<loom::Id> get_init_tasks() const;
+    std::vector<loom::base::Id> get_init_tasks() const;
 
     template<typename T>
     void add_node(T&& task) {
         tasks.emplace(std::make_pair(task.get_id(), std::forward<T>(task)));
     }
 
-    void remove_node(loom::Id id) {
+    void remove_node(loom::base::Id id) {
         auto it = tasks.find(id);
         assert(it != tasks.end());
         tasks.erase(it);
     }
 
 private:
-    std::unordered_map<loom::Id, PlanNode> tasks;
+    std::unordered_map<loom::base::Id, PlanNode> tasks;
 };
 
 #endif // LOOM_SERVER_PLAN_H
diff --git a/src/server/plannode.cpp b/src/server/plannode.cpp
index dbae6ec6ee1c6e51a550e6546aa23356d76c167b..977c85588a03dbc91523c878d9803f5f90dce3ea 100644
--- a/src/server/plannode.cpp
+++ b/src/server/plannode.cpp
@@ -5,7 +5,7 @@
 #include <iomanip>
 
 
-void PlanNode::replace_input(loom::Id old_input, const std::vector<loom::Id> &new_inputs)
+void PlanNode::replace_input(loom::base::Id old_input, const std::vector<loom::base::Id> &new_inputs)
 {
     auto i = std::find(inputs.begin(), inputs.end(), old_input);
     assert (i != inputs.end());
@@ -13,7 +13,7 @@ void PlanNode::replace_input(loom::Id old_input, const std::vector<loom::Id> &ne
     inputs.insert(i2, new_inputs.begin(), new_inputs.end());
 }
 
-void PlanNode::replace_next(loom::Id old_next, const std::vector<loom::Id> &new_nexts)
+void PlanNode::replace_next(loom::base::Id old_next, const std::vector<loom::base::Id> &new_nexts)
 {
     auto i = std::find(nexts.begin(), nexts.end(), old_next);
     assert (i != nexts.end());
diff --git a/src/server/plannode.h b/src/server/plannode.h
index db9c73b05a5da74d4bea9dc1cfcf369875b3bc5a..d84c1094e127a54992a76ecd1c416839b1ead562 100644
--- a/src/server/plannode.h
+++ b/src/server/plannode.h
@@ -1,7 +1,7 @@
 #ifndef LOOM_SERVER_TASKNODE_H
 #define LOOM_SERVER_TASKNODE_H
 
-#include <libloomw/types.h>
+#include <libloom/types.h>
 
 #include <vector>
 #include <string>
@@ -24,27 +24,27 @@ public:
         POLICY_SCHEDULER
     };
 
-    PlanNode(loom::Id id,
-             loom::Id client_id,
+    PlanNode(loom::base::Id id,
+             loom::base::Id client_id,
              Policy policy,
              int n_cpus,
              bool result_flag,
              int task_type,
              const std::string &config,
-             std::vector<loom::Id> &&inputs)
+             std::vector<loom::base::Id> &&inputs)
         : id(id), policy(policy), n_cpus(n_cpus), result_flag(result_flag), task_type(task_type),
           inputs(std::move(inputs)), config(config),
           client_id(client_id)
     {}
 
-    PlanNode(loom::Id id,
-             loom::Id client_id,
+    PlanNode(loom::base::Id id,
+             loom::base::Id client_id,
              Policy policy,
              int n_cpus,
              bool result_flag,
-             int task_type,
+             loom::base::Id task_type,
              const std::string &config,
-             const std::vector<loom::Id> &inputs)
+             const std::vector<loom::base::Id> &inputs)
         : id(id), policy(policy), n_cpus(n_cpus), result_flag(result_flag), task_type(task_type),
           inputs(inputs), config(config),
           client_id(client_id)
@@ -54,15 +54,15 @@ public:
         return policy;
     }
 
-    loom::Id get_id() const {
+    loom::base::Id get_id() const {
         return id;
     }
 
-    loom::Id get_client_id() const {
+    loom::base::Id get_client_id() const {
         return client_id;
     }
 
-    loom::TaskId get_task_type() const {
+    loom::base::Id get_task_type() const {
         return task_type;
     }
 
@@ -78,16 +78,16 @@ public:
         this->nexts = nexts;
     }
 
-    const std::vector<loom::Id>& get_inputs() const {
+    const std::vector<loom::base::Id>& get_inputs() const {
         return inputs;
     }
 
-    const std::vector<loom::Id>& get_nexts() const {
+    const std::vector<loom::base::Id>& get_nexts() const {
         return nexts;
     }
 
-    void replace_input(loom::Id old_input, const std::vector<loom::Id> &new_inputs);
-    void replace_next(loom::Id old_next, const std::vector<loom::Id> &new_nexts);
+    void replace_input(loom::base::Id old_input, const std::vector<loom::base::Id> &new_inputs);
+    void replace_next(loom::base::Id old_next, const std::vector<loom::base::Id> &new_nexts);
 
     std::string get_type_name(Server &server);
     std::string get_info(Server &server);
@@ -105,15 +105,15 @@ public:
     }
 
 private:
-    loom::Id id;
+    loom::base::Id id;
     Policy policy;
     int n_cpus; // TODO: Replace by resource index
     bool result_flag;
-    loom::TaskId task_type;
-    std::vector<loom::Id> inputs;
-    std::vector<loom::Id> nexts;
+    loom::base::Id task_type;
+    std::vector<loom::base::Id> inputs;
+    std::vector<loom::base::Id> nexts;
     std::string config;
-    loom::Id client_id;
+    loom::base::Id client_id;
 };
 
 
diff --git a/src/server/scheduler.cpp b/src/server/scheduler.cpp
index 504ddb5a3a5bc84dbf5edcd47819c3bb5801a927..1562cb12b90bf58a0262cc920d4af44c1eb989c0 100644
--- a/src/server/scheduler.cpp
+++ b/src/server/scheduler.cpp
@@ -77,14 +77,14 @@ Scheduler::Scheduler(ComputationState &cstate)
    }
 
    // Gather info about pending tasks
-   std::unordered_map<loom::Id, size_t> inputs;
-   std::unordered_map<loom::Id, size_t> nexts;
+   std::unordered_map<loom::base::Id, size_t> inputs;
+   std::unordered_map<loom::base::Id, size_t> nexts;
    size_t input_i = 0;
 
    // * 2 because units is expanded in solve()
    s_units.reserve(cstate.get_pending_tasks().size() * 2);
 
-   for (loom::Id id : cstate.get_pending_tasks()) {
+   for (loom::base::Id id : cstate.get_pending_tasks()) {
       const PlanNode &node = cstate.get_node(id);
 
       SUnit s_unit;
@@ -98,7 +98,7 @@ Scheduler::Scheduler(ComputationState &cstate)
 
       s_unit.ids.push_back(id);
 
-      for (loom::Id id2 : node.get_inputs()) {
+      for (loom::base::Id id2 : node.get_inputs()) {
          auto it = inputs.find(id2);
          if (it == inputs.end()) {
             s_unit.inputs.push_back(input_i);
@@ -108,9 +108,9 @@ Scheduler::Scheduler(ComputationState &cstate)
          }
       }
 
-      for (loom::Id id2 : node.get_nexts()) {
+      for (loom::base::Id id2 : node.get_nexts()) {
          const PlanNode &node2 = cstate.get_node(id2);
-         for (loom::Id id3 : node2.get_inputs()) {
+         for (loom::base::Id id3 : node2.get_inputs()) {
             const TaskState *state = cstate.get_state_ptr(id3);
             if (state) {
                   s_unit.nexts.push_back(id2);
@@ -138,7 +138,7 @@ Scheduler::Scheduler(ComputationState &cstate)
       const PlanNode &node = cstate.get_node(pair.first);
       NUnit n_unit;
       n_unit.n_cpus = node.get_n_cpus();
-      for (loom::Id id : node.get_inputs()) {
+      for (loom::base::Id id : node.get_inputs()) {
          const TaskState *state = cstate.get_state_ptr(id);
          if (state) {
             state->foreach_source([&input_i, id, &n_unit, &inputs](WorkerConnection *wc) {
@@ -374,7 +374,7 @@ void Scheduler::create_derived_units()
     });
 
     Worker w = workers[0];
-    std::vector<loom::Id> result;
+    std::vector<loom::base::Id> result;
 
     for (auto &unit : units) {
         if (unit.n_cpus <= w.free_cpus) {
diff --git a/src/server/scheduler.h b/src/server/scheduler.h
index 17371bedaeec90dc4883893817743246728d6a95..1475f50e808dccdec9f9bec3aa52c7e2302843d4 100644
--- a/src/server/scheduler.h
+++ b/src/server/scheduler.h
@@ -3,7 +3,7 @@
 
 #include "compstate.h"
 
-using TaskDistribution = std::unordered_map<WorkerConnection*, std::vector<loom::Id>>;
+using TaskDistribution = std::unordered_map<WorkerConnection*, std::vector<loom::base::Id>>;
 
 class Scheduler
 {
@@ -14,8 +14,8 @@ class Scheduler
         int64_t expected_size;
         std::vector<size_t> inputs;
         std::vector<size_t> next_inputs;
-        std::vector<loom::Id> nexts;
-        std::vector<loom::Id> ids;
+        std::vector<loom::base::Id> nexts;
+        std::vector<loom::base::Id> ids;
     };
 
     struct Worker {
diff --git a/src/server/server.cpp b/src/server/server.cpp
index 03f59c861f8deac5018cc4ca2445d5a1fe8c9425..e249905272a7a2e21b9c8905abf80f7d125daf00 100644
--- a/src/server/server.cpp
+++ b/src/server/server.cpp
@@ -3,9 +3,7 @@
 #include "libloom/pbutils.h"
 #include "libloom/compat.h"
 #include "libloom/log.h"
-
-#include "libloomw/utils.h"
-#include "libloomw/loomcomm.pb.h"
+#include "libloom/loomcomm.pb.h"
 
 #include <sstream>
 
@@ -69,7 +67,7 @@ void Server::remove_client_connection(ClientConnection &conn)
     client_connection.reset();
 }
 
-loom::Id Server::translate_to_client_id(loom::Id id) const
+loom::base::Id Server::translate_to_client_id(loom::base::Id id) const
 {
     return task_manager.get_plan().get_node(id).get_client_id();
 }
@@ -84,7 +82,7 @@ void Server::remove_freshconnection(FreshConnection &conn)
     fresh_connections.erase(i);
 }
 
-void Server::on_task_finished(loom::Id id, size_t size, size_t length, WorkerConnection *wc)
+void Server::on_task_finished(loom::base::Id id, size_t size, size_t length, WorkerConnection *wc)
 {
     task_manager.on_task_finished(id, size, length, wc);
 }
diff --git a/src/server/server.h b/src/server/server.h
index 81fdd1e37cda32da23daf3ba2d3451d3bd1092df..ec655dade028703f1ba71513ba9ad564cdaa437a 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -8,7 +8,7 @@
 #include "dummyworker.h"
 
 
-#include "libloomw/dictionary.h"
+#include "libloom/dictionary.h"
 #include "libloom/listener.h"
 
 #include <vector>
@@ -33,7 +33,7 @@ public:
     void add_client_connection(std::unique_ptr<ClientConnection> conn);
     void remove_client_connection(ClientConnection &conn);
 
-    loom::Id translate_to_client_id(loom::Id id) const;
+    loom::base::Id translate_to_client_id(loom::base::Id id) const;
 
     DummyWorker& get_dummy_worker() {
         return dummy_worker;
@@ -58,18 +58,18 @@ public:
         return client_connection.get() != nullptr;
     }
 
-    void add_resend_task(loom::Id id);
+    void add_resend_task(loom::base::Id id);
 
-    void on_task_finished(loom::Id id, size_t size, size_t length, WorkerConnection *wc);
+    void on_task_finished(loom::base::Id id, size_t size, size_t length, WorkerConnection *wc);
 
-    loom::Dictionary& get_dictionary() {
+    loom::base::Dictionary& get_dictionary() {
         return dictionary;
     }
 
     void inform_about_error(std::string &error_msg);
-    void inform_about_task_error(loom::Id id, WorkerConnection &wconn, const std::string &error_msg);
+    void inform_about_task_error(loom::base::Id id, WorkerConnection &wconn, const std::string &error_msg);
 
-    loom::Id new_id(int count = 1) {
+    loom::base::Id new_id(int count = 1) {
         auto id = id_counter;
         id_counter += count;
         return id;
@@ -85,7 +85,7 @@ private:
 
 
 
-    loom::Dictionary dictionary;
+    loom::base::Dictionary dictionary;
     uv_loop_t *loop;
     loom::base::Listener listener;
 
@@ -99,7 +99,7 @@ private:
     TaskManager task_manager;
     DummyWorker dummy_worker;
 
-    loom::Id id_counter;
+    loom::base::Id id_counter;
     void on_new_connection();
 
     bool task_distribution_active;
diff --git a/src/server/taskmanager.cpp b/src/server/taskmanager.cpp
index 962f5791c30a37a04ee3e66bdb815704bfb50627..bda603501dd79387eb2dfdcc6a9af5455149c70e 100644
--- a/src/server/taskmanager.cpp
+++ b/src/server/taskmanager.cpp
@@ -2,8 +2,8 @@
 #include "server.h"
 
 #include "libloom/compat.h"
-#include "libloomw/loomplan.pb.h"
-#include "libloomw/loomcomm.pb.h"
+#include "libloom/loomplan.pb.h"
+#include "libloom/loomcomm.pb.h"
 #include "libloom/log.h"
 
 #include <algorithm>
@@ -39,7 +39,7 @@ void TaskManager::distribute_work(const TaskDistribution &distribution)
     }
 
     for (auto& p : distribution) {
-        for (loom::Id id : p.second) {
+        for (loom::base::Id id : p.second) {
             start_task(p.first, id);
         }
     }
@@ -48,7 +48,7 @@ void TaskManager::distribute_work(const TaskDistribution &distribution)
 void TaskManager::start_task(WorkerConnection *wc, Id task_id)
 {
     const PlanNode &node = cstate.get_node(task_id);
-    for (loom::Id id : node.get_inputs()) {
+    for (loom::base::Id id : node.get_inputs()) {
         TaskState &state = cstate.get_state(id);
         TaskState::WStatus st = state.get_worker_status(wc);
         if (st == TaskState::S_NONE) {
@@ -91,14 +91,14 @@ void TaskManager::remove_state(TaskState &state)
 {
     logger->debug("Removing state id={}", state.get_id());
     assert(state.get_ref_counter() == 0);
-    loom::Id id = state.get_id();
+    loom::base::Id id = state.get_id();
     state.foreach_owner([id](WorkerConnection *wc) {
         wc->remove_data(id);
     });
     cstate.remove_state(id);
 }
 
-void TaskManager::on_task_finished(loom::Id id, size_t size, size_t length, WorkerConnection *wc)
+void TaskManager::on_task_finished(loom::base::Id id, size_t size, size_t length, WorkerConnection *wc)
 {
     const PlanNode &node = cstate.get_node(id);
 
@@ -126,11 +126,11 @@ void TaskManager::on_task_finished(loom::Id id, size_t size, size_t length, Work
     }
 
     // Remove duplicates
-    std::vector<loom::Id> inputs = node.get_inputs();
+    std::vector<loom::base::Id> inputs = node.get_inputs();
     std::sort(inputs.begin(), inputs.end());
     inputs.erase(std::unique(inputs.begin(), inputs.end()), inputs.end());
 
-    for (loom::Id id : inputs) {
+    for (loom::base::Id id : inputs) {
         TaskState &state = cstate.get_state(id);
         if (state.dec_ref_counter()) {
             remove_state(state);
diff --git a/src/server/taskmanager.h b/src/server/taskmanager.h
index 71df7a2909c3ae086df2d540b392942d0461cd25..4768eb0ef89915c48b139beed42a90c20483473e 100644
--- a/src/server/taskmanager.h
+++ b/src/server/taskmanager.h
@@ -36,7 +36,7 @@ public:
         return cstate.get_plan();
     }
 
-    void on_task_finished(loom::Id id, size_t size, size_t length, WorkerConnection *wc);
+    void on_task_finished(loom::base::Id id, size_t size, size_t length, WorkerConnection *wc);
     void register_worker(WorkerConnection *wc);
 
     bool is_plan_finished() const {
@@ -50,7 +50,7 @@ private:
     ComputationState cstate;
 
     void distribute_work(const TaskDistribution &distribution);
-    void start_task(WorkerConnection *wc, loom::Id task_id);
+    void start_task(WorkerConnection *wc, loom::base::Id task_id);
     void remove_state(TaskState &state);
 
     bool report;
diff --git a/src/server/taskstate.h b/src/server/taskstate.h
index d98fd36f319bf9fad4e1c67d1705a88ea1a67a89..c3d7fd363af67e5974f885865a97e6dcd800ec8c 100644
--- a/src/server/taskstate.h
+++ b/src/server/taskstate.h
@@ -3,7 +3,7 @@
 
 #include <unordered_map>
 
-#include "libloomw/types.h"
+#include "libloom/types.h"
 
 class WorkerConnection;
 template<typename T> using WorkerMap = std::unordered_map<WorkerConnection*, T>;
@@ -22,7 +22,7 @@ public:
 
     TaskState(const PlanNode &node);
 
-    loom::Id get_id() const {
+    loom::base::Id get_id() const {
         return id;
     }
 
@@ -108,7 +108,7 @@ public:
     std::string get_info() const;
 
 private:
-    loom::Id id;
+    loom::base::Id id;
     WorkerMap<WStatus> workers;
     int ref_count;
     size_t size;
diff --git a/src/server/workerconn.cpp b/src/server/workerconn.cpp
index f8b85c7203fa14cdc6a552d1d1e8ff791dde51fd..661dc3437a9c09e1ab77e9fd70d2233686838b2d 100644
--- a/src/server/workerconn.cpp
+++ b/src/server/workerconn.cpp
@@ -2,7 +2,7 @@
 #include "server.h"
 
 #include "libloom/log.h"
-#include "libloomw/loomcomm.pb.h"
+#include "libloom/loomcomm.pb.h"
 #include "taskmanager.h"
 
 
@@ -12,8 +12,8 @@ using namespace loom::base;
 WorkerConnection::WorkerConnection(Server &server,
                                    std::unique_ptr<loom::base::Socket> socket,
                                    const std::string& address,
-                                   const std::vector<loom::Id> &task_types,
-                                   const std::vector<loom::Id> &data_types,
+                                   const std::vector<loom::base::Id> &task_types,
+                                   const std::vector<loom::base::Id> &data_types,
                                    int resource_cpus, int worker_id)
     : server(server),
       socket(std::move(socket)),
@@ -67,7 +67,7 @@ void WorkerConnection::send_task(const PlanNode &task)
     msg.set_task_type(task.get_task_type());
     msg.set_task_config(task.get_config());
 
-    for (loom::Id id : task.get_inputs()) {
+    for (loom::base::Id id : task.get_inputs()) {
         msg.add_task_inputs(id);
     }
     send_message(*socket, msg);
diff --git a/src/server/workerconn.h b/src/server/workerconn.h
index bfbae37b85d7e0db2e428719f77c8e88e36c80c0..2c90bdb24947f1c4dd2a51f713fd3b78e2f29cf0 100644
--- a/src/server/workerconn.h
+++ b/src/server/workerconn.h
@@ -2,7 +2,7 @@
 #define LOOM_SERVER_WORKERCONN
 
 #include "libloom/socket.h"
-#include "libloomw/types.h"
+#include "libloom/types.h"
 
 class Server;
 class PlanNode;
@@ -15,15 +15,15 @@ public:
     WorkerConnection(Server &server,
                      std::unique_ptr<loom::base::Socket> socket,
                      const std::string& address,
-                     const std::vector<loom::Id> &task_types,
-                     const std::vector<loom::Id> &data_types,
+                     const std::vector<loom::base::Id> &task_types,
+                     const std::vector<loom::base::Id> &data_types,
                      int resource_cpus,
                      int worker_id);
     void on_message(const char *buffer, size_t size);
 
     void send_task(const PlanNode &task);
-    void send_data(loom::Id id, const std::string &address);
-    void remove_data(loom::Id id);
+    void send_data(loom::base::Id id, const std::string &address);
+    void remove_data(loom::base::Id id);
 
     const std::string &get_address() {
         return address;
diff --git a/tests/server/CMakeLists.txt b/tests/server/CMakeLists.txt
index 2c1f34f701306e789501bc970a0e482d7f6e52ad..dc82a74439dc3e3f6d2faf7e754d13a4ea994674 100644
--- a/tests/server/CMakeLists.txt
+++ b/tests/server/CMakeLists.txt
@@ -8,7 +8,7 @@ add_executable(server-test
                test_scheduler.cpp
                main.cpp)
 
-target_link_libraries(server-test Catch libloom libloomw ${LIBUV_LIBRARY} pthread)
+target_link_libraries(server-test Catch libloom ${LIBUV_LIBRARY} pthread)
 target_link_libraries(server-test ${LPSOLVE_LIBRARY} ${COLAMD_LIBRARY} dl)
 target_link_libraries(server-test ${PROTOBUF_LIBRARIES})
 
diff --git a/tests/server/test_scheduler.cpp b/tests/server/test_scheduler.cpp
index a037fc078f2bf49ba661e5434f7fda6b419f8c8b..df69a203de37864cf795d81419f9325cd016cf84 100644
--- a/tests/server/test_scheduler.cpp
+++ b/tests/server/test_scheduler.cpp
@@ -3,7 +3,7 @@
 #include "src/server/server.h"
 
 #include "libloom/compat.h"
-#include "libloomw/loomplan.pb.h"
+#include "libloom/loomplan.pb.h"
 
 #include <set>
 
@@ -23,7 +23,7 @@ DistMap;
 static std::unique_ptr<WorkerConnection>
 simple_worker(Server &server, const std::string &name, int cpus=1)
 {
-   std::vector<loom::Id> tt, dt;
+   std::vector<loom::base::Id> tt, dt;
    return std::make_unique<WorkerConnection>(server, nullptr, name, tt, dt, cpus, 0);
 }
 
@@ -268,9 +268,9 @@ static loomplan::Plan make_request_plan(Server &server)
    return plan;
 }
 
-std::vector<loom::Id> range(size_t limit)
+std::vector<loom::base::Id> range(size_t limit)
 {
-    std::vector<loom::Id> result;
+    std::vector<loom::base::Id> result;
     result.reserve(limit);
     for (size_t i = 0; i < limit; i++) {
         result.push_back(i);
@@ -291,15 +291,15 @@ void dump_dist(const TaskDistribution &d)
    }
 }
 
-static void start(ComputationState &cstate, loom::Id id, WorkerConnection *wc)
+static void start(ComputationState &cstate, loom::base::Id id, WorkerConnection *wc)
 {
-    std::vector<loom::Id> ids = {id};
+    std::vector<loom::base::Id> ids = {id};
     cstate.add_ready_nodes(ids);
     auto &node = cstate.get_node(id);
     cstate.set_running_task(node, wc);
 }
 
-static void finish(ComputationState &cstate, loom::Id id, size_t size, size_t length, WorkerConnection *wc)
+static void finish(ComputationState &cstate, loom::base::Id id, size_t size, size_t length, WorkerConnection *wc)
 {
     start(cstate, id, wc);
     auto &node = cstate.get_node(id);
@@ -316,26 +316,26 @@ TEST_CASE( "Server scheduling - plan construction", "[scheduling]" ) {
    REQUIRE(d1.get_id() == 100);
    REQUIRE(d1.get_client_id() == 0);
    REQUIRE(d1.get_inputs().empty());
-   REQUIRE((d1.get_nexts() == std::vector<loom::Id>{102}));
+   REQUIRE((d1.get_nexts() == std::vector<loom::base::Id>{102}));
 
    auto& d2 = p.get_node(101);
    REQUIRE(d2.get_id() == 101);
    REQUIRE(d2.get_client_id() == 1);
    REQUIRE(d2.get_inputs().empty());
-   REQUIRE((d2.get_nexts() == std::vector<loom::Id>{102}));
+   REQUIRE((d2.get_nexts() == std::vector<loom::base::Id>{102}));
 
    auto& d3 = p.get_node(102);
    REQUIRE(d3.get_id() == 102);
    REQUIRE(d3.get_client_id() == 2);
-   REQUIRE((d3.get_inputs() == std::vector<loom::Id>{100, 101, 100}));
-   REQUIRE((d3.get_nexts() == std::vector<loom::Id>{}));
+   REQUIRE((d3.get_inputs() == std::vector<loom::base::Id>{100, 101, 100}));
+   REQUIRE((d3.get_nexts() == std::vector<loom::base::Id>{}));
 }
 
 TEST_CASE("Server scheduling - init tasks", "[scheduling]") {
    Server server(NULL, 0);
    Plan p(make_simple_plan(server), 10, server.get_dictionary());
    auto st = p.get_init_tasks();
-   REQUIRE((v_to_s(st) == std::set<loom::Id>{10, 11}));
+   REQUIRE((v_to_s(st) == std::set<loom::base::Id>{10, 11}));
 }
 
 TEST_CASE("Basic plan scheduling", "[scheduling]") {
@@ -352,14 +352,14 @@ TEST_CASE("Basic plan scheduling", "[scheduling]") {
 
 
    SECTION("Scheduling first two tasks") {
-      s.add_ready_nodes(std::vector<loom::Id>{10, 11});
+      s.add_ready_nodes(std::vector<loom::base::Id>{10, 11});
 
       TaskDistribution d = schedule(s);
       //dump_dist(d);
       REQUIRE(d[w1.get()].size() == 1);
       REQUIRE(d[w2.get()].size() == 1);
-      loom::Id id1 = d[w1.get()][0];
-      loom::Id id2 = d[w2.get()][0];
+      loom::base::Id id1 = d[w1.get()][0];
+      loom::base::Id id2 = d[w2.get()][0];
       REQUIRE(id1 != id2);
       REQUIRE((id1 == 10 || id1 == 11));
       REQUIRE((id2 == 10 || id2 == 11));
@@ -369,45 +369,45 @@ TEST_CASE("Basic plan scheduling", "[scheduling]") {
       finish(s, 10, 200, 0, w1.get());
       finish(s, 11, 100, 0, w2.get());
 
-      s.add_ready_nodes(std::vector<loom::Id>{12});
+      s.add_ready_nodes(std::vector<loom::base::Id>{12});
       TaskDistribution d = schedule(s);
       //dump_dist(d);
 
-      REQUIRE((d[w1.get()] == std::vector<loom::Id>{12}));
-      REQUIRE((d[w2.get()] == std::vector<loom::Id>{}));
+      REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{12}));
+      REQUIRE((d[w2.get()] == std::vector<loom::base::Id>{}));
    }
 
    SECTION("Scheduling third task - second dep is bigger") {
       finish(s, 10, 100, 0, w1.get());
       finish(s, 11, 200, 0, w2.get());
 
-      s.add_ready_nodes(std::vector<loom::Id>{12});
+      s.add_ready_nodes(std::vector<loom::base::Id>{12});
       TaskDistribution d = schedule(s);
 
-      REQUIRE((d[w1.get()] == std::vector<loom::Id>{}));
-      REQUIRE((d[w2.get()] == std::vector<loom::Id>{12}));
+      REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{}));
+      REQUIRE((d[w2.get()] == std::vector<loom::base::Id>{12}));
    }
 
    SECTION("Scheduling third task - all on first") {
       finish(s, 10, 100, 0, w1.get());
       finish(s, 11, 200, 0, w1.get());
 
-      s.add_ready_nodes(std::vector<loom::Id>{12});
+      s.add_ready_nodes(std::vector<loom::base::Id>{12});
       TaskDistribution d = schedule(s);
 
-      REQUIRE((d[w1.get()] == std::vector<loom::Id>{12}));
-      REQUIRE((d[w2.get()] == std::vector<loom::Id>{}));
+      REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{12}));
+      REQUIRE((d[w2.get()] == std::vector<loom::base::Id>{}));
    }
 
    SECTION("Scheduling third task - all on second") {
       finish(s, 10, 100, 0, w2.get());
       finish(s, 11, 200, 0, w2.get());
 
-      s.add_ready_nodes(std::vector<loom::Id>{12});
+      s.add_ready_nodes(std::vector<loom::base::Id>{12});
       TaskDistribution d = schedule(s);
 
-      REQUIRE((d[w1.get()] == std::vector<loom::Id>{}));
-      REQUIRE((d[w2.get()] == std::vector<loom::Id>{12}));
+      REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{}));
+      REQUIRE((d[w2.get()] == std::vector<loom::base::Id>{12}));
    }
 }
 
@@ -439,7 +439,7 @@ TEST_CASE("Plan 4", "[scheduling]") {
 
                TaskDistribution d = schedule(s);
                //dump_dist(d);
-               REQUIRE((d[w1.get()] == std::vector<loom::Id>{7}));
+               REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{7}));
            }
 
            SECTION("Case 2") {
@@ -453,7 +453,7 @@ TEST_CASE("Plan 4", "[scheduling]") {
 
                TaskDistribution d = schedule(s);
                //dump_dist(d);
-               REQUIRE((d[w1.get()] == std::vector<loom::Id>{3}));
+               REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{3}));
            }
 
            /*SECTION("Case 3") {
@@ -467,7 +467,7 @@ TEST_CASE("Plan 4", "[scheduling]") {
 
                TaskDistribution d = schedule(s);
                dump_dist(d);
-               REQUIRE((d[w1.get()] == std::vector<loom::Id>{3}));
+               REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{3}));
            }*/
         }
 
@@ -487,7 +487,7 @@ TEST_CASE("Plan 4", "[scheduling]") {
 
                TaskDistribution d = schedule(s);
                //dump_dist(d);
-               REQUIRE((d[w1.get()] == std::vector<loom::Id>{7}));
+               REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{7}));
            }
 
            SECTION("Case 2") {
@@ -501,7 +501,7 @@ TEST_CASE("Plan 4", "[scheduling]") {
 
                TaskDistribution d = schedule(s);
                //dump_dist(d);
-               REQUIRE((d[w1.get()] == std::vector<loom::Id>{3}));
+               REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{3}));
            }
 
            /*SECTION("Case 3") {
@@ -515,7 +515,7 @@ TEST_CASE("Plan 4", "[scheduling]") {
 
                TaskDistribution d = schedule(s);
                dump_dist(d);
-               REQUIRE((d[w1.get()] == std::vector<loom::Id>{3}));
+               REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{3}));
            }*/
         }
     }
@@ -541,12 +541,12 @@ TEST_CASE("Plan2 scheduling", "[scheduling]") {
          finish(s, 3, 100, 0, w1.get());
          finish(s, 4, 100, 0, w2.get());
 
-         s.add_ready_nodes(std::vector<loom::Id>{5, 6, 7, 8});
+         s.add_ready_nodes(std::vector<loom::base::Id>{5, 6, 7, 8});
          TaskDistribution d = schedule(s);
          //dump_dist(d);
 
-         REQUIRE((d[w1.get()] == std::vector<loom::Id>{6}));
-         REQUIRE((d[w2.get()] == std::vector<loom::Id>{8}));
+         REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{6}));
+         REQUIRE((d[w2.get()] == std::vector<loom::base::Id>{8}));
       }
    }
 
@@ -567,7 +567,7 @@ TEST_CASE("Plan2 scheduling", "[scheduling]") {
          finish(s, 3, 100, 0, w1.get());
          finish(s, 4, 100, 0, w2.get());
 
-         s.add_ready_nodes(std::vector<loom::Id>{5, 6, 7, 8});
+         s.add_ready_nodes(std::vector<loom::base::Id>{5, 6, 7, 8});
          TaskDistribution d = schedule(s);
          //dump_dist(d);
 
@@ -583,7 +583,7 @@ TEST_CASE("Plan2 scheduling", "[scheduling]") {
          finish(s, 3, 100, 0, w3.get());
          finish(s, 4, 100, 0, w3.get());
 
-         s.add_ready_nodes(std::vector<loom::Id>{5, 6, 8});
+         s.add_ready_nodes(std::vector<loom::base::Id>{5, 6, 8});
          TaskDistribution d = schedule(s);
          //dump_dist(d);
 
@@ -603,7 +603,7 @@ TEST_CASE("Plan2 scheduling", "[scheduling]") {
          finish(s, 3, 0, 0, w3.get());
          //finish(s, 4, 100, 0, w3.get());
 
-         s.add_ready_nodes(std::vector<loom::Id>{5, 6});
+         s.add_ready_nodes(std::vector<loom::base::Id>{5, 6});
          TaskDistribution d = schedule(s);
          //dump_dist(d);
 
@@ -630,7 +630,7 @@ TEST_CASE("Big plan", "[scheduling]") {
       s.add_worker(ws[i].get());
    }
 
-   std::vector<loom::Id> ready;
+   std::vector<loom::base::Id> ready;
    for (size_t i = 0; i < BIG_PLAN_SIZE; i++) {
       finish(s, i, 10 + i * 10, 0, ws[i % BIG_PLAN_WORKERS].get());
       ready.push_back(i + BIG_PLAN_SIZE);
@@ -661,7 +661,7 @@ TEST_CASE("Big simple plan", "[scheduling]") {
       s.add_worker(ws[i].get());
    }
 
-   std::vector<loom::Id> ready;
+   std::vector<loom::base::Id> ready;
    for (size_t i = 0; i < BIG_PLAN_SIZE; i++) {
       finish(s, i, 10 + i * 10, 0, ws[i % BIG_PLAN_WORKERS].get());
       ready.push_back(i + BIG_PLAN_SIZE);
@@ -710,10 +710,10 @@ TEST_CASE("Request plan", "[scheduling]") {
        s.add_ready_nodes(range(7));
        TaskDistribution d = schedule(s);
        //dump_dist(d);
-       REQUIRE((d[w1.get()] == std::vector<loom::Id>{0} ||
-                d[w1.get()] == std::vector<loom::Id>{1}));
-       REQUIRE((d[w2.get()] == std::vector<loom::Id>{2} ||
-                d[w2.get()] == std::vector<loom::Id>{3}));
+       REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{0} ||
+                d[w1.get()] == std::vector<loom::base::Id>{1}));
+       REQUIRE((d[w2.get()] == std::vector<loom::base::Id>{2} ||
+                d[w2.get()] == std::vector<loom::base::Id>{3}));
    }
 
    SECTION("2/2 cpus") {
@@ -724,10 +724,10 @@ TEST_CASE("Request plan", "[scheduling]") {
 
        s.add_ready_nodes(range(7));
        TaskDistribution d = schedule(s);
-       REQUIRE((d[w1.get()] == std::vector<loom::Id>{2} ||
-                d[w1.get()] == std::vector<loom::Id>{3}));
-       REQUIRE((d[w2.get()] == std::vector<loom::Id>{2} ||
-                d[w2.get()] == std::vector<loom::Id>{3}));
+       REQUIRE((d[w1.get()] == std::vector<loom::base::Id>{2} ||
+                d[w1.get()] == std::vector<loom::base::Id>{3}));
+       REQUIRE((d[w2.get()] == std::vector<loom::base::Id>{2} ||
+                d[w2.get()] == std::vector<loom::base::Id>{3}));
    }
 
    SECTION("5 cpus") {
@@ -759,7 +759,7 @@ TEST_CASE("Request plan", "[scheduling]") {
        auto w1 = simple_worker(server, "w1", 5);
        s.add_worker(w1.get());
 
-       s.add_ready_nodes(std::vector<loom::Id>{4, 5, 6, 7});
+       s.add_ready_nodes(std::vector<loom::base::Id>{4, 5, 6, 7});
        TaskDistribution d = schedule(s);
        REQUIRE((check_uvector(d[w1.get()], {6, 7}) || check_uvector(d[w1.get()], {5, 7})));
    }