diff --git a/.gitignore b/.gitignore
index facb79166d59a0cd39da25915ad9e70262ab43cb..a95be5d02605031165d4f5fa4147275dc4b5630d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,8 @@
 */build
 */node_modules
 */include/ftl/config.h
+**/*.blend1
+fabric/
+fabric-js/
+build/
+lab-designs/viewer
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a9ca25b819c2caa9199827030180849cd704a301
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,64 @@
+cmake_minimum_required (VERSION 3.1.0)
+include (CheckIncludeFile)
+include (CheckIncludeFileCXX)
+include (CheckFunctionExists)
+include(CheckLanguage)
+
+project (ftl.utu.fi)
+
+include(CTest)
+enable_testing()
+
+set(THREADS_PREFER_PTHREAD_FLAG ON)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
+
+find_package( glog REQUIRED )
+find_package( OpenCV REQUIRED )
+find_package( Threads REQUIRED )
+find_package( LibSGM )
+
+check_language(CUDA)
+if (CUDA_FOUND)
+enable_language(CUDA)
+set(CMAKE_CUDA_FLAGS "")
+set(CMAKE_CUDA_FLAGS_DEBUG "-g -DDEBUG -D_DEBUG -Wall")
+set(CMAKE_CUDA_FLAGS_RELEASE "")
+add_definitions(-DHAVE_CUDA)
+include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
+endif (CUDA_FOUND)
+
+set(ftl_VERSION_MAJOR "1")
+set(ftl_VERSION_MINOR "0")
+set(ftl_VERSION_PATCH "0")
+set(FTL_VERSION "\"${ftl_VERSION_MAJOR}.${ftl_VERSION_MINOR}.${ftl_VERSION_PATCH}\"")
+
+if (WIN32)
+	file(TO_CMAKE_PATH "$ENV{USERPROFILE}" ENV_USERPROFILE)
+	set(FTL_CONFIG_ROOT "\"${ENV_USERPROFILE}/AppData/ftl\"")
+	message(STATUS "Config root is ${FTL_CONFIG_ROOT}")
+	set(FTL_CACHE_ROOT "\"$ENV{USERPROFILE}/AppData/ftl\"")
+	set(FTL_DATA_ROOT "\"$ENV{USERPROFILE}/AppData/ftl\"")
+	add_definitions(-DWIN32)
+
+	set(CMAKE_CXX_FLAGS "/std:c++17")
+	set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -Wall")
+	set(CMAKE_CXX_FLAGS_RELEASE "/O2")
+endif (WIN32)
+
+if (UNIX)
+	add_definitions(-DUNIX)
+	set(FTL_CONFIG_ROOT "\"$ENV{HOME}/.config/ftl\"")
+	message(STATUS "Config root is ${FTL_CONFIG_ROOT}")
+	set(FTL_CACHE_ROOT "\"$ENV{HOME}/.cache/ftl\"")
+	set(FTL_DATA_ROOT "\"$ENV{HOME}/.local/share/ftl\"")
+
+	set(CMAKE_CXX_FLAGS "-std=c++17")
+	set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -pg -Wall")
+	set(CMAKE_CXX_FLAGS_RELEASE "-O3 -msse3 -mfpmath=sse")
+endif (UNIX)
+
+SET(CMAKE_USE_RELATIVE_PATHS ON)
+
+add_subdirectory(net/cpp)
+add_subdirectory(cv-node)
+
diff --git a/README.md b/README.md
index 88324979890a2b18cd9c133423ae92a0e30a29e2..af16903f25fa11c8042659bb02be178addc32b53 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,31 @@
 
 This monorepo contains all elements of the FTL software system.
 
-* p2p-remote-array : Access 2D memory arrays on other machines in P2P group
-* fabric : C++ library implementing the neural fabric
-* fabric-js : Node.js bindings for C++ fabric
-* fabric-js-modules : Additional fabric-js based native and non-native components
-* peer-node : P2P node.js application providing a web-service interface
-* front-end : Client side FTL code
+* net : A p2p messaging library for C++ and JavaScript
+* cv-node : Stereo vision node in p2p network
+* renderer : Produce video or live image feeds from scene representation
+* front-end : Client side FTL code, both web and native
+* web-service : A web backend service provider acting as a form of proxy
 * www : FTL Website
 
-The architecture relies on NodeJS with C++ native addons for processing.
+The architecture is a mix of C++ and NodeJS largely communicating over a p2p
+network protocol.
+
+## Build
+Use the following commands in the root repository directory to build:
+
+```bash
+mkdir build
+cd build
+cmake ..
+make
+```
+
+In Windows have Visual Studio installed and use the cmake graphical interface
+to configure the project.
+
+You will need to have OpenCV and glog installed. CUDA and LibSGM are optional
+but recommended also. OpenCV should have cuda stereo modules compiled, along
+with the viz module if local point cloud display is required. These are contrib
+modules.
+
diff --git a/cv-node/cmake/FindLibSGM.cmake b/cmake/FindLibSGM.cmake
similarity index 100%
rename from cv-node/cmake/FindLibSGM.cmake
rename to cmake/FindLibSGM.cmake
diff --git a/cv-node/cmake/Findglog.cmake b/cmake/Findglog.cmake
similarity index 100%
rename from cv-node/cmake/Findglog.cmake
rename to cmake/Findglog.cmake
diff --git a/cv-node/CMakeLists.txt b/cv-node/CMakeLists.txt
index e8ab4514b7a3148774d3bf20f68dc9e7dace8689..0f7c6d64f625b488d2587a407378e7225e65099c 100644
--- a/cv-node/CMakeLists.txt
+++ b/cv-node/CMakeLists.txt
@@ -1,86 +1,16 @@
-cmake_minimum_required (VERSION 3.1.0)
-include (CheckIncludeFile)
-include (CheckIncludeFileCXX)
-include (CheckFunctionExists)
-include(CheckLanguage)
-
-project (cv-node)
-
-include(CTest)
-enable_testing()
-
-set(THREADS_PREFER_PTHREAD_FLAG ON)
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
-
-find_package( glog REQUIRED )
-#if (WIN32)
-#include_directories(${glog_DIR})
-#endif (WIN32)
-find_package( OpenCV REQUIRED )
-find_package( Threads REQUIRED )
-find_package( LibSGM )
-#find_package( CUDA )
-
-check_language(CUDA)
-if (CUDA_FOUND)
-enable_language(CUDA)
-set(CMAKE_CUDA_FLAGS "")
-set(CMAKE_CUDA_FLAGS_DEBUG "-g -DDEBUG -D_DEBUG -Wall")
-set(CMAKE_CUDA_FLAGS_RELEASE "")
-add_definitions(-DHAVE_CUDA)
-include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
-endif (CUDA_FOUND)
-
 # Need to include staged files and libs
-include_directories(${PROJECT_SOURCE_DIR}/include)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_SOURCE_DIR}/cv-node/include)
+#include_directories(${PROJECT_BINARY_DIR})
 
 # Check for optional opencv components
 set(CMAKE_REQUIRED_INCLUDES ${OpenCV_INCLUDE_DIRS})
 check_include_file_cxx("opencv2/viz.hpp" HAVE_VIZ)
 check_include_file_cxx("opencv2/cudastereo.hpp" HAVE_OPENCVCUDA)
 
-set(ftl_VERSION_MAJOR "1")
-set(ftl_VERSION_MINOR "0")
-set(ftl_VERSION_PATCH "0")
-set(FTL_VERSION "${ftl_VERSION_MAJOR}.${ftl_VERSION_MINOR}.${ftl_VERSION_PATCH}")
-add_definitions(-DFTL_VERSION=${FTL_VERSION})
-
-if (WIN32)
-	file(TO_CMAKE_PATH "$ENV{USERPROFILE}" ENV_USERPROFILE)
-	set(FTL_CONFIG_ROOT "\"${ENV_USERPROFILE}/AppData/ftl\"")
-	message(STATUS "Config root is ${FTL_CONFIG_ROOT}")
-	set(FTL_CACHE_ROOT "$ENV{USERPROFILE}/AppData/ftl")
-	set(FTL_DATA_ROOT "$ENV{USERPROFILE}/AppData/ftl")
-	add_definitions(-DWIN32)
-
-	set(CMAKE_CXX_FLAGS "/std:c++17")
-	set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -Wall")
-	set(CMAKE_CXX_FLAGS_RELEASE "/O2")
-endif (WIN32)
-
-if (UNIX)
-	add_definitions(-DUNIX)
-	set(FTL_CONFIG_ROOT "\"$ENV{HOME}/.config/ftl\"")
-	message(STATUS "Config root is ${FTL_CONFIG_ROOT}")
-	set(FTL_CACHE_ROOT "$ENV{HOME}/.cache/ftl")
-	set(FTL_DATA_ROOT "$ENV{HOME}/.local/share/ftl")
-
-	set(CMAKE_CXX_FLAGS "-std=c++17")
-	set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -pg -Wall")
-	set(CMAKE_CXX_FLAGS_RELEASE "-O3 -msse3 -mfpmath=sse")
-endif (UNIX)
-
-#add_definitions("-DFTL_CONFIG_ROOT=${FTL_CONFIG_ROOT}")
-#add_definitions("-DFTL_CACHE_ROOT=${FTL_CACHE_ROOT}")
-#add_definitions("-DFTL_DATA_ROOT=${FTL_DATA_ROOT}")
-
-configure_file(${CMAKE_SOURCE_DIR}/include/ftl/config.h.in
-               ${CMAKE_SOURCE_DIR}/include/ftl/config.h
+configure_file(${CMAKE_SOURCE_DIR}/cv-node/include/ftl/config.h.in
+               ${CMAKE_SOURCE_DIR}/cv-node/include/ftl/config.h
 )
 
-SET(CMAKE_USE_RELATIVE_PATHS ON)
-
 set(CVNODESRC
 	src/main.cpp
 	src/calibrate.cpp
@@ -113,6 +43,7 @@ if (CUDA_FOUND)
 endif (CUDA_FOUND)
 
 add_executable(cv-node ${CVNODESRC})
+add_dependencies(cv-node net)
 
 if (CUDA_FOUND)
 set_property(TARGET Threads::Threads
diff --git a/net/cpp/CMakeLists.txt b/net/cpp/CMakeLists.txt
index 85d31c34d48dcb4e3e54a6fb5657f3f264688a87..7a35df67158e4371b3a2c1dfc8b6c67175bd1eb7 100644
--- a/net/cpp/CMakeLists.txt
+++ b/net/cpp/CMakeLists.txt
@@ -1,30 +1,9 @@
-cmake_minimum_required (VERSION 2.8.11)
-
-include (CheckIncludeFile)
-include (CheckFunctionExists)
-project (ftlnet)
-
-include(CTest)
-enable_testing()
-
-#find_package(PkgConfig)
-#pkg_check_modules(GTKMM gtkmm-3.0)
-
 # Need to include staged files and libs
-include_directories(${PROJECT_SOURCE_DIR}/includes)
-include_directories(${PROJECT_BINARY_DIR})
-
-set(ftl_VERSION_MAJOR "1")
-set(ftl_VERSION_MINOR "0")
-set(ftl_VERSION_PATCH "0")
-
-set(CMAKE_CXX_FLAGS "-pthread -fopenmp -std=c++17 -Wall -Wno-deprecated -Werror -Wno-psabi")
-set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -pg -Wall -Werror")
-set(CMAKE_CXX_FLAGS_RELEASE "-O3")
+include_directories(${PROJECT_SOURCE_DIR}/net/cpp/include)
+#include_directories(${PROJECT_BINARY_DIR})
 
-SET(CMAKE_USE_RELATIVE_PATHS ON)
 
-set(FTLSOURCE
+set(NETSOURCE
 	src/net.cpp
 	src/listener.cpp
 	src/socket.cpp
@@ -38,8 +17,7 @@ if(NOT HAVE_URI_H)
 endif()
 check_function_exists(uriParseSingleUriA HAVE_URIPARSESINGLE)
 
-add_library(ftlnet ${FTLSOURCE})
-target_include_directories(ftlnet PUBLIC ${PROJECT_SOURCE_DIR}/include)
-target_link_libraries(ftlnet pthread)
+add_library(net ${NETSOURCE})
+target_link_libraries(net pthread)
 
 ADD_SUBDIRECTORY(test)