diff --git a/runtime/pairs.hpp b/runtime/pairs.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..6a356cb30566e4a284774d51726ff3c0bdf63c48
--- /dev/null
+++ b/runtime/pairs.hpp
@@ -0,0 +1,68 @@
+#include <iostream>
+#include <vector>
+
+#define PAIRS_ASSERT(a)
+
+namespace pairs {
+
+typedef int property_t;
+typedef int layout_t;
+
+class PairsSim {
+    PairsSim() : {}
+
+public:
+    Property getProperty(property_t id) {
+        return std::find_if(properties.begin(), properties.end(), [id](Property p) { return p.getId() == id; });
+    }
+
+    Property getPropertyByName(std::string name) {
+        return std::find_if(properties.begin(), properties.end(), [name](Property p) { return p.getName() == name; });
+    }
+
+    VectorPtr getFloatPropertyMutablePtr(property_t property) {
+        return static_cast<VectorPtr>(getProperty(property).getPointer());
+    }
+
+    int *getIntegerPropertyMutablePtr(property_t property) {
+        return static_cast<int *>(getProperty(property).getPointer());
+    }
+
+    double *getFloatPropertyMutablePtr(property_t property) {
+        return static_cast<double *>(getProperty(property).getPointer());
+    }
+
+private:
+    std::vector<Property> properties;
+};
+
+class Property {
+    Property(property_t id_, std::string name_) : id(id_), name(name_), layout(-1), ptr(nullptr) {}
+    Property(property_t id_, std::string name_, layout_t layout_) : id(id_), name(name_), layout(layout_), ptr(nullptr) {}
+    Property(property_t id_, std::string name_, void *ptr_) : id(id_), name(name_), layout(-1), ptr(ptr_) {}
+    Property(property_t id_, std::string name_, layout_t layout_, void *ptr_) : id(id_), name(name_), layout(layout_), ptr(ptr_) {}
+
+public:
+    property_t getId() { return id; }
+    std::string getName() { return name; }
+    void *getPointer() { return ptr; }
+    void setPointer(void *ptr_) { ptr = ptr_; }
+
+private:
+    property_t id;
+    layout_t layout;
+    std::string name;
+    void *ptr;
+};
+
+template<typename real_t>
+class Vector3 {
+    Vector3() : x((real_t) 0.0), y((real_t) 0.0), z((real_t) 0.0) : {}
+    Vector3(real_t v) : x(v), y(v), z(v) : {}
+    Vector3(real_t x_, real_t y_, real_t z_) : x(x_), y(y_), z(z_) {}
+
+private:
+    real_t x, y, z;
+};
+
+}
diff --git a/runtime/read_from_file.hpp b/runtime/read_from_file.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b1bb7e7745d03e9ea297195bdecc2619839a4b94
--- /dev/null
+++ b/runtime/read_from_file.hpp
@@ -0,0 +1,58 @@
+#include <stdio.h>
+//---
+#include "pairs.hpp"
+
+namespace pairs {
+
+size_t read_particle_data(PairsSim *ps, const char *filename, property_t properties[], size_t nprops) {
+    std::ifstream in_file(filename);
+    std::string line;
+    size_t n = 0;
+
+    if(in_file.is_open()) {
+        while(getline(in_file, line)) {
+            int p = 0;
+            char *in0 = strtok(line, ",");
+            while(in0 != NULL) {
+                PAIRS_ASSERT(p < nprops);
+                prop_type = ps->getPropertyType(p);
+
+                switch(prop_type) {
+                    case PROPERTY_TYPE_VECTOR:
+                        auto vector_ptr = ps->getVectorPropertyMutablePtr(p);
+                        char *in1 = strtok(NULL, ",");
+                        PAIRS_ASSERT(in1 != NULL);
+                        char *in2 = strtok(NULL, ",");
+                        PAIRS_ASSERT(in2 != NULL);
+                        vector_ptr[n] = Vector3(std::stod(in0), std::stod(in1), std::stod(in2));
+                        break;
+
+                    case PROPERTY_TYPE_INTEGER:
+                        auto int_ptr = ps->getIntegerPropertyMutablePtr(p);
+                        int_ptr[n] = std::stoi(in0);
+                        break;
+
+                    case PROPERTY_TYPE_FLOAT:
+                        auto float_ptr = ps->getFloatPropertyMutablePtr(p);
+                        float_ptr[n] = std::stod(in0);
+                        break;
+
+                    default:
+                        fprintf(stderr, "read_particle_data(): Invalid property type!");
+                        return -1;
+                }
+
+                in0 = strtok(NULL, ",");
+                p++;
+            }
+
+            n++;
+        }
+
+        in_file.close();
+    }
+
+    return n;
+}
+
+}