diff --git a/test/test_select.cpp b/test/test_select.cpp
index e15f83a7e6c1460d40c299ab2d19879f604420dd..3ebf4357274acf87b478c84badc0b1aed32c2400 100644
--- a/test/test_select.cpp
+++ b/test/test_select.cpp
@@ -19,31 +19,43 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  */
-#include "caosdb/connection.h"      // for Connection, ConnectionManager
-#include "caosdb/data_type.h"                     // for AtomicDataType
-#include "caosdb/transaction.h"     // for Transaction, ResultTable
-#include "caosdb/value.h"           // for Value
-#include <gtest/gtest-message.h>    // for Message
-#include <gtest/gtest-test-part.h>  // for SuiteApiResolver, TestFactoryImpl
-#include <gtest/gtest_pred_impl.h>  // for Test, TestInfo, EXPECT_EQ, TEST
-#include <memory>                   // for allocator, unique_ptr, __shared_p...
-                                    //
+#include "caosdb/connection.h"     // for Connection, ConnectionManager
+#include "caosdb/data_type.h"      // for AtomicDataType
+#include "caosdb/entity.h"         // for Entity, Property, Role, Parent
+#include "caosdb/result_set.h"     // for Entity, ResultSet, ResultSet::ite...
+#include "caosdb/result_table.h"   // for ResultTable::HeaderIterator, Resu...
+#include "caosdb/transaction.h"    // for Transaction, ResultTable
+#include "caosdb/value.h"          // for Value
+#include <gtest/gtest-message.h>   // for Message
+#include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestFactoryImpl
+#include <gtest/gtest_pred_impl.h> // for Test, TestInfo, EXPECT_EQ, TEST
+#include <iostream>                // for operator<<, basic_ostream::operat...
+#include <memory>                  // for allocator, unique_ptr, __shared_p...
+#include <string>                  // for string
+
 namespace caosdb::transaction {
 using caosdb::entity::AtomicDataType;
-using caosdb::entity::Role;
-using caosdb::entity::Property;
-using caosdb::entity::Parent;
 using caosdb::entity::Entity;
+using caosdb::entity::Parent;
+using caosdb::entity::Property;
+using caosdb::entity::Role;
 using caosdb::entity::Value;
 
 class test_select : public ::testing::Test {
 public:
+  static void InsertEntity(Entity *entity) {
+    const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+    auto insert_transaction(connection->CreateTransaction());
+    insert_transaction->InsertEntity(entity);
+    insert_transaction->Execute();
+  }
 
   static void DeleteEntities() {
     // delete all entities
     const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
     auto query_transaction(connection->CreateTransaction());
-    query_transaction->Query("FIND Test*");
+    query_transaction->Query("FIND Entity");
+    // query_transaction->Query("FIND Test*");
     query_transaction->Execute();
     if (query_transaction->GetResultSet().size() > 0) {
       std::cout << "Cleanup: Deleting " << query_transaction->GetResultSet().size() << " entities."
@@ -56,22 +68,24 @@ public:
     }
   }
 
-  static auto CreateTestProp() -> Entity {
+  static auto CreateTestProp(const std::string &name, AtomicDataType data_type) -> Entity {
     Entity entity;
     entity.SetRole(Role::PROPERTY);
-    entity.SetName("TestProp");
-    entity.SetDataType(AtomicDataType::TEXT);
+    entity.SetName(name);
+    entity.SetDescription("Prop Description " + name);
+    entity.SetDataType(data_type);
     return entity;
   }
 
   static auto CreateTestRT() -> Entity {
     Entity entity;
     entity.SetRole(Role::RECORD_TYPE);
+    entity.SetDescription("RT Description");
     entity.SetName("TestRT");
     return entity;
   }
 
-  static auto CreateRecord(const std::string &property_name, Value value) -> Entity {
+  static auto CreateRecord(const std::string &property_name, const Value &value) -> Entity {
     Entity entity;
     entity.SetRole(Role::RECORD);
     Parent parent;
@@ -82,6 +96,11 @@ public:
     property.SetValue(value);
     entity.AppendProperty(property);
 
+    Property dummyProperty;
+    dummyProperty.SetName("TestProp2");
+    dummyProperty.SetValue("dummy value");
+    entity.AppendProperty(dummyProperty);
+
     return entity;
   }
 
@@ -93,19 +112,50 @@ protected:
 
     const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
     auto insert_transaction(connection->CreateTransaction());
-    insert_transaction->InsertEntity(CreateTestRT());
-    insert_transaction->InsertEntity(CreateTestProp());
+    auto rt = CreateTestRT();
+    insert_transaction->InsertEntity(&rt);
+    auto p = CreateTestProp("TestProp", AtomicDataType::TEXT);
+    insert_transaction->InsertEntity(&p);
+    p = CreateTestProp("TestProp2", AtomicDataType::TEXT);
+    insert_transaction->InsertEntity(&p);
+    p = CreateTestProp("TestPropDouble", AtomicDataType::DOUBLE);
+    p.SetUnit("m");
+    insert_transaction->InsertEntity(&p);
+    p = CreateTestProp("TestPropInt", AtomicDataType::INTEGER);
+    p.SetUnit("m");
+    insert_transaction->InsertEntity(&p);
+    p = CreateTestProp("TestPropBool", AtomicDataType::BOOLEAN);
+    insert_transaction->InsertEntity(&p);
     insert_transaction->Execute();
   }
 
-  void TearDown() override {
-    DeleteEntities();
-  }
+  void TearDown() override { DeleteEntities(); }
 };
 
 /*
  * Test select query on empty database.
  */
+TEST_F(test_select, test_select_empy) {
+  test_select::DeleteEntities();
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT name FROM RecordType TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "name");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 0);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("name").GetAsString(), "bla"); // should never be executed
+  }
+}
+
+/*
+ * Test select name query on record type.
+ */
 TEST_F(test_select, test_select_name) {
   const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
 
@@ -113,13 +163,152 @@ TEST_F(test_select, test_select_name) {
   query_transaction->Query("SELECT name FROM RecordType TestRT");
   query_transaction->Execute();
   EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
-  for(const auto &column : query_transaction->GetResultTable().GetHeader()) {
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
     EXPECT_EQ(column.GetName(), "name");
   }
 
   EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
-  for(const auto &row : query_transaction->GetResultTable().GetRows()) {
-    EXPECT_EQ(row.GetValue("name").GetAsString(), "bla");
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("name").GetAsString(), "TestRT");
+  }
+}
+
+/*
+ * Test select description query on record type.
+ */
+TEST_F(test_select, test_select_description) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT description FROM RecordType TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "description");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("description").GetAsString(), "RT Description");
+  }
+}
+
+/*
+ * Test select TestProp query on record.
+ */
+TEST_F(test_select, test_select_testprop) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+  auto entity = test_select::CreateRecord("TestProp", Value("val1"));
+  test_select::InsertEntity(&entity);
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestProp FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestProp");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("TestProp").GetAsString(), "val1");
+  }
+}
+
+/*
+ * Test select double value query on record.
+ */
+TEST_F(test_select, test_select_double) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+  auto entity = test_select::CreateRecord("TestPropDouble", Value(2.123));
+  test_select::InsertEntity(&entity);
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestPropDouble FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestPropDouble");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_TRUE(row.GetValue("TestPropDouble").IsDouble());
+    EXPECT_EQ(row.GetValue("TestPropDouble").GetAsDouble(), 2.123);
+  }
+}
+
+/*
+ * Test select unit value query on record.
+ */
+TEST_F(test_select, test_select_unit) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+  auto entity = test_select::CreateRecord("TestPropDouble", Value(2.123));
+  test_select::InsertEntity(&entity);
+
+  auto check(connection->CreateTransaction());
+  check->Query("FIND Record TestRT");
+  check->Execute();
+  std::cout << check->GetResultSet().at(0).ToString() << std::endl;
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestPropDouble.unit FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestPropDouble.unit");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_FALSE(row.GetValue("TestPropDouble.unit").IsNull());
+    EXPECT_EQ(row.GetValue("TestPropDouble.unit").GetAsString(), "m");
+  }
+}
+
+/*
+ * Test select int value query on record.
+ */
+TEST_F(test_select, test_select_int) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+  auto entity = test_select::CreateRecord("TestPropInt", Value(1234));
+  test_select::InsertEntity(&entity);
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestPropInt FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestPropInt");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_TRUE(row.GetValue("TestPropInt").IsInt64());
+    EXPECT_EQ(row.GetValue("TestPropInt").GetAsInt64(), 1234);
+  }
+}
+
+/*
+ * Test select boolean value query on record.
+ */
+TEST_F(test_select, test_select_boolean) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+  auto entity = test_select::CreateRecord("TestPropBool", Value(true));
+  test_select::InsertEntity(&entity);
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestPropBool FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestPropBool");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_TRUE(row.GetValue("TestPropBool").IsBool());
+    EXPECT_EQ(row.GetValue("TestPropBool").GetAsBool(), true);
   }
 }