diff --git a/net/cpp/include/ftl/net/universe.hpp b/net/cpp/include/ftl/net/universe.hpp
index 11557f923f391160e0128932d26f2ae466d445e9..a1cfce0c84c12ae946f7ad25ca8fde77907b1d3c 100644
--- a/net/cpp/include/ftl/net/universe.hpp
+++ b/net/cpp/include/ftl/net/universe.hpp
@@ -204,7 +204,7 @@ void Universe::publish(const std::string &res, ARGS... args) {
 	for (auto p : subs) {
 		auto peer = getPeer(p);
 		if (peer) {
-			*peer->send(res, args...);
+			peer->send(res, args...);
 		}
 	}
 }
diff --git a/net/cpp/test/net_integration.cpp b/net/cpp/test/net_integration.cpp
index 19a585423e8154293986a21fa509bbabcdaeb0cb..aa698dbe8668fd7082cba84d26ca4f7b3713c2d7 100644
--- a/net/cpp/test/net_integration.cpp
+++ b/net/cpp/test/net_integration.cpp
@@ -192,6 +192,33 @@ TEST_CASE("Universe::subscribe()", "") {
 	}
 }
 
+TEST_CASE("Universe::publish()", "") {
+	Universe a;
+	Universe b;
+	a.listen("tcp://localhost:7077");
+	b.connect("tcp://localhost:7077");
+	while (a.numberOfPeers() == 0) sleep_for(milliseconds(20));
+
+	SECTION("no subscribers") {
+		a.createResource("ftl://test");
+		a.publish("ftl://test", 55);
+	}
+
+	SECTION("one subscriber") {
+		int done = 0;
+		a.createResource("ftl://test");
+		REQUIRE( b.subscribe("ftl://test", [&done](int a) {
+			done = a;
+		}) );
+		sleep_for(milliseconds(50));
+
+		a.publish("ftl://test", 56);
+		sleep_for(milliseconds(50));
+		
+		REQUIRE( done == 56 );
+	}
+}
+
 /*TEST_CASE("net::listen()", "[net]") {
 
 	SECTION("tcp any interface") {