diff --git a/CMakeLists.txt b/CMakeLists.txt
index c8df863ecf02797511335e9337e4ccc98e8c336e..02b574f18d71d869e9fe198ae810ea6ba97566ae 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,6 +6,7 @@ include(CheckLanguage)
 
 project (ftl.utu.fi)
 
+include(GNUInstallDirs)
 include(CTest)
 enable_testing()
 
@@ -33,9 +34,6 @@ if (NODE_NPM)
 	message(STATUS "Found NPM: ${NODE_NPM}")
 endif()
 
-include_directories(${GLOG_INCLUDE_DIRS})
-
-# Why is this problematic on some machines?
 check_language(CUDA)
 if (CUDA_TOOLKIT_ROOT_DIR)
 enable_language(CUDA)
diff --git a/net/CMakeLists.txt b/net/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..af0bf9e7701c67fbd4b0bef14d75898de7aa149c
--- /dev/null
+++ b/net/CMakeLists.txt
@@ -0,0 +1,11 @@
+add_subdirectory(cpp)
+
+# Perform Javascript module tests
+if (NODE_NPM)
+	add_test(
+		NAME NetJSTests
+		COMMAND npm test
+		WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/net/js
+	)
+endif()
+
diff --git a/net/cpp/CMakeLists.txt b/net/cpp/CMakeLists.txt
index 046aa32d33d26a5971c07c613e0da8ed371bbad3..65f902bdfc66df8ccc7ed7d20b66eb1309e61bcd 100644
--- a/net/cpp/CMakeLists.txt
+++ b/net/cpp/CMakeLists.txt
@@ -3,7 +3,7 @@ include_directories(${PROJECT_SOURCE_DIR}/net/cpp/include)
 #include_directories(${PROJECT_BINARY_DIR})
 
 
-set(NETSOURCE
+add_library(ftlnet
 	src/net.cpp
 	src/listener.cpp
 	src/socket.cpp
@@ -13,15 +13,20 @@ set(NETSOURCE
 	src/p2p.cpp
 )
 
-#check_include_file("uriparser/Uri.h" HAVE_URI_H)
-#if(NOT HAVE_URI_H)
-#	message(FATAL_ERROR "Uriparser not found")
-#endif()
 check_function_exists(uriParseSingleUriA HAVE_URIPARSESINGLE)
 
-add_library(ftlnet ${NETSOURCE})
+target_include_directories(ftlnet PUBLIC
+	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+	$<INSTALL_INTERFACE:include>
+	PRIVATE src)
 target_link_libraries(ftlnet Threads::Threads glog::glog)
 
+install(TARGETS ftlnet EXPORT ftlnet-config
+	ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+	LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
 add_executable(net-cli src/main.cpp)
 target_link_libraries(net-cli ftlnet glog::glog ${URIPARSER_LIBRARIES} Threads::Threads ${READLINE_LIBRARY} ${UUID_LIBRARIES})
 add_dependencies(net-cli ftlnet)