diff --git a/include/connection.h b/include/connection.h
index a6046c8364e14e112a24990e8148d00287417b4a..5317099535f244f17cb45740dc3754ef9ca7ee86 100644
--- a/include/connection.h
+++ b/include/connection.h
@@ -39,6 +39,7 @@
 namespace caosdb {
 using caosdb::info::v1alpha1::GeneralInfoService;
 using caosdb::info::v1alpha1::VersionInfo;
+using grpc::ChannelCredentials;
 
 /**
  * @brief Configuration of the CaosDB connection.
@@ -53,23 +54,38 @@ public:
                          const CaosDBConnectionConfig &config)
     -> std::ostream &;
 
-  [[nodiscard]] auto getHost() -> std::string;
-
+  [[nodiscard]] auto virtual toString() const -> std::string = 0;
+  [[nodiscard]] auto getHost() const -> std::string;
   [[nodiscard]] auto getPort() const -> int;
+  [[nodiscard]] auto virtual getChannelCredentials() const -> std::shared_ptr<ChannelCredentials> = 0;
+};
+
+class InsecureCaosDBConnectionConfig: public CaosDBConnectionConfig {
+private:
+  std::shared_ptr<ChannelCredentials> credentials;
+public:
+  InsecureCaosDBConnectionConfig(const std::string &host, int port);
+  [[nodiscard]] auto toString() const -> std::string override;
+  [[nodiscard]] auto getChannelCredentials() const -> std::shared_ptr<ChannelCredentials> override;
+};
+
+class SslCaosDBConnectionConfig: public CaosDBConnectionConfig {
+  SslCaosDBConnectionConfig(const std::string &host, int port);
+  SslCaosDBConnectionConfig(const std::string &host, int port, std::string cacert);
 };
 
 /**
  * @brief A reusable connection to a CaosDBServer.
  */
 class CaosDBConnection {
-  CaosDBConnectionConfig config;
+  std::shared_ptr<CaosDBConnectionConfig> config;
   std::unique_ptr<GeneralInfoService::Stub> stub_;
 
 public:
-  explicit CaosDBConnection(const CaosDBConnectionConfig &config);
+  explicit CaosDBConnection(const std::shared_ptr<CaosDBConnectionConfig> &config);
   friend auto operator<<(std::ostream &out, const CaosDBConnection &connection)
     -> std::ostream &;
-  auto getGeneralInfoService() -> GeneralInfoService::Stub &;
+  [[nodiscard]] auto getGeneralInfoService() const -> GeneralInfoService::Stub &;
   [[nodiscard]] auto getVersionInfo() const -> const VersionInfo &;
 };
 } // namespace caosdb
diff --git a/src/caosdbcli.cpp b/src/caosdbcli.cpp
index fd591a2d1fe58841a24ebceb12d06466d214d831..0b5e3f345a2f113abdfd33bd437520c495b7a2ca 100644
--- a/src/caosdbcli.cpp
+++ b/src/caosdbcli.cpp
@@ -21,11 +21,11 @@
  */
 
 // A simple caosdb client
-#include "connection.h"
-#include "caosdb_config.h"
-#include <memory>
 #include <iostream>
 #include <string>
