diff --git a/include/ccaosdb.h b/include/ccaosdb.h
index 2c37417a6706717c98173d3cc145d5b8d3337210..21ba884727a6c24e810cb568ee68e2cf9e104ff2 100644
--- a/include/ccaosdb.h
+++ b/include/ccaosdb.h
@@ -264,8 +264,6 @@ int caosdb_connection_connection_manager_get_connection(caosdb_connection_connec
  * ENTITY STUFF AND TRANSACTIONS
  ****************************************************************************/
 
-// TODO(fspreck) implementations needed, and probably these declarations are
-// not sufficient yet.
 typedef struct caosdb_transaction_transaction {
   void *wrapped_transaction;
   bool _deletable = false;
diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp
index 0a48c7b0c7fce20dc85c5666f84b56c922b4d364..48ad9615566b2835502b78a5ba7f73ab2e15d98f 100644
--- a/test/test_ccaosdb.cpp
+++ b/test/test_ccaosdb.cpp
@@ -423,8 +423,10 @@ TEST_F(test_ccaosdb, test_entity) {
   caosdb_entity_entity_get_description(&entity, &out);
   EXPECT_EQ(strcmp(out, "The length of an object"), 0);
 
+  caosdb_entity_datatype in_type;
+  caosdb_entity_create_atomic_datatype(&in_type, "DOUBLE");
+  caosdb_entity_entity_set_datatype(&entity, &in_type);
   // TODO(fspreck)
-  // caosdb_entity_entity_set_datatype(&entity, "DOUBLE", false, false);
   // bool is_list[] = {false}; // NOLINT
   // bool is_ref[] = {false};  // NOLINT
   // caosdb_entity_entity_get_datatype(&entity, &out, is_ref, is_list);
@@ -432,7 +434,12 @@ TEST_F(test_ccaosdb, test_entity) {
   // EXPECT_FALSE(*is_list);
   // EXPECT_FALSE(*is_ref);
 
-  // caosdb_entity_entity_set_datatype(&entity, "Person", true, true);
+  // clear to re-use
+  return_code = caosdb_entity_delete_datatype(&in_type);
+  EXPECT_EQ(return_code, 0);
+  caosdb_entity_create_reference_list_datatype(&in_type, "Person");
+  caosdb_entity_entity_set_datatype(&entity, &in_type);
+  // TODO(fspreck)
   // caosdb_entity_entity_get_datatype(&entity, &out, is_ref, is_list);
   // EXPECT_EQ(strcmp(out, "Person"), 0);
   // EXPECT_TRUE(*is_list);
@@ -442,9 +449,12 @@ TEST_F(test_ccaosdb, test_entity) {
   caosdb_entity_entity_get_unit(&entity, &out);
   EXPECT_EQ(strcmp(out, "m"), 0);
 
+  caosdb_entity_value in_value;
+  return_code = caosdb_entity_create_double_value(&in_value, 5.0);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_entity_set_value(&entity, &in_value);
+  EXPECT_EQ(return_code, 0);
   // TODO(fspreck)
-  // return_code = caosdb_entity_entity_set_double_value(&entity, 5.0);
-  // EXPECT_EQ(return_code, 0);
   // double value[] = {0.0}; // NOLINT
   // return_code = caosdb_entity_entity_get_double_value(&entity, value);
   // EXPECT_EQ(return_code, 0);
@@ -452,6 +462,10 @@ TEST_F(test_ccaosdb, test_entity) {
 
   return_code = caosdb_entity_delete_entity(&entity);
   EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_datatype(&in_type);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_value(&in_value);
+  EXPECT_EQ(return_code, 0);
 }
 
 TEST_F(test_ccaosdb, test_parent) {
@@ -483,12 +497,14 @@ TEST_F(test_ccaosdb, test_property) {
   caosdb_entity_property_set_id(&property, "some_id");
   caosdb_entity_property_set_name(&property, "some_name");
 
-  // TODO(fspreck)
-  // caosdb_entity_property_set_datatype(&property, "TEXT", false, false);
+  caosdb_entity_datatype in_type;
+  caosdb_entity_create_atomic_datatype(&in_type, "TEXT");
+  caosdb_entity_property_set_datatype(&property, &in_type);
   caosdb_entity_property_set_importance(&property, "FIX");
   caosdb_entity_property_set_unit(&property, "some_unit");
-  // TODO(fspreck)
-  // caosdb_entity_property_set_string_value(&property, "some_value");
+  caosdb_entity_value in_value;
+  caosdb_entity_create_string_value(&in_value, "some_value");
+  caosdb_entity_property_set_value(&property, &in_value);
 
   char *out = nullptr; // NOLINT
   caosdb_entity_property_get_id(&property, &out);
@@ -517,121 +533,154 @@ TEST_F(test_ccaosdb, test_property) {
 
   return_code = caosdb_entity_delete_property(&property);
   EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_datatype(&in_type);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_value(&in_value);
+  EXPECT_EQ(return_code, 0);
 }
 
 // TODO(fspreck)
-// TEST_F(test_ccaosdb, test_string_list_property) {
-
-//   caosdb_entity_property property;
-//   int return_code(caosdb_entity_create_property(&property));
-//   EXPECT_EQ(return_code, 0);
-
-//   return_code = caosdb_entity_property_set_datatype(&property, "TEXT", false, true);
-//   EXPECT_EQ(return_code, 0);
-
-//   const char *value_list[] = {"val0", "val1", "val2"}; // NOLINT
-//   return_code = caosdb_entity_property_set_string_list_value(&property, value_list, 3);
-//   EXPECT_EQ(return_code, 0);
-
-//   char *out = nullptr;      // NOLINT
-//   bool is_ref[] = {false};  // NOLINT
-//   bool is_list[] = {false}; // NOLINT
-//   return_code = caosdb_entity_property_get_datatype(&property, &out, is_ref, is_list);
-//   EXPECT_EQ(return_code, 0);
-//   EXPECT_EQ(strcmp(out, "TEXT"), 0);
-//   EXPECT_FALSE(*is_ref);
-//   EXPECT_TRUE(*is_list);
-
-//   int length = -1; // NOLINT
-//   return_code = caosdb_entity_property_get_value_list_length(&property, &length);
-//   EXPECT_EQ(return_code, 0);
-//   EXPECT_EQ(length, 3);
-
-//   for (int i = 0; i < length; i++) {
-//     return_code = caosdb_entity_property_get_string_list_value_at(&property, &out, i);
-//     EXPECT_EQ(return_code, 0);
-//     EXPECT_EQ(strcmp(value_list[i], out), 0); // NOLINT
-//   }
-
-//   return_code = caosdb_entity_delete_property(&property);
-//   EXPECT_EQ(return_code, 0);
-// }
-
-// TEST_F(test_ccaosdb, test_int_list_property) {
-
-//   caosdb_entity_property property;
-//   int return_code(caosdb_entity_create_property(&property));
-//   EXPECT_EQ(return_code, 0);
-
-//   return_code = caosdb_entity_property_set_datatype(&property, "INTEGER", false, true);
-//   EXPECT_EQ(return_code, 0);
-
-//   const int64_t value_list[] = {1, 2, 3}; // NOLINT
-//   return_code = caosdb_entity_property_set_int_list_value(&property, &(value_list)[0], 3);
-//   EXPECT_EQ(return_code, 0);
-
-//   char *dt_out = nullptr;   // NOLINT
-//   bool is_ref[] = {false};  // NOLINT
-//   bool is_list[] = {false}; // NOLINT
-//   return_code = caosdb_entity_property_get_datatype(&property, &dt_out, is_ref, is_list);
-//   EXPECT_EQ(return_code, 0);
-//   EXPECT_STREQ(dt_out, "INTEGER");
-//   EXPECT_FALSE(*is_ref);
-//   EXPECT_TRUE(*is_list);
-
-//   int length = -1; // NOLINT
-//   return_code = caosdb_entity_property_get_value_list_length(&property, &length);
-//   EXPECT_EQ(return_code, 0);
-//   EXPECT_EQ(length, 3);
-
-//   for (int i = 0; i < length; i++) {
-//     int64_t out = -1;
-//     return_code = caosdb_entity_property_get_int_list_value_at(&property, &out, i);
-//     EXPECT_EQ(return_code, 0);
-//     EXPECT_EQ(value_list[i], out); // NOLINT
-//   }
-
-//   return_code = caosdb_entity_delete_property(&property);
-//   EXPECT_EQ(return_code, 0);
-// }
-
-// TEST_F(test_ccaosdb, test_bool_list_property) {
-
-//   caosdb_entity_property property;
-//   int return_code(caosdb_entity_create_property(&property));
-//   EXPECT_EQ(return_code, 0);
-
-//   return_code = caosdb_entity_property_set_datatype(&property, "BOOLEAN", false, true);
-//   EXPECT_EQ(return_code, 0);
-
-//   const bool value_list[] = {true, true, false}; // NOLINT
-//   return_code = caosdb_entity_property_set_boolean_list_value(&property, &(value_list)[0], 3);
-//   EXPECT_EQ(return_code, 0);
-
-//   char *dt_out = nullptr;   // NOLINT
-//   bool is_ref[] = {false};  // NOLINT
-//   bool is_list[] = {false}; // NOLINT
-//   return_code = caosdb_entity_property_get_datatype(&property, &dt_out, is_ref, is_list);
-//   EXPECT_EQ(return_code, 0);
-//   EXPECT_STREQ(dt_out, "BOOLEAN");
-//   EXPECT_FALSE(*is_ref);
-//   EXPECT_TRUE(*is_list);
-
-//   int length = -1; // NOLINT
-//   return_code = caosdb_entity_property_get_value_list_length(&property, &length);
-//   EXPECT_EQ(return_code, 0);
-//   EXPECT_EQ(length, 3);
-
-//   for (int i = 0; i < length; i++) {
-//     bool out = true;
-//     return_code = caosdb_entity_property_get_boolean_list_value_at(&property, &out, i);
-//     EXPECT_EQ(return_code, 0);
-//     EXPECT_EQ(value_list[i], out); // NOLINT
-//   }
-
-//   return_code = caosdb_entity_delete_property(&property);
-//   EXPECT_EQ(return_code, 0);
-// }
+TEST_F(test_ccaosdb, test_string_list_property) {
+
+  caosdb_entity_property property;
+  int return_code(caosdb_entity_create_property(&property));
+  EXPECT_EQ(return_code, 0);
+
+  caosdb_entity_datatype in_type;
+  return_code = caosdb_entity_create_atomic_list_datatype(&in_type, "TEXT");
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_property_set_datatype(&property, &in_type);
+  EXPECT_EQ(return_code, 0);
+
+  caosdb_entity_value in_value;
+  const char *value_list[] = {"val0", "val1", "val2"}; // NOLINT
+  return_code = caosdb_entity_create_string_vector_value(&in_value, value_list, 3);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_property_set_value(&property, &in_value);
+  EXPECT_EQ(return_code, 0);
+
+  // TODO(fspreck)
+  // char *out = nullptr;      // NOLINT
+  // bool is_ref[] = {false};  // NOLINT
+  // bool is_list[] = {false}; // NOLINT
+  // return_code = caosdb_entity_property_get_datatype(&property, &out, is_ref, is_list);
+  // EXPECT_EQ(return_code, 0);
+  // EXPECT_EQ(strcmp(out, "TEXT"), 0);
+  // EXPECT_FALSE(*is_ref);
+  // EXPECT_TRUE(*is_list);
+
+  // int length = -1; // NOLINT
+  // return_code = caosdb_entity_property_get_value_list_length(&property, &length);
+  // EXPECT_EQ(return_code, 0);
+  // EXPECT_EQ(length, 3);
+
+  // for (int i = 0; i < length; i++) {
+  //   return_code = caosdb_entity_property_get_string_list_value_at(&property, &out, i);
+  //   EXPECT_EQ(return_code, 0);
+  //   EXPECT_EQ(strcmp(value_list[i], out), 0); // NOLINT
+  // }
+
+  return_code = caosdb_entity_delete_property(&property);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_datatype(&in_type);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_value(&in_value);
+  EXPECT_EQ(return_code, 0);
+}
+
+TEST_F(test_ccaosdb, test_int_list_property) {
+
+  caosdb_entity_property property;
+  int return_code(caosdb_entity_create_property(&property));
+  EXPECT_EQ(return_code, 0);
+
+  caosdb_entity_datatype in_type;
+  caosdb_entity_create_atomic_list_datatype(&in_type, "INTEGER");
+  return_code = caosdb_entity_property_set_datatype(&property, &in_type);
+  EXPECT_EQ(return_code, 0);
+
+  const int64_t value_list[] = {1, 2, 3}; // NOLINT
+  caosdb_entity_value in_value;
+  caosdb_entity_create_int_vector_value(&in_value, value_list, 3);
+  return_code = caosdb_entity_property_set_value(&property, &in_value);
+  EXPECT_EQ(return_code, 0);
+
+  // TODO(fspreck)
+  // char *dt_out = nullptr;   // NOLINT
+  // bool is_ref[] = {false};  // NOLINT
+  // bool is_list[] = {false}; // NOLINT
+  // return_code = caosdb_entity_property_get_datatype(&property, &dt_out, is_ref, is_list);
+  // EXPECT_EQ(return_code, 0);
+  // EXPECT_STREQ(dt_out, "INTEGER");
+  // EXPECT_FALSE(*is_ref);
+  // EXPECT_TRUE(*is_list);
+
+  // int length = -1; // NOLINT
+  // return_code = caosdb_entity_property_get_value_list_length(&property, &length);
+  // EXPECT_EQ(return_code, 0);
+  // EXPECT_EQ(length, 3);
+
+  // for (int i = 0; i < length; i++) {
+  //   int64_t out = -1;
+  //   return_code = caosdb_entity_property_get_int_list_value_at(&property, &out, i);
+  //   EXPECT_EQ(return_code, 0);
+  //   EXPECT_EQ(value_list[i], out); // NOLINT
+  // }
+
+  return_code = caosdb_entity_delete_property(&property);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_datatype(&in_type);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_value(&in_value);
+  EXPECT_EQ(return_code, 0);
+}
+
+TEST_F(test_ccaosdb, test_bool_list_property) {
+
+  caosdb_entity_property property;
+  int return_code(caosdb_entity_create_property(&property));
+  EXPECT_EQ(return_code, 0);
+
+  caosdb_entity_datatype in_type;
+  caosdb_entity_create_atomic_list_datatype(&in_type, "BOOLEAN");
+  return_code = caosdb_entity_property_set_datatype(&property, &in_type);
+  EXPECT_EQ(return_code, 0);
+
+  const bool value_list[] = {true, true, false}; // NOLINT
+  caosdb_entity_value in_value;
+  caosdb_entity_create_bool_vector_value(&in_value, value_list, 3);
+  return_code = caosdb_entity_property_set_value(&property, &in_value);
+  EXPECT_EQ(return_code, 0);
+
+  // TODO(fspreck)
+  // char *dt_out = nullptr;   // NOLINT
+  // bool is_ref[] = {false};  // NOLINT
+  // bool is_list[] = {false}; // NOLINT
+  // return_code = caosdb_entity_property_get_datatype(&property, &dt_out, is_ref, is_list);
+  // EXPECT_EQ(return_code, 0);
+  // EXPECT_STREQ(dt_out, "BOOLEAN");
+  // EXPECT_FALSE(*is_ref);
+  // EXPECT_TRUE(*is_list);
+
+  // int length = -1; // NOLINT
+  // return_code = caosdb_entity_property_get_value_list_length(&property, &length);
+  // EXPECT_EQ(return_code, 0);
+  // EXPECT_EQ(length, 3);
+
+  // for (int i = 0; i < length; i++) {
+  //   bool out = true;
+  //   return_code = caosdb_entity_property_get_boolean_list_value_at(&property, &out, i);
+  //   EXPECT_EQ(return_code, 0);
+  //   EXPECT_EQ(value_list[i], out); // NOLINT
+  // }
+
+  return_code = caosdb_entity_delete_property(&property);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_datatype(&in_type);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_value(&in_value);
+  EXPECT_EQ(return_code, 0);
+}
 
 TEST_F(test_ccaosdb, test_entity_with_parent_and_property) {
   caosdb_entity_parent input_parent;
@@ -648,9 +697,12 @@ TEST_F(test_ccaosdb, test_entity_with_parent_and_property) {
   caosdb_entity_property_set_id(&input_property, "property_id");
   caosdb_entity_property_set_name(&input_property, "property_name");
 
-  // TODO(fspreck)
-  // caosdb_entity_property_set_datatype(&input_property, "TEXT", false, false);
-  // caosdb_entity_property_set_string_value(&input_property, "property_value");
+  caosdb_entity_datatype in_type;
+  caosdb_entity_create_atomic_datatype(&in_type, "TEXT");
+  caosdb_entity_value in_value;
+  caosdb_entity_create_string_value(&in_value, "property_value");
+  caosdb_entity_property_set_datatype(&input_property, &in_type);
+  caosdb_entity_property_set_value(&input_property, &in_value);
 
   caosdb_entity_entity entity;
   return_code = caosdb_entity_create_entity(&entity);
@@ -724,6 +776,10 @@ TEST_F(test_ccaosdb, test_entity_with_parent_and_property) {
   EXPECT_EQ(return_code, 0);
   return_code = caosdb_entity_delete_entity(&entity);
   EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_datatype(&in_type);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_delete_value(&in_value);
+  EXPECT_EQ(return_code, 0);
 
   // This tests the `_deletable` flag. The wrapped cpp objects of
   // `output_parent` and `output_property` are owned by the entity, so