diff --git a/include/ccaosdb.h b/include/ccaosdb.h
index 91ca1fad2fe843e3ea8e8f4cd11cf901eb4b6247..61b86817532b77ccfd24ccb791b18cc31afc6faa 100644
--- a/include/ccaosdb.h
+++ b/include/ccaosdb.h
@@ -424,7 +424,14 @@ int caosdb_entity_value_is_string(caosdb_entity_value *value, bool *out);
 int caosdb_entity_value_is_double(caosdb_entity_value *value, bool *out);
 int caosdb_entity_value_is_integer(caosdb_entity_value *value, bool *out);
 int caosdb_entity_value_is_bool(caosdb_entity_value *value, bool *out);
-int caosdb_entity_value_is_list(caosdb_entity_value *value, bool *out);
+int caosdb_entity_value_is_vector(caosdb_entity_value *value, bool *out);
+int caosdb_entity_value_get_as_string(caosdb_entity_value *value, char **out);
+int caosdb_entity_value_get_as_double(caosdb_entity_value *value, double *out);
+int caosdb_entity_value_get_as_integer(caosdb_entity_value *value, int64_t *out);
+int caosdb_entity_value_get_as_bool(caosdb_entity_value *value, bool *out);
+int caosdb_entity_value_get_as_vector_size(caosdb_entity_value *value, int *out);
+int caosdb_entity_value_get_as_vector_at(caosdb_entity_value *value, caosdb_entity_value *out,
+                                         const int index);
 
 // CONSTRUCTORS AND DESTRUCTORS
 int caosdb_entity_create_entity(caosdb_entity_entity *out);