+#include "caosdb/info/v1alpha1/main.pb.h"
+#include "caosdb_config.h"
+#include "connection.h"
 
 auto main() -> int {
 
@@ -34,15 +34,20 @@ auto main() -> int {
             << caosdb::LIBCAOSDB_VERSION_PATCH << ")" << std::endl;
   std::cout << "We don't miss the H of caos." << std::endl;
 
-  std::string host = "localhost";
+  const std::string host = "localhost";
   // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
-  int port = 8080;
+  const int port = 8080;
+  const std::string &test = host;
+  std::cout << test << std::endl;
 
-  caosdb::CaosDBConnectionConfig config(host, port);
+  std::shared_ptr<caosdb::InsecureCaosDBConnectionConfig> config = std::make_shared<caosdb::InsecureCaosDBConnectionConfig>(host, port);
   caosdb::CaosDBConnection connection(config);
   std::cout << std::endl << connection << std::endl;
   const caosdb::info::v1alpha1::VersionInfo &v_info =
     connection.getVersionInfo();
-  std::cout << "VersionInfo(" << v_info.major() << ")" << std::endl;
+  const std::string &build = v_info.build();
+  std::cout << "BUILD(" << build[0] << ")" << std::endl;
+  std::cout << "VersionInfo(" << v_info.major() << "." << v_info.minor() << "." << v_info.patch() << ")" << std::endl;
+  std::cout << "PRE_RELEASE(" << v_info.pre_release() << ")" << std::endl;
   return 0;
 }
diff --git a/src/connection.cpp b/src/connection.cpp
index 580a6ad6393accfcba945513dff28e4dc3d5b22a..d52e15dccc8b363c6ef115fdc84e5ec9ee2ed793 100644
--- a/src/connection.cpp
+++ b/src/connection.cpp
@@ -31,6 +31,7 @@ using caosdb::info::v1alpha1::GeneralInfoService;
 using caosdb::info::v1alpha1::GetVersionInfoRequest;
 using caosdb::info::v1alpha1::GetVersionInfoResponse;
 using caosdb::info::v1alpha1::VersionInfo;
+using grpc::InsecureChannelCredentials;
 
 CaosDBConnectionConfig::CaosDBConnectionConfig(const std::string &host,
                                                int port) {
@@ -38,33 +39,42 @@ CaosDBConnectionConfig::CaosDBConnectionConfig(const std::string &host,
   this->port = port;
 }
 
-auto CaosDBConnectionConfig::getHost() -> std::string { return this->host; }
+auto CaosDBConnectionConfig::getHost() const -> std::string { return this->host; }
 
 auto CaosDBConnectionConfig::getPort() const -> int { return this->port; }
 
 auto operator<<(std::ostream &out, const CaosDBConnectionConfig &config)
   -> std::ostream & {
-  out << "CaosDBConnectionConfig(\"" << config.host << "\"," << config.port
-      << ")";
+  out << config.toString();
   return out;
 }
 
-CaosDBConnection::CaosDBConnection(const CaosDBConnectionConfig &config)
-  : config(config) {
+InsecureCaosDBConnectionConfig::InsecureCaosDBConnectionConfig(const std::string &host, int port) : CaosDBConnectionConfig(host, port) {
+  this->credentials = grpc::InsecureChannelCredentials();
+}
+
+auto InsecureCaosDBConnectionConfig::toString() const -> std::string {
+  return "InsecureCaosDBConnectionConfig(" + this->getHost() + "," + std::to_string(this->getPort()) + ")";
+}
+
+auto InsecureCaosDBConnectionConfig::getChannelCredentials() const -> std::shared_ptr<ChannelCredentials> {
+  return this->credentials;
+}
+
+CaosDBConnection::CaosDBConnection(const std::shared_ptr<CaosDBConnectionConfig> &config) {
   this->config = config;
-  std::shared_ptr<grpc::Channel> channel = grpc::CreateChannel(
-    this->config.getHost() + ":" + std::to_string(this->config.getPort()),
-    grpc::InsecureChannelCredentials());
+  const std::string &target = this->config->getHost() + ":" + std::to_string(this->config->getPort());
+  const std::shared_ptr<grpc::Channel> &channel = grpc::CreateChannel(target, this->config->getChannelCredentials());
   this->stub_ = GeneralInfoService::NewStub(channel);
 }
 
 auto operator<<(std::ostream &out, const CaosDBConnection &connection)
   -> std::ostream & {
-  out << "CaosDBConnection(" << connection.config << ")";
+  out << "CaosDBConnection(" << *(connection.config) << ")";
   return out;
 }
 
-auto CaosDBConnection::getGeneralInfoService() -> GeneralInfoService::Stub & {
+auto CaosDBConnection::getGeneralInfoService() const -> GeneralInfoService::Stub & {
   return *stub_;
 }
 
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 0c2f9349dcdb2bd04f955abb575d8b38ecde77d1..0eae700e02829e96d40851d5cf80f5bb6a5e09a2 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -56,9 +56,9 @@ if (LCOV_PATH)
     setup_target_for_coverage_lcov(
         NAME unit_test_coverage
         EXECUTABLE ctest -L caosdb-cpplib-unit-tests
-        EXCLUDE "${CMAKE_BINARY_DIR}/*" "g++*"
+        EXCLUDE "${CMAKE_BINARY_DIR}/*"
         DEPEDENCIES caosdb ${test_cases} gtest_main
-        LCOV_ARGS --rc lcov_branch_coverage=1
+        LCOV_ARGS --rc lcov_branch_coverage=1 --no-external
         GENHTML_ARGS --rc lcov_branch_coverage=1
         )
 else ()
diff --git a/test/test_connection.cpp b/test/test_connection.cpp
index ba64060f9b564ffff7aa3beec57a3bb7047d87c4..5ddfc948cf48b52a842588ba47de08a722c31169 100644
--- a/test/test_connection.cpp
+++ b/test/test_connection.cpp
@@ -24,11 +24,14 @@
 #include <gtest/gtest-message.h>
 #include <gtest/gtest-test-part.h>
 #include <memory>
+#include <type_traits>
 #include "gtest/gtest_pred_impl.h"
 
 TEST(test_connection, localhost_8080) {
-  caosdb::CaosDBConnectionConfig config("localhost", 8000);
+  caosdb::InsecureCaosDBConnectionConfig config("localhost", 8000);
 
-  EXPECT_EQ("localhost", config.getHost());
-  EXPECT_EQ(8000, config.getPort());
+  ASSERT_EQ("localhost", config.getHost());
+  ASSERT_EQ(8000, config.getPort());
+  std::shared_ptr<grpc::ChannelCredentials> icc = config.getChannelCredentials();
+  ASSERT_TRUE(icc != nullptr);
 }