diff --git a/src/Entity.jl b/src/Entity.jl
index b202cb8867e8eec61c2325d60441ec66fb01c250..6a9007d0e57d8af55483abf9cf99b6d3d2fd84ee 100644
--- a/src/Entity.jl
+++ b/src/Entity.jl
@@ -580,7 +580,7 @@ function create_value(
         )
     elseif in_type <: Integer
         err_code = ccall(
-            (:caosdb_entity_create_bool_value, CaosDB.library_name),
+            (:caosdb_entity_create_int_value, CaosDB.library_name),
             Cint,
             (Ref{_Value}, Clong),
             out,
@@ -588,7 +588,7 @@ function create_value(
         )
     elseif in_type <: Number
         err_code = ccall(
-            (:caosdb_entity_create_bool_value, CaosDB.library_name),
+            (:caosdb_entity_create_double_value, CaosDB.library_name),
             Cint,
             (Ref{_Value}, Cdouble),
             out,
@@ -1224,7 +1224,7 @@ function _get_value(value::Ref{_Value})
             # convert to vector of type of elements s.th. it can be re-used in a
             # `set_value` function.
             elt_type = typeof(out[1])
-            convert(Vector{elt_type}, out)
+            return convert(Vector{elt_type}, out)
         end
 
         return out
diff --git a/test/runtests.jl b/test/runtests.jl
index c2ae2face7fdc82805eab16055069ae4a33c5b04..398b635783bd07ecd1adcfdbf49f8b4a78477e9a 100644
--- a/test/runtests.jl
+++ b/test/runtests.jl
@@ -102,12 +102,13 @@ using CaosDB
 
         rt_with_name = CaosDB.Entity.create_recordtype("TestRT")
         @test CaosDB.Entity.get_name(rt_with_name) == "TestRT"
-        @test CaosDB.Entity.get_role(rt_with_name) == "RECORD_TYPE"
+        @test CaosDB.Entity.get_role(rt_with_name) == CaosDB.Constants.ROLE.RECORD_TYPE
 
         prop_with_name_and_unit =
             CaosDB.Entity.create_property_entity(name = "TestProp", unit = "m")
         @test CaosDB.Entity.get_name(prop_with_name_and_unit) == "TestProp"
-        @test CaosDB.Entity.get_role(prop_with_name_and_unit) == "PROPERTY"
+        @test CaosDB.Entity.get_role(prop_with_name_and_unit) ==
+              CaosDB.Constants.ROLE.PROPERTY
         @test CaosDB.Entity.get_unit(prop_with_name_and_unit) == "m"
 
         rec_with_parent_and_props = CaosDB.Entity.create_record("TestRec")
@@ -119,7 +120,7 @@ using CaosDB
         # cannot set the datatype of a record
         @test_throws CaosDB.Exceptions.ClientException CaosDB.Entity.set_datatype(
             rec_with_parent_and_props,
-            "INTEGER",
+            CaosDB.Constants.DATATYPE.INTEGER,
         )
 
         par1 = CaosDB.Entity.create_parent(name = "Parent1")
@@ -145,22 +146,20 @@ using CaosDB
 
         prop1 = CaosDB.Entity.create_property(name = "Property1", value = "2")
         prop2 = CaosDB.Entity.create_property(id = "id_of_property_2")
-        CaosDB.Entity.set_datatype(prop2, "TEXT")
+        CaosDB.Entity.set_datatype(prop2, CaosDB.Constants.DATATYPE.TEXT)
         prop3 = CaosDB.Entity.create_property(name = "Property3")
         CaosDB.Entity.append_properties(rec_with_parent_and_props, [prop1, prop2, prop3])
         @test length(CaosDB.Entity.get_properties(rec_with_parent_and_props)) == 3
-        # properties can be accessed as a list
 
-        # TODO(florian) Fix this once we have a reasonable treatment of value objects in Extern C.
-        @test_broken CaosDB.Entity.get_value(
+        # properties can be accessed as a list
+        @test CaosDB.Entity.get_value(
             CaosDB.Entity.get_properties(rec_with_parent_and_props)[1],
         ) == "2"
-        type, is_ref, is_list = CaosDB.Entity.get_datatype(
+        type, collection = CaosDB.Entity.get_datatype(
             CaosDB.Entity.get_properties(rec_with_parent_and_props)[2],
         )
-        @test type == "TEXT"
-        @test is_ref == false
-        @test is_list == false
+        @test type == CaosDB.Constants.DATATYPE.TEXT
+        @test collection == nothing
         @test CaosDB.Entity.get_id(
             CaosDB.Entity.get_properties(rec_with_parent_and_props)[2],
         ) == "id_of_property_2"
@@ -177,7 +176,7 @@ using CaosDB
             local_path = string(pwd(), "/", "caosdbfilefortests.txt"),
             remote_path = "/remote_path/file.txt",
         )
-        @test CaosDB.Entity.get_role(file_ent) == "FILE"
+        @test CaosDB.Entity.get_role(file_ent) == CaosDB.Constants.ROLE.FILE
         @test CaosDB.Entity.get_name(file_ent) == "TestFile"
         # local file not found
         rm(string(pwd(), "/", "caosdbfilefortests.txt"))
@@ -191,21 +190,16 @@ using CaosDB
     @testset "Property values and datatypes" begin
         @testset "Entity properties" begin
             int_prop =
-                CaosDB.Entity.create_property_entity(name = "IntProp", datatype = "INTEGER")
-            double_prop = CaosDB.Entity.create_property_entity(
-                name = "DoubleProp",
-                datatype = "DOUBLE",
-            )
-            bool_prop = CaosDB.Entity.create_property_entity(
-                name = "BoolProp",
-                datatype = "BOOLEAN",
-            )
+                CaosDB.Entity.create_property_entity(name = "IntProp", datatype = INTEGER)
+            double_prop =
+                CaosDB.Entity.create_property_entity(name = "DoubleProp", datatype = DOUBLE)
+            bool_prop =
+                CaosDB.Entity.create_property_entity(name = "BoolProp", datatype = BOOLEAN)
             string_prop =
-                CaosDB.Entity.create_property_entity(name = "StringProp", datatype = "TEXT")
+                CaosDB.Entity.create_property_entity(name = "StringProp", datatype = TEXT)
             ref_prop = CaosDB.Entity.create_property_entity(
                 name = "RefProp",
                 datatype = "MyRefType",
-                is_reference = true,
             )
             CaosDB.Entity.set_value(int_prop, 123)
             CaosDB.Entity.set_value(double_prop, 10.246)
@@ -222,38 +216,37 @@ using CaosDB
             @test isa(CaosDB.Entity.get_value(bool_prop), Bool)
             @test isa(CaosDB.Entity.get_value(string_prop), String)
             @test isa(CaosDB.Entity.get_value(ref_prop), String)
-            @test CaosDB.Entity.get_datatype(int_prop) == ("INTEGER", false, false)
-            @test CaosDB.Entity.get_datatype(double_prop) == ("DOUBLE", false, false)
-            @test CaosDB.Entity.get_datatype(bool_prop) == ("BOOLEAN", false, false)
-            @test CaosDB.Entity.get_datatype(string_prop) == ("TEXT", false, false)
-            @test CaosDB.Entity.get_datatype(ref_prop) == ("MyRefType", true, false)
+            @test CaosDB.Entity.get_datatype(int_prop) == (INTEGER, nothing)
+            @test CaosDB.Entity.get_datatype(double_prop) == (DOUBLE, nothing)
+            @test CaosDB.Entity.get_datatype(bool_prop) == (BOOLEAN, nothing)
+            @test CaosDB.Entity.get_datatype(string_prop) == (TEXT, nothing)
+            @test CaosDB.Entity.get_datatype(ref_prop) == ("MyRefType", nothing)
 
             """ Test lists """
             int_list_prop = CaosDB.Entity.create_property_entity(
                 name = "IntProp",
-                datatype = "INTEGER",
-                is_list = true,
+                datatype = INTEGER,
+                collection = LIST,
             )
             double_list_prop = CaosDB.Entity.create_property_entity(
                 name = "DoubleProp",
-                datatype = "DOUBLE",
-                is_list = true,
+                datatype = DOUBLE,
+                collection = LIST,
             )
             bool_list_prop = CaosDB.Entity.create_property_entity(
                 name = "BoolProp",
-                datatype = "BOOLEAN",
-                is_list = true,
+                datatype = BOOLEAN,
+                collection = LIST,
             )
             string_list_prop = CaosDB.Entity.create_property_entity(
                 name = "StringProp",
-                datatype = "TEXT",
-                is_list = true,
+                datatype = TEXT,
+                collection = LIST,
             )
             ref_list_prop = CaosDB.Entity.create_property_entity(
                 name = "RefListProp",
                 datatype = "MyRefType",
-                is_list = true,
-                is_reference = true,
+                collection = LIST,
             )
             CaosDB.Entity.set_value(int_list_prop, [123, 456])
             CaosDB.Entity.set_value(double_list_prop, [10.246, 3.14])
@@ -270,25 +263,39 @@ using CaosDB
             @test isa(CaosDB.Entity.get_value(bool_list_prop), Vector{Bool})
             @test isa(CaosDB.Entity.get_value(string_list_prop), Vector{String})
             @test isa(CaosDB.Entity.get_value(ref_list_prop), Vector{String})
-            @test CaosDB.Entity.get_datatype(int_list_prop) == ("INTEGER", false, true)
-            @test CaosDB.Entity.get_datatype(double_list_prop) == ("DOUBLE", false, true)
-            @test CaosDB.Entity.get_datatype(bool_list_prop) == ("BOOLEAN", false, true)
-            @test CaosDB.Entity.get_datatype(string_list_prop) == ("TEXT", false, true)
-            @test CaosDB.Entity.get_datatype(ref_list_prop) == ("MyRefType", true, true)
+            @test CaosDB.Entity.get_datatype(int_list_prop) == (INTEGER, LIST)
+            @test CaosDB.Entity.get_datatype(double_list_prop) == (DOUBLE, LIST)
+            @test CaosDB.Entity.get_datatype(bool_list_prop) == (BOOLEAN, LIST)
+            @test CaosDB.Entity.get_datatype(string_list_prop) == (TEXT, LIST)
+            @test CaosDB.Entity.get_datatype(ref_list_prop) == ("MyRefType", LIST)
+
+            # Check copying of values and datatypes
+            copied_prop = CaosDB.Entity.create_property_entity(name = "CopiedProp")
+            set_datatype(copied_prop, get_datatype(int_list_prop))
+            set_value(copied_prop, get_value(int_list_prop))
+            @test get_datatype(copied_prop) == get_datatype(int_list_prop)
+            @test get_value(copied_prop) == get_value(int_list_prop)
+            set_datatype(copied_prop, get_datatype(double_prop))
+            set_value(copied_prop, get_value(double_prop))
+            @test get_datatype(copied_prop) == get_datatype(double_prop)
+            @test get_value(copied_prop) == get_value(double_prop)
+            set_datatype(copied_prop, get_datatype(ref_list_prop))
+            set_value(copied_prop, get_value(ref_list_prop))
+            @test get_datatype(copied_prop) == get_datatype(ref_list_prop)
+            # TODO(fspreck) Fix this. Garbage collection?
+            @test_broken get_value(copied_prop) == get_value(ref_list_prop)
+            
         end
+
         @testset "Property properties" begin
-            int_prop = CaosDB.Entity.create_property(name = "IntProp", datatype = "INTEGER")
+            int_prop = CaosDB.Entity.create_property(name = "IntProp", datatype = INTEGER)
             double_prop =
-                CaosDB.Entity.create_property(name = "DoubleProp", datatype = "DOUBLE")
-            bool_prop =
-                CaosDB.Entity.create_property(name = "BoolProp", datatype = "BOOLEAN")
+                CaosDB.Entity.create_property(name = "DoubleProp", datatype = DOUBLE)
+            bool_prop = CaosDB.Entity.create_property(name = "BoolProp", datatype = BOOLEAN)
             string_prop =
-                CaosDB.Entity.create_property(name = "StringProp", datatype = "TEXT")
-            ref_prop = CaosDB.Entity.create_property(
-                name = "RefProp",
-                datatype = "MyRefType",
-                is_reference = true,
-            )
+                CaosDB.Entity.create_property(name = "StringProp", datatype = TEXT)
+            ref_prop =
+                CaosDB.Entity.create_property(name = "RefProp", datatype = "MyRefType")
             CaosDB.Entity.set_value(int_prop, 123)
             CaosDB.Entity.set_value(double_prop, 10.246)
             CaosDB.Entity.set_value(bool_prop, true)
@@ -304,38 +311,37 @@ using CaosDB
             @test isa(CaosDB.Entity.get_value(bool_prop), Bool)
             @test isa(CaosDB.Entity.get_value(string_prop), String)
             @test isa(CaosDB.Entity.get_value(ref_prop), String)
-            @test CaosDB.Entity.get_datatype(int_prop) == ("INTEGER", false, false)
-            @test CaosDB.Entity.get_datatype(double_prop) == ("DOUBLE", false, false)
-            @test CaosDB.Entity.get_datatype(bool_prop) == ("BOOLEAN", false, false)
-            @test CaosDB.Entity.get_datatype(string_prop) == ("TEXT", false, false)
-            @test CaosDB.Entity.get_datatype(ref_prop) == ("MyRefType", true, false)
+            @test CaosDB.Entity.get_datatype(int_prop) == (INTEGER, nothing)
+            @test CaosDB.Entity.get_datatype(double_prop) == (DOUBLE, nothing)
+            @test CaosDB.Entity.get_datatype(bool_prop) == (BOOLEAN, nothing)
+            @test CaosDB.Entity.get_datatype(string_prop) == (TEXT, nothing)
+            @test CaosDB.Entity.get_datatype(ref_prop) == ("MyRefType", nothing)
 
             """ Test lists """
             int_list_prop = CaosDB.Entity.create_property(
                 name = "IntProp",
-                datatype = "INTEGER",
-                is_list = true,
+                datatype = INTEGER,
+                collection = LIST,
             )
             double_list_prop = CaosDB.Entity.create_property(
                 name = "DoubleProp",
-                datatype = "DOUBLE",
-                is_list = true,
+                datatype = DOUBLE,
+                collection = LIST,
             )
             bool_list_prop = CaosDB.Entity.create_property(
                 name = "BoolProp",
-                datatype = "BOOLEAN",
-                is_list = true,
+                datatype = BOOLEAN,
+                collection = LIST,
             )
             string_list_prop = CaosDB.Entity.create_property(
                 name = "StringProp",
-                datatype = "TEXT",
-                is_list = true,
+                datatype = TEXT,
+                collection = LIST,
             )
             ref_list_prop = CaosDB.Entity.create_property(
                 name = "RefListProp",
                 datatype = "MyRefType",
-                is_list = true,
-                is_reference = true,
+                collection = LIST,
             )
             CaosDB.Entity.set_value(int_list_prop, [123, 456])
             CaosDB.Entity.set_value(double_list_prop, [10.246, 3.14])
@@ -352,11 +358,11 @@ using CaosDB
             @test isa(CaosDB.Entity.get_value(bool_list_prop), Vector{Bool})
             @test isa(CaosDB.Entity.get_value(string_list_prop), Vector{String})
             @test isa(CaosDB.Entity.get_value(ref_list_prop), Vector{String})
-            @test CaosDB.Entity.get_datatype(int_list_prop) == ("INTEGER", false, true)
-            @test CaosDB.Entity.get_datatype(double_list_prop) == ("DOUBLE", false, true)
-            @test CaosDB.Entity.get_datatype(bool_list_prop) == ("BOOLEAN", false, true)
-            @test CaosDB.Entity.get_datatype(string_list_prop) == ("TEXT", false, true)
-            @test CaosDB.Entity.get_datatype(ref_list_prop) == ("MyRefType", true, true)
+            @test CaosDB.Entity.get_datatype(int_list_prop) == (INTEGER, LIST)
+            @test CaosDB.Entity.get_datatype(double_list_prop) == (DOUBLE, LIST)
+            @test CaosDB.Entity.get_datatype(bool_list_prop) == (BOOLEAN, LIST)
+            @test CaosDB.Entity.get_datatype(string_list_prop) == (TEXT, LIST)
+            @test CaosDB.Entity.get_datatype(ref_list_prop) == ("MyRefType", LIST)
         end
     end
 end