@@ -441,14 +448,14 @@ int caosdb_entity_create_int_value(caosdb_entity_value *out, const int64_t value
 int caosdb_entity_create_string_value(caosdb_entity_value *out, const char *value);
 int caosdb_entity_create_double_value(caosdb_entity_value *out, const double value);
 int caosdb_entity_create_bool_value(caosdb_entity_value *out, const bool value);
-int caosdb_entity_create_int_list_value(caosdb_entity_value *out, const int64_t *value,
-                                        const int length);
-int caosdb_entity_create_string_list_value(caosdb_entity_value *out, const char **value,
+int caosdb_entity_create_int_vector_value(caosdb_entity_value *out, const int64_t *value,
+                                          const int length);
+int caosdb_entity_create_string_vector_value(caosdb_entity_value *out, const char **value,
+                                             const int length);
+int caosdb_entity_create_double_vector_value(caosdb_entity_value *out, const double *value,
+                                             const int length);
+int caosdb_entity_create_bool_vector_value(caosdb_entity_value *out, const bool *value,
                                            const int length);
-int caosdb_entity_create_double_list_value(caosdb_entity_value *out, const double *value,
-                                           const int length);
-int caosdb_entity_create_bool_list_value(caosdb_entity_value *out, const bool *value,
-                                         const int length);
 int caosdb_entity_delete_value(caosdb_entity_value *out);
 
 // SETTERS FOR EVERYTHING THAT MAY BE SET
diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp
index cb0278f83791efbe9558bd512baa69388ba50bb7..8a7ae4131f513d257e3c0c1b69f975fde595f9dc 100644
--- a/src/ccaosdb.cpp
+++ b/src/ccaosdb.cpp
@@ -166,7 +166,7 @@ extern "C" {
 /**
  * Macro for list-value creators
  */
-#define CREATE_LIST_VALUE(fname, type, arg, assign)                                                \
+#define CREATE_VECTOR_VALUE(fname, type, arg, assign)                                              \
   ERROR_RETURN_CODE(                                                                               \
     GENERIC_ERROR,                                                                                 \
     int caosdb_entity_create_##fname(caosdb_entity_value *out, arg, const int length), {           \
@@ -182,6 +182,28 @@ extern "C" {
       return 0;                                                                                    \
     })
 
+/**
+ * Macro for value is-a functions
+ */
+#define VALUE_IS(fname, isfunction)                                                                \
+  ERROR_RETURN_CODE(GENERIC_ERROR,                                                                 \
+                    int caosdb_entity_value_is_##fname(caosdb_entity_value *value, bool *out), {   \
+                      auto *wrapped_value = WRAPPED_VALUE_CAST(value);                             \
+                      *out = wrapped_value->isfunction();                                          \
+                      return 0;                                                                    \
+                    })
+
+/**
+ * Macro for some value getters
+ */
+#define VALUE_GET_AS(fname, getfunction, arg)                                                      \
+  ERROR_RETURN_CODE(GENERIC_ERROR,                                                                 \
+                    int caosdb_entity_value_get_as_##fname(caosdb_entity_value *value, arg), {     \
+                      auto *wrapped_value = WRAPPED_VALUE_CAST(value);                             \
+                      *out = wrapped_value->getfunction();                                         \
+                      return 0;                                                                    \
+                    })
+
 int caosdb_constants_LIBCAOSDB_VERSION_MAJOR() { return caosdb::LIBCAOSDB_VERSION_MAJOR; }
 
 int caosdb_constants_LIBCAOSDB_VERSION_MINOR() { return caosdb::LIBCAOSDB_VERSION_MINOR; }
@@ -665,10 +687,10 @@ CREATE_VALUE(int_value, const int64_t value)
 CREATE_VALUE(string_value, const char *value)
 CREATE_VALUE(double_value, const double value)
 CREATE_VALUE(bool_value, const bool value)
-CREATE_LIST_VALUE(int_list_value, int64_t, const int64_t *value, value[i])
-CREATE_LIST_VALUE(string_list_value, std::string, const char **value, std::string(value[i]))
-CREATE_LIST_VALUE(double_list_value, double, const double *value, value[i])
-CREATE_LIST_VALUE(bool_list_value, bool, const bool *value, value[i])
+CREATE_VECTOR_VALUE(int_vector_value, int64_t, const int64_t *value, value[i])
+CREATE_VECTOR_VALUE(string_vector_value, std::string, const char **value, std::string(value[i]))
+CREATE_VECTOR_VALUE(double_vector_value, double, const double *value, value[i])
+CREATE_VECTOR_VALUE(bool_vector_value, bool, const bool *value, value[i])
 
 ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_entity_delete_value(caosdb_entity_value *out), {
   if (out->_deletable) {
@@ -937,6 +959,40 @@ ERROR_RETURN_CODE(
     return 0;
   })
 
+VALUE_IS(null, IsNull)
+VALUE_IS(string, IsString)
+VALUE_IS(double, IsDouble)
+VALUE_IS(integer, IsInt64)
+VALUE_IS(bool, IsBool)
+VALUE_IS(vector, IsVector)
+
+ERROR_RETURN_CODE(GENERIC_ERROR,
+                  int caosdb_entity_value_get_as_string(caosdb_entity_value *value, char **out), {
+                    auto *wrapped_value = WRAPPED_VALUE_CAST(value);
+                    auto *tmp =
+                      (char *)malloc(sizeof(char) * wrapped_value->GetAsString().length() + 1);
+                    strcpy(tmp, wrapped_value->GetAsString().c_str());
+                    delete[] * out;
+                    *out = tmp;
+                    return 0;
+                  })
+VALUE_GET_AS(double, GetAsDouble, double *out)
+VALUE_GET_AS(integer, GetAsInt64, int64_t *out)
+VALUE_GET_AS(bool, GetAsBool, bool *out)
+VALUE_GET_AS(vector_size, GetAsVector().size, int *out)
+ERROR_RETURN_CODE(GENERIC_ERROR,
+                  int caosdb_entity_value_get_as_vector_at(caosdb_entity_value *value,
+                                                           caosdb_entity_value *out,
+                                                           const int index),
+                  {
+                    if (out->_deletable) {
+                      return caosdb::StatusCode::EXTERN_C_ASSIGNMENT_ERROR;
+                    }
+                    auto *wrapped_value = WRAPPED_VALUE_CAST(value);
+                    out->wrapped_value = (void *)(&(wrapped_value->GetAsVector().at(index)));
+                    out->_deletable = false;
+                    return 0;
+                  })
 ERROR_RETURN_CODE(GENERIC_ERROR,
                   int caosdb_entity_entity_set_role(caosdb_entity_entity *entity, const char *role),
                   {
diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp
index 2b10c7ac17f1a89b1157b0a050252b8e447a5e57..4322c135db0024ca90aca52ed783523ba88dc104 100644
--- a/test/test_ccaosdb.cpp
+++ b/test/test_ccaosdb.cpp
@@ -145,27 +145,117 @@ TEST_F(test_ccaosdb, test_value) {
   return_code = caosdb_entity_create_double_value(&double_value, 2.7);
   EXPECT_EQ(return_code, 0);
 
-  caosdb_entity_value string_list_value;
+  caosdb_entity_value string_vector_value;
   const char *string_values[] = {"a", "b", "c"}; // NOLINT
-  return_code = caosdb_entity_create_string_list_value(&string_list_value, string_values, 3);
+  return_code = caosdb_entity_create_string_vector_value(&string_vector_value, string_values, 3);
   EXPECT_EQ(return_code, 0);
 
-  caosdb_entity_value int_list_value;
+  caosdb_entity_value int_vector_value;
   const int64_t int_values[] = {1, 2, 3}; // NOLINT
-  return_code = caosdb_entity_create_int_list_value(&int_list_value, int_values, 3);
+  return_code = caosdb_entity_create_int_vector_value(&int_vector_value, int_values, 3);
   EXPECT_EQ(return_code, 0);
 
-  caosdb_entity_value double_list_value;
+  caosdb_entity_value double_vector_value;
   const double double_values[] = {1.1, 2.2, 3.3}; // NOLINT
-  return_code = caosdb_entity_create_double_list_value(&double_list_value, double_values, 3);
+  return_code = caosdb_entity_create_double_vector_value(&double_vector_value, double_values, 3);
   EXPECT_EQ(return_code, 0);
 
-  caosdb_entity_value bool_list_value;
+  caosdb_entity_value bool_vector_value;
   const bool bool_values[] = {true, false, false}; // NOLINT
-  return_code = caosdb_entity_create_bool_list_value(&bool_list_value, bool_values, 3);
+  return_code = caosdb_entity_create_bool_vector_value(&bool_vector_value, bool_values, 3);
   EXPECT_EQ(return_code, 0);
 
-  // TODO(fspreck) Test is... and as... functions
+  // One thorough check, afterwards only the ones that should be true
+  bool is_a(false);
+  return_code = caosdb_entity_value_is_null(&string_value, &is_a);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_FALSE(is_a);
+  return_code = caosdb_entity_value_is_string(&string_value, &is_a);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_TRUE(is_a);
+  return_code = caosdb_entity_value_is_double(&string_value, &is_a);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_FALSE(is_a);
+  return_code = caosdb_entity_value_is_integer(&string_value, &is_a);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_FALSE(is_a);
+  return_code = caosdb_entity_value_is_bool(&string_value, &is_a);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_FALSE(is_a);
+  return_code = caosdb_entity_value_is_vector(&string_value, &is_a);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_FALSE(is_a);
+
+  caosdb_entity_value_is_integer(&int_value, &is_a);
+  EXPECT_TRUE(is_a);
+
+  caosdb_entity_value_is_bool(&bool_value, &is_a);
+  EXPECT_TRUE(is_a);
+
+  caosdb_entity_value_is_double(&double_value, &is_a);
+  EXPECT_TRUE(is_a);
+
+  caosdb_entity_value_is_vector(&string_vector_value, &is_a);
+  EXPECT_TRUE(is_a);
+
+  caosdb_entity_value_is_vector(&int_vector_value, &is_a);
+  EXPECT_TRUE(is_a);
+
+  caosdb_entity_value_is_vector(&double_vector_value, &is_a);
+  EXPECT_TRUE(is_a);
+
+  caosdb_entity_value_is_vector(&bool_vector_value, &is_a);
+  EXPECT_TRUE(is_a);
+
+  // TODO(fspreck) Test as... functions
+  char *out_string = nullptr; // NOLINT
+  return_code = caosdb_entity_value_get_as_string(&string_value, &out_string);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_STREQ(out_string, "value");
+
+  int64_t out_int(0);
+  return_code = caosdb_entity_value_get_as_integer(&int_value, &out_int);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(out_int, 27);
+
+  bool out_bool(false);
+  return_code = caosdb_entity_value_get_as_bool(&bool_value, &out_bool);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_TRUE(out_bool);
+
+  double out_double(0);
+  return_code = caosdb_entity_value_get_as_double(&double_value, &out_double);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(out_double, 2.7);
+
+  int list_length(0);
+  return_code = caosdb_entity_value_get_as_vector_size(&string_vector_value, &list_length);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(list_length, 3);
+  return_code = caosdb_entity_value_get_as_vector_size(&int_vector_value, &list_length);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(list_length, 3);
+  return_code = caosdb_entity_value_get_as_vector_size(&double_vector_value, &list_length);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(list_length, 3);
+  return_code = caosdb_entity_value_get_as_vector_size(&bool_vector_value, &list_length);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(list_length, 3);
+
+  // Only check for one, rest should be covered by this + scalar values
+  caosdb_entity_value out_val;
+  return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 0);
+  EXPECT_EQ(return_code, 0);
+  caosdb_entity_value_get_as_string(&out_val, &out_string);
+  EXPECT_STREQ(out_string, "a");
+  return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 1);
+  EXPECT_EQ(return_code, 0);
+  caosdb_entity_value_get_as_string(&out_val, &out_string);
+  EXPECT_STREQ(out_string, "b");
+  return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 2);
+  EXPECT_EQ(return_code, 0);
+  caosdb_entity_value_get_as_string(&out_val, &out_string);
+  EXPECT_STREQ(out_string, "c");
 
   return_code = caosdb_entity_delete_value(&string_value);
   EXPECT_EQ(return_code, 0);
@@ -175,13 +265,13 @@ TEST_F(test_ccaosdb, test_value) {
   EXPECT_EQ(return_code, 0);
   return_code = caosdb_entity_delete_value(&double_value);
   EXPECT_EQ(return_code, 0);
-  return_code = caosdb_entity_delete_value(&string_list_value);
+  return_code = caosdb_entity_delete_value(&string_vector_value);
   EXPECT_EQ(return_code, 0);
-  return_code = caosdb_entity_delete_value(&int_list_value);
+  return_code = caosdb_entity_delete_value(&int_vector_value);
   EXPECT_EQ(return_code, 0);
-  return_code = caosdb_entity_delete_value(&double_list_value);
+  return_code = caosdb_entity_delete_value(&double_vector_value);
   EXPECT_EQ(return_code, 0);
-  return_code = caosdb_entity_delete_value(&bool_list_value);
+  return_code = caosdb_entity_delete_value(&bool_vector_value);
   EXPECT_EQ(return_code, 0);
 }