diff --git a/.gitignore b/.gitignore
index 09a73bb9e3010253985d0e22d6de55b6af41bb80..c5ca081f079ab83aff2b6a136325d1ea45df6231 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,6 @@ build
 *.zip
 **/config.cpp
 **/config.h
-_CPack_Packages
\ No newline at end of file
+_CPack_Packages
+.vscode
+.env
\ No newline at end of file
diff --git a/src/protocol/factory.cpp b/src/protocol/factory.cpp
index 157081037286af6f568bca7d40e16579ca1c4d5f..e966edb619401b46a42109d03510440705e74395 100644
--- a/src/protocol/factory.cpp
+++ b/src/protocol/factory.cpp
@@ -1,6 +1,7 @@
 #include <loguru.hpp>
 
 #include <ftl/exception.hpp>
+#include <ftl/protocol/config.h>
 
 #include "connection.hpp"
 #include "tcp.hpp"
diff --git a/src/protocol/tls.cpp b/src/protocol/tls.cpp
index ed59ba5b2bd6c973cd51a7f2265c3b4b7630f3e7..42175003da135674c92aeb763c1677d812f7bde7 100644
--- a/src/protocol/tls.cpp
+++ b/src/protocol/tls.cpp
@@ -6,8 +6,10 @@
 #include <iomanip>
 
 #include <ftl/exception.hpp>
+#include <ftl/lib/loguru.hpp>
 
 using ftl::net::internal::Connection_TLS;
+using uchar = unsigned char;
 
 /** get basic certificate info: Distinguished Name (DN), issuer DN,
  *  certificate fingerprint */
diff --git a/src/protocol/tls.hpp b/src/protocol/tls.hpp
index 75aadf251a277a6d1c881603e3f1aefa83f6e1c0..65cad60cdfcd47746616a1c96186b66a515b072b 100644
--- a/src/protocol/tls.hpp
+++ b/src/protocol/tls.hpp
@@ -1,5 +1,6 @@
-#ifndef _FTL_NET_TLS_HPP_
-#define _FTL_NET_TLS_HPP_
+#pragma once
+
+#include <ftl/protocol/config.h>
 
 #ifdef HAVE_GNUTLS
 
@@ -44,4 +45,3 @@ private:
 }
 
 #endif // HAVE_GNUTLS
-#endif // _FTL_NET_TLS_HPP_
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 578543c6c56ccc5c881bf205c274d6cec5d8a143..c7dc751655199aa9eff06a392292cf2aa44d300d 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -81,4 +81,15 @@ target_include_directories(stream_integration PUBLIC "${CMAKE_CURRENT_SOURCE_DIR
 target_link_libraries(stream_integration
 	beyond-protocol GnuTLS::GnuTLS Threads::Threads ${URIPARSER_LIBRARIES} ${UUID_LIBRARIES} ${OS_LIBS})
 
-add_test(StreamIntegrationTest stream_integration)
\ No newline at end of file
+add_test(StreamIntegrationTest stream_integration)
+
+### Webservice E2E #############################################################
+add_executable(webservice_e2e
+	$<TARGET_OBJECTS:CatchTestFTL>
+	./webservice_e2e.cpp
+)
+target_include_directories(webservice_e2e PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../include")
+target_link_libraries(webservice_e2e
+	beyond-protocol GnuTLS::GnuTLS Threads::Threads ${URIPARSER_LIBRARIES} ${UUID_LIBRARIES} ${OS_LIBS})
+
+add_test(WebserviceE2ETest webservice_e2e)
\ No newline at end of file
diff --git a/test/webservice_e2e.cpp b/test/webservice_e2e.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..722b2813382691c807c2d9d8d8c8829df2908f96
--- /dev/null
+++ b/test/webservice_e2e.cpp
@@ -0,0 +1,25 @@
+#include "catch.hpp"
+#include <ftl/protocol.hpp>
+#include <ftl/protocol/self.hpp>
+#include <ftl/protocol/node.hpp>
+#include <ftl/uri.hpp>
+
+// --- Tests -------------------------------------------------------------------
+
+TEST_CASE("Webservice connection", "[net]") {
+	SECTION("connect using secure websocket") {
+		std::string uri;
+        if(const char* env_p = std::getenv("FTL_WEBSERVICE_URI")) {
+            uri = std::string(env_p);
+        } else {
+            return;
+        }
+
+		auto p = ftl::connectNode(uri);
+		REQUIRE( p );
+		
+		REQUIRE( p->waitConnection(5) );
+	}
+
+	ftl::protocol::reset();
+}