diff --git a/code_gen/cgen.py b/code_gen/cgen.py
index 227f15cb932376eec2521a885a86685084083461..d29be3aca78f93716ff1e93c99a722fb92707164 100644
--- a/code_gen/cgen.py
+++ b/code_gen/cgen.py
@@ -6,6 +6,7 @@ from ir.cast import Cast
 from ir.bin_op import BinOp, BinOpDef
 from ir.data_types import Type_Int, Type_Float, Type_String, Type_Vector
 from ir.functions import Call
+from ir.layouts import Layout_AoS, Layout_SoA, Layout_Invalid
 from ir.lit import Lit
 from ir.loops import For, Iter, ParticleFor, While
 from ir.math import Sqrt
@@ -160,7 +161,16 @@ class CGen:
                     "Prop_Invalid"
 
             assert ptype != "Prop_Invalid", "Invalid property type!"
-            self.print(f"ps->addProperty(Property({p.id()}, \"{p.name()}\", {p.name()}, {ptype}));")
+
+            playout = "AoS" if p.layout() == Layout_AoS else \
+                      "SoA" if p.layout() == Layout_SoA else \
+                      "Invalid"
+
+            if p.type() != Type_Vector or p.layout() == Layout_Invalid:
+                self.print(f"ps->addProperty(Property({p.id()}, \"{p.name()}\", {p.name()}, {ptype}));")
+            else:
+                sizes = ", ".join([str(self.generate_expression(size)) for size in ast_node.sizes()])
+                self.print(f"ps->addProperty(Property({p.id()}, \"{p.name()}\", {p.name()}, {ptype}, {playout}, {sizes}));")
 
         if isinstance(ast_node, Timestep):
             self.generate_statement(ast_node.block)
diff --git a/ir/properties.py b/ir/properties.py
index 17029a69b73ae796130f28ce831c3c7f24ff47ca..4be233cbb50bf522a841438de082651f154b4ade 100644
--- a/ir/properties.py
+++ b/ir/properties.py
@@ -1,5 +1,6 @@
 from ir.ast_node import ASTNode
 from ir.layouts import Layout_AoS
+from ir.lit import as_lit_ast
 
 
 class Properties:
@@ -100,13 +101,17 @@ class PropertyList(ASTNode):
 
 
 class RegisterProperty(ASTNode):
-    def __init__(self, sim, prop):
+    def __init__(self, sim, prop, sizes):
         super().__init__(sim)
         self.prop = prop
+        self.sizes_list = [as_lit_ast(sim, s) for s in sizes]
         self.sim.add_statement(self)
 
     def property(self):
         return self.prop
 
+    def sizes(self):
+        return self.sizes_list
+
     def __str__(self):
         return f"Property<{self.prop.name()}>"
diff --git a/runtime/read_from_file.hpp b/runtime/read_from_file.hpp
index 85d1c2f18a58e5d2288cb86eabde76f58a9018b5..3e47403fe3fb7c0ced6ecddd99dba3dfe3b6fce6 100644
--- a/runtime/read_from_file.hpp
+++ b/runtime/read_from_file.hpp
@@ -16,7 +16,7 @@ size_t read_particle_data(PairsSim *ps, const char *filename, double *grid_buffe
     int read_grid_data = 0;
 
     if(in_file.is_open()) {
-        while(getline(in_file, line)) {
+        while(std::getline(in_file, line)) {
             std::stringstream line_stream(line);
             std::string in0;
             int i = 0;
@@ -25,7 +25,6 @@ size_t read_particle_data(PairsSim *ps, const char *filename, double *grid_buffe
                 if(!read_grid_data) {
                     PAIRS_ASSERT(i < ps->getNumDims() * 2);
                     grid_buffer[i] = std::stod(in0);
-                    read_grid_data = 1;
                 } else {
                     PAIRS_ASSERT(i < nprops);
                     property_t p_id = properties[i];
@@ -55,7 +54,8 @@ size_t read_particle_data(PairsSim *ps, const char *filename, double *grid_buffe
                 i++;
             }
 
-            n++;
+            n += (read_grid_data) ? 1 : 0;
+            read_grid_data = 1;
         }
 
         in_file.close();
diff --git a/sim/properties.py b/sim/properties.py
index 2313be162def600277a0e5a7ed2ad1cba50a60ec..79fba538412f50060d9a62831c0c069cb4bde1a6 100644
--- a/sim/properties.py
+++ b/sim/properties.py
@@ -1,8 +1,10 @@
+from functools import reduce
 from ir.data_types import Type_Float, Type_Vector
 from ir.loops import ParticleFor
 from ir.memory import Malloc, Realloc
 from ir.properties import RegisterProperty
 from ir.utils import Print
+import operator
 
 
 class PropertiesAlloc:
@@ -19,15 +21,15 @@ class PropertiesAlloc:
             if p.type() == Type_Float:
                 sizes = [capacity]
             elif p.type() == Type_Vector:
-                sizes = [capacity * self.sim.ndims()]
+                sizes = [capacity, self.sim.ndims()]
             else:
                 raise Exception("Invalid property type!")
 
             if self.realloc:
-                Realloc(self.sim, p, sizes)
+                Realloc(self.sim, p, reduce(operator.mul, sizes))
             else:
-                Malloc(self.sim, p, sizes, True)
-                RegisterProperty(self.sim, p)
+                Malloc(self.sim, p, reduce(operator.mul, sizes), True)
+                RegisterProperty(self.sim, p, sizes)
 
         return self.sim.block