From af965fc0881aa3a908beced856ca72a1a0f8c904 Mon Sep 17 00:00:00 2001
From: Adam Rankin <adam.rankin@gmail.com>
Date: Mon, 24 Jul 2017 14:59:54 -0400
Subject: [PATCH 01/21] COMP: Converting to superbuild configuration

A lot remains to be done, but all projects are now properly downloaded when their respective argument is chosen

Compiling of codecs is not complete, and will require some effort

Find modules are not fully written
---
 DartConfig.cmake => CMake/DartConfig.cmake    |   0
 .../GenerateOpenIGTLinkConfig.cmake           |   0
 .../OpenIGTLinkConfigPlatform.cmake           |   0
 CMakeLists.txt                                | 204 +++++-------
 FindOpenIGTLink.cmake                         |  89 ------
 Source/CMakeLists.txt                         |  82 +++--
 Source/VideoStreaming/VideoStreaming.cmake    | 251 ++-------------
 Source/WebSocket/WebSocket.cmake              |  28 --
 Source/igtlutil/CMakeLists.txt                |  51 ++-
 SuperBuild/CMakeListsOpenH264.txt.in          |  15 -
 SuperBuild/CMakeListsVPX.txt.in               |  15 -
 SuperBuild/CMakeListsWebSocket.txt.in         |  23 --
 SuperBuild/External_x265.cmake                |  45 +++
 SuperBuild/Superbuild.cmake                   |  63 ++++
 Testing/CMakeLists.txt                        | 292 ++++++++----------
 Testing/CMakeLists.txt.in                     |  26 --
 Testing/igtlutil/CMakeLists.txt               | 118 ++++---
 17 files changed, 493 insertions(+), 809 deletions(-)
 rename DartConfig.cmake => CMake/DartConfig.cmake (100%)
 rename GenerateOpenIGTLinkConfig.cmake => CMake/GenerateOpenIGTLinkConfig.cmake (100%)
 rename OpenIGTLinkConfigPlatform.cmake => CMake/OpenIGTLinkConfigPlatform.cmake (100%)
 delete mode 100644 FindOpenIGTLink.cmake
 delete mode 100644 Source/WebSocket/WebSocket.cmake
 delete mode 100644 SuperBuild/CMakeListsOpenH264.txt.in
 delete mode 100644 SuperBuild/CMakeListsVPX.txt.in
 delete mode 100755 SuperBuild/CMakeListsWebSocket.txt.in
 create mode 100644 SuperBuild/External_x265.cmake
 create mode 100644 SuperBuild/Superbuild.cmake
 delete mode 100644 Testing/CMakeLists.txt.in

diff --git a/DartConfig.cmake b/CMake/DartConfig.cmake
similarity index 100%
rename from DartConfig.cmake
rename to CMake/DartConfig.cmake
diff --git a/GenerateOpenIGTLinkConfig.cmake b/CMake/GenerateOpenIGTLinkConfig.cmake
similarity index 100%
rename from GenerateOpenIGTLinkConfig.cmake
rename to CMake/GenerateOpenIGTLinkConfig.cmake
diff --git a/OpenIGTLinkConfigPlatform.cmake b/CMake/OpenIGTLinkConfigPlatform.cmake
similarity index 100%
rename from OpenIGTLinkConfigPlatform.cmake
rename to CMake/OpenIGTLinkConfigPlatform.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7ee945da..e66dad5b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,10 +1,15 @@
-PROJECT( OpenIGTLink )
+PROJECT(OpenIGTLink)
 
-cmake_minimum_required(VERSION 2.4)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
 
-if(COMMAND cmake_policy)
-     cmake_policy(SET CMP0003 NEW)
-     endif(COMMAND cmake_policy)
+INCLUDE(ExternalProject)
+
+IF(COMMAND cmake_policy)
+  cmake_policy(SET CMP0003 NEW)
+ENDIF(COMMAND cmake_policy)
+
+OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." ON)
+MARK_AS_ADVANCED(OpenIGTLink_SUPERBUILD)
 
 #-----------------------------------------------------------------------------
 # OpenIGTlink version number.
@@ -12,8 +17,8 @@ SET(OpenIGTLink_VERSION_MAJOR "3")
 SET(OpenIGTLink_VERSION_MINOR "1")
 SET(OpenIGTLink_VERSION_PATCH "0")
 
-option(OpenIGTLink_PROTOCOL_VERSION_2 "Build Library for Protocol Version 2" ON)
-option(OpenIGTLink_PROTOCOL_VERSION_3 "Build Library for Protocol Version 3" ON)
+OPTION(OpenIGTLink_PROTOCOL_VERSION_2 "Build Library for Protocol Version 2" ON)
+OPTION(OpenIGTLink_PROTOCOL_VERSION_3 "Build Library for Protocol Version 3" ON)
 
 SET(OpenIGTLink_HEADER_VERSION "1")
 IF(OpenIGTLink_PROTOCOL_VERSION_3)
@@ -25,76 +30,50 @@ ELSE()
   SET(OpenIGTLink_PROTOCOL_VERSION "1")
 ENDIF()
 
-
 #-----------------------------------------------------------------------------
 # Configure VideoStreaming
-#Configure VideoStream
 OPTION(BUILD_VIDEOSTREAM "Build the Video Stream." OFF)
 IF(BUILD_VIDEOSTREAM)
-  OPTION(LINK_H264 "Link the OpenH264 tree." OFF)
-  SET(OpenIGTLink_LINK_H264 "0")
-  IF(LINK_H264)
-  SET(OpenIGTLink_LINK_H264 "1")
-  ENDIF()
-
-  OPTION(LINK_VP9 "Link the VP9 tree." OFF)
-  SET(OpenIGTLink_LINK_VP9 "0")
-  IF(LINK_VP9)
-  SET(OpenIGTLink_LINK_VP9 "1")
-  ENDIF()
-
-  OPTION(LINK_X265 "Link the X265 tree." OFF)
-  SET(OpenIGTLink_LINK_X265 "0")
-  IF(LINK_X265)
-  SET(OpenIGTLink_LINK_X265 "1")
-  ENDIF()
-
-  OPTION(LINK_OPENHEVC "Link the OpenHevc tree." OFF)
-  SET(OpenIGTLink_LINK_OPENHEVC "0")
-  IF(LINK_OPENHEVC)
-  SET(OpenIGTLink_LINK_OPENHEVC "1")
-  ENDIF()
+  OPTION(USE_H264 "Link the OpenH264 tree." OFF)
+  OPTION(USE_VP9 "Link the VP9 tree." OFF)
+  OPTION(USE_X265 "Link the X265 tree." OFF)
+  OPTION(USE_OPENHEVC "Link the OpenHevc tree." OFF)
 ENDIF()
 
 #-----------------------------------------------------------------------------
-
-#Configure WebSocket
+# Configure WebSocket
 OPTION(BUILD_WEBSOCKET "Build the Websocket." OFF)
-SET(OpenIGTLink_BUILD_WEBSOCKET "0")
-IF(BUILD_WEBSOCKET)
-  SET(OpenIGTLink_BUILD_WEBSOCKET "1")  
-ENDIF()
-#-----------------------------------------------------------------------------
 
+#-----------------------------------------------------------------------------
 # OpenIGTLink build configuration options.
-
 OPTION(BUILD_SHARED_LIBS "Build OpenIGTLink with shared libraries." OFF)
 SET(OpenIGTLink_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
 
-if(NOT OpenIGTLink_BUILD_SHARED_LIBS)
+IF(NOT OpenIGTLink_BUILD_SHARED_LIBS)
   OPTION(BUILD_GENERATE_PIC "Generate position independent code (for static)." ON)
   SET(OpenIGTLink_BUILD_GENERATE_PIC ${BUILD_GENERATE_PIC})
-endif(NOT OpenIGTLink_BUILD_SHARED_LIBS)
+ENDIF()
 
 OPTION(BUILD_EXAMPLES "Build OpenIGTLink example programs." OFF)
 SET(OpenIGTLink_BUILD_EXAMPLES ${BUILD_EXAMPLES})
 
 #-----------------------------------------------------------------------------
 # Output directories.
+IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
+  SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OpenIGTLink_BINARY_DIR}/bin CACHE INTERNAL "Single output directory for building all libraries.")
+ENDIF()
+IF(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
+  SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OpenIGTLink_BINARY_DIR}/bin CACHE INTERNAL "Single output directory for building all executables.")
+ENDIF()
+IF(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
+  SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OpenIGTLink_BINARY_DIR}/lib CACHE INTERNAL "Single output directory for building all archives.")
+ENDIF()
 
-IF(NOT LIBRARY_OUTPUT_PATH)
-  SET (LIBRARY_OUTPUT_PATH ${OpenIGTLink_BINARY_DIR}/bin CACHE INTERNAL "Single output directory for building all libraries.")
-ENDIF(NOT LIBRARY_OUTPUT_PATH)
-IF(NOT EXECUTABLE_OUTPUT_PATH)
-  SET (EXECUTABLE_OUTPUT_PATH ${OpenIGTLink_BINARY_DIR}/bin CACHE INTERNAL "Single output directory for building all executables.")
-ENDIF(NOT EXECUTABLE_OUTPUT_PATH)
-MARK_AS_ADVANCED(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH)
-
-SET(OpenIGTLink_LIBRARY_PATH "${LIBRARY_OUTPUT_PATH}")
-SET(OpenIGTLink_EXECUTABLE_PATH "${EXECUTABLE_OUTPUT_PATH}")
+SET(OpenIGTLink_LIBRARY_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
+SET(OpenIGTLink_EXECUTABLE_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
 
 SET(OpenIGTLink_CMAKE_DIR "${OpenIGTLink_SOURCE_DIR}/CMake")
-SET(CMAKE_MODULE_PATH "${OpenIGTLink_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
+LIST(APPEND CMAKE_MODULE_PATH "${OpenIGTLink_SOURCE_DIR}/CMake/Modules")
 
 #-----------------------------------------------------------------------------
 # Installation vars.
@@ -109,71 +88,61 @@ SET(CMAKE_MODULE_PATH "${OpenIGTLink_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
 
 IF(NOT OpenIGTLink_INSTALL_BIN_DIR)
   SET(OpenIGTLink_INSTALL_BIN_DIR "bin")
-ENDIF(NOT OpenIGTLink_INSTALL_BIN_DIR)
+ENDIF()
 
 IF(NOT OpenIGTLink_INSTALL_LIB_DIR)
   SET(OpenIGTLink_INSTALL_LIB_DIR "lib/igtl")
-ENDIF(NOT OpenIGTLink_INSTALL_LIB_DIR)
+ENDIF()
 
 IF(NOT OpenIGTLink_INSTALL_DATA_DIR)
   SET(OpenIGTLink_INSTALL_DATA_DIR "share/igtl")
-ENDIF(NOT OpenIGTLink_INSTALL_DATA_DIR)
+ENDIF()
 
 IF(NOT OpenIGTLink_INSTALL_INCLUDE_DIR)
   SET(OpenIGTLink_INSTALL_INCLUDE_DIR "include/igtl")
-ENDIF(NOT OpenIGTLink_INSTALL_INCLUDE_DIR)
+ENDIF()
+
+IF(NOT igtlutil_INSTALL_INCLUDE_DIR)
+  SET(igtlutil_INSTALL_INCLUDE_DIR "include/igtl/igtlutil")
+ENDIF()
 
 IF(NOT OpenIGTLink_INSTALL_PACKAGE_DIR)
   SET(OpenIGTLink_INSTALL_PACKAGE_DIR "${OpenIGTLink_INSTALL_LIB_DIR}/cmake/igtl-${OpenIGTLink_VERSION_MAJOR}.${OpenIGTLink_VERSION_MINOR}"
     CACHE INTERNAL "")
-ENDIF(NOT OpenIGTLink_INSTALL_PACKAGE_DIR)
+ENDIF()
 
 IF(NOT OpenIGTLink_INSTALL_NO_DOCUMENTATION)
   SET(OpenIGTLink_INSTALL_NO_DOCUMENTATION 0)
-ENDIF(NOT OpenIGTLink_INSTALL_NO_DOCUMENTATION)
+ENDIF()
 
 SET(OpenIGTLink_DIR "${CMAKE_BINARY_DIR}" CACHE INTERNAL "OpenIGTLink dir to be used by subprojects")
 
-#-----------------------------------------------------------------------------
-# Include directories
-
-SET(OpenIGTLink_INCLUDE_DIRS_BUILD_TREE ${OpenIGTLink_INCLUDE_DIRS_BUILD_TREE}
-  ${OpenIGTLink_BINARY_DIR}
-  ${OpenIGTLink_SOURCE_DIR}/Source
-  ${OpenIGTLink_SOURCE_DIR}/Source/igtlutil
-)
-
-INCLUDE_DIRECTORIES(
-  ${OpenIGTLink_INCLUDE_DIRS_BUILD_TREE}
-  )
-
 #-----------------------------------------------------------------------------
 # OpenIGTLink requires special compiler flags on some platforms.
-
-INCLUDE (FindThreads)
+INCLUDE(FindThreads)
 
 IF(CMAKE_COMPILER_IS_GNUCXX)
   # '-fno-tree-vectorize' option is added to avoid segmentation fault that occurs in
   # igtl_image_convert_byte_order() (Source/igtlutil/igtl_image.c) built with 'Release'
   # option on 64-bit Linux.
-  INCLUDE (CheckCXXCompilerFlag)
+  INCLUDE(CheckCXXCompilerFlag)
   CHECK_CXX_COMPILER_FLAG("-fno-tree-vectorize" OpenIGTLink_GNUCXX_TREE_VECTORIZE_SUPPORT)
-  IF (OpenIGTLink_GNUCXX_TREE_VECTORIZE_SUPPORT)
-    SET(OpenIGTLink_REQUIRED_C_FLAGS "${OpenIGTLink_REQUIRED_C_FLAGS} -w -fno-tree-vectorize")
-    SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -ftemplate-depth-50 -fno-tree-vectorize")
-  ENDIF (OpenIGTLink_GNUCXX_TREE_VECTORIZE_SUPPORT)
+  IF(OpenIGTLink_GNUCXX_TREE_VECTORIZE_SUPPORT)
+    LIST(APPEND OpenIGTLink_REQUIRED_C_FLAGS -w -fno-tree-vectorize)
+    LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -ftemplate-depth-50 -fno-tree-vectorize)
+  ENDIF()
 
   # If the library is built as a static library, pass -fPIC option to the compiler
   IF(OpenIGTLink_BUILD_GENERATE_PIC)
-    SET(OpenIGTLink_REQUIRED_C_FLAGS "${OpenIGTLink_REQUIRED_C_FLAGS} -fPIC")
-    SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -fPIC")
-  ENDIF(OpenIGTLink_BUILD_GENERATE_PIC)
+    LIST(APPEND OpenIGTLink_REQUIRED_C_FLAGS -fPIC)
+    LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -fPIC)
+  ENDIF()
 
   # pthread
   IF(CMAKE_HAVE_THREADS_LIBRARY)
-    SET(OpenIGTLink_REQUIRED_LINK_FLAGS "${OpenIGTLink_REQUIRED_LINK_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
-  ENDIF(CMAKE_HAVE_THREADS_LIBRARY)
-ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+    LIST(APPEND OpenIGTLink_REQUIRED_LINK_FLAGS ${CMAKE_THREAD_LIBS_INIT})
+  ENDIF()
+ENDIF()
 
 
 # for the gnu compiler a -D_PTHREADS is needed on sun
@@ -181,27 +150,29 @@ ENDIF(CMAKE_COMPILER_IS_GNUCXX)
 IF(CMAKE_USE_PTHREADS)
   IF(CMAKE_SYSTEM MATCHES "SunOS.*")
     IF(CMAKE_COMPILER_IS_GNUCXX)
-      SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -D_PTHREADS")
-    ELSE(CMAKE_COMPILER_IS_GNUCXX)
-      SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -mt")
-      SET(OpenIGTLink_REQUIRED_C_FLAGS "${OpenIGTLink_REQUIRED_C_FLAGS} -mt")
-    ENDIF(CMAKE_COMPILER_IS_GNUCXX)
-  ENDIF(CMAKE_SYSTEM MATCHES "SunOS.*")
-ENDIF(CMAKE_USE_PTHREADS)
+      LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -D_PTHREADS)
+    ELSE()
+      LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -mt)
+      LIST(APPEND OpenIGTLink_REQUIRED_C_FLAGS -mt)
+    ENDIF()
+  ENDIF()
+ENDIF()
 
+#-----------------------------------------------------------------------------
+# Run superbuild script instead of library script
+IF(OpenIGTLink_SUPERBUILD)
+  INCLUDE(SuperBuild/Superbuild.cmake)
+  RETURN()
+ENDIF()
 
 #-----------------------------------------------------------------------------
 # Platform configuration tests.
-
-# Socket tests etc.
 INCLUDE(${OpenIGTLink_CMAKE_DIR}/OpenIGTLinkCMakeTests.cmake)
-
 SET(OpenIGTLink_LIBRARY_TARGETS_FILE "${CMAKE_BINARY_DIR}/OpenIGTLinkTargets.cmake")
 
 #-----------------------------------------------------------------------------
 # Generate Configuration Header files.
-
-include (${OpenIGTLink_SOURCE_DIR}/OpenIGTLinkConfigPlatform.cmake)
+INCLUDE(${OpenIGTLink_SOURCE_DIR}/CMake/OpenIGTLinkConfigPlatform.cmake)
 
 CONFIGURE_FILE(${OpenIGTLink_SOURCE_DIR}/igtlConfigure.h.in
   ${OpenIGTLink_BINARY_DIR}/igtlConfigure.h)
@@ -217,17 +188,10 @@ CONFIGURE_FILE(${OpenIGTLink_SOURCE_DIR}/igtlTypeConfig.h.in
 
 # Copy the UseOpenIGTLink.cmake file to the binary tree for backward compatability.
 CONFIGURE_FILE(${OpenIGTLink_SOURCE_DIR}/UseOpenIGTLink.cmake.in
-${OpenIGTLink_BINARY_DIR}/UseOpenIGTLink.cmake COPYONLY IMMEDIATE)
+  ${OpenIGTLink_BINARY_DIR}/UseOpenIGTLink.cmake COPYONLY IMMEDIATE)
 
 # Create the OpenIGTLinkConfig.cmake file containing the OpenIGTLink configuration.
-INCLUDE (${OpenIGTLink_SOURCE_DIR}/GenerateOpenIGTLinkConfig.cmake)
-
-# Save the compiler settings so another project can import them.
-INCLUDE(${CMAKE_ROOT}/Modules/CMakeExportBuildSettings.cmake)
-CMAKE_EXPORT_BUILD_SETTINGS(${OpenIGTLink_BINARY_DIR}/OpenIGTLinkBuildSettings.cmake)
-
-# Save library dependencies.
-#EXPORT_LIBRARY_DEPENDENCIES(${OpenIGTLink_BINARY_DIR}/OpenIGTLinkLibraryDepends.cmake)
+INCLUDE(${OpenIGTLink_SOURCE_DIR}/CMake/GenerateOpenIGTLinkConfig.cmake)
 
 INSTALL(FILES
   ${OpenIGTLink_BINARY_DIR}/OpenIGTLinkBuildSettings.cmake
@@ -256,28 +220,26 @@ INSTALL(FILES
   )
 
 #-----------------------------------------------------------------------------
-# Add compiler flags OpenIGTLink needs to work on this platform.  This must be
-# done AFTER the call to CMAKE_EXPORT_BUILD_SETTINGS.
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenIGTLink_REQUIRED_C_FLAGS}")
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenIGTLink_REQUIRED_CXX_FLAGS}")
-SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenIGTLink_REQUIRED_LINK_FLAGS}")
-SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenIGTLink_REQUIRED_LINK_FLAGS}")
-SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OpenIGTLink_REQUIRED_LINK_FLAGS}")
+# Add compiler flags OpenIGTLink needs to work on this platform
+LIST(APPEND CMAKE_C_FLAGS ${OpenIGTLink_REQUIRED_C_FLAGS})
+LIST(APPEND CMAKE_CXX_FLAGS ${OpenIGTLink_REQUIRED_CXX_FLAGS})
+LIST(APPEND CMAKE_EXE_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
+LIST(APPEND CMAKE_SHARED_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
+LIST(APPEND CMAKE_MODULE_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
 
 #-----------------------------------------------------------------------------
 # Configure Subdirectories
-
+ADD_SUBDIRECTORY(Source/igtlutil)
 ADD_SUBDIRECTORY(Source)
 ADD_SUBDIRECTORY(Tools)
 
 IF(OpenIGTLink_BUILD_EXAMPLES)
  ADD_SUBDIRECTORY(Examples)
-ENDIF(OpenIGTLink_BUILD_EXAMPLES)
+ENDIF()
 
 #-----------------------------------------------------------------------------
 # Export targets
-export(TARGETS OpenIGTLink
+EXPORT(TARGETS OpenIGTLink
   FILE "${OpenIGTLink_LIBRARY_TARGETS_FILE}"
   )
 
@@ -294,15 +256,13 @@ SET(OpenIGTLink_BUILD_TESTING ${BUILD_TESTING})
 IF(OpenIGTLink_BUILD_TESTING)
   ENABLE_TESTING()
   ADD_SUBDIRECTORY(Testing)
-  INCLUDE (${CMAKE_ROOT}/Modules/Dart.cmake)
+  INCLUDE(${CMAKE_ROOT}/Modules/Dart.cmake)
 ENDIF()
 
-
 #-----------------------------------------------------------------------------
 # Doxygen
-
 OPTION(BUILD_DOCUMENTATION "Build OpenIGTLink Documentation" OFF)
 
 IF(BUILD_DOCUMENTATION)
-  ADD_SUBDIRECTORY( Documents/Doxygen )
-ENDIF(BUILD_DOCUMENTATION)
+  ADD_SUBDIRECTORY(Documents/Doxygen)
+ENDIF()
\ No newline at end of file
diff --git a/FindOpenIGTLink.cmake b/FindOpenIGTLink.cmake
deleted file mode 100644
index 402d8352..00000000
--- a/FindOpenIGTLink.cmake
+++ /dev/null
@@ -1,89 +0,0 @@
-# - Find an OpenIGTLink installation or build tree.
-
-# When OpenIGTLink is found, the OpenIGTLinkConfig.cmake file is sourced to setup the
-# location and configuration of OpenIGTLink.  Please read this file, or
-# OpenIGTLinkConfig.cmake.in from the OpenIGTLink source tree for the full list of
-# definitions.  Of particular interest is OpenIGTLink_USE_FILE, a CMake source file
-# that can be included to set the include directories, library directories,
-# and preprocessor macros.  In addition to the variables read from
-# OpenIGTLinkConfig.cmake, this find module also defines
-#  OpenIGTLink_DIR  - The directory containing OpenIGTLinkConfig.cmake.  
-#             This is either the root of the build tree, 
-#             or the lib/InsightToolkit directory.  
-#             This is the only cache entry.
-#   
-#  OpenIGTLink_FOUND - Whether OpenIGTLink was found.  If this is true, 
-#              OpenIGTLink_DIR is okay.
-#
-#  USE_OpenIGTLink_FILE - The full path to the UseOpenIGTLink.cmake file.  
-#                 This is provided for backward 
-#                 compatability.  Use OpenIGTLink_USE_FILE
-#                 instead.
-
-
-SET(OpenIGTLink_DIR_STRING "directory containing OpenIGTLinkConfig.cmake.  This is either the root of the build tree, or PREFIX/lib/igtl for an installation.")
-
-# Search only if the location is not already known.
-IF(NOT OpenIGTLink_DIR)
-  # Get the system search path as a list.
-  IF(UNIX)
-    STRING(REGEX MATCHALL "[^:]+" OpenIGTLink_DIR_SEARCH1 "$ENV{PATH}")
-  ELSE(UNIX)
-    STRING(REGEX REPLACE "\\\\" "/" OpenIGTLink_DIR_SEARCH1 "$ENV{PATH}")
-  ENDIF(UNIX)
-  STRING(REGEX REPLACE "/;" ";" OpenIGTLink_DIR_SEARCH2 ${OpenIGTLink_DIR_SEARCH1})
-
-  # Construct a set of paths relative to the system search path.
-  SET(OpenIGTLink_DIR_SEARCH "")
-  FOREACH(dir ${OpenIGTLink_DIR_SEARCH2})
-    SET(OpenIGTLink_DIR_SEARCH ${OpenIGTLink_DIR_SEARCH} "${dir}/../lib/igtl")
-  ENDFOREACH(dir)
-
-  #
-  # Look for an installation or build tree.
-  #
-  FIND_PATH(OpenIGTLink_DIR OpenIGTLinkConfig.cmake
-    # Look for an environment variable OpenIGTLink_DIR.
-    $ENV{OpenIGTLink_DIR}
-
-    # Look in places relative to the system executable search path.
-    ${OpenIGTLink_DIR_SEARCH}
-
-    # Look in standard UNIX install locations.
-    /usr/local/lib/igtl
-    /usr/lib/igtl
-
-    # Read from the CMakeSetup registry entries.  It is likely that
-    # OpenIGTLink will have been recently built.
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild1]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild2]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild3]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild4]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild5]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild6]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild7]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild8]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild9]
-    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild10]
-
-    # Help the user find it if we cannot.
-    DOC "The ${OpenIGTLink_DIR_STRING}"
-  )
-ENDIF(NOT OpenIGTLink_DIR)
-
-# If OpenIGTLink was found, load the configuration file to get the rest of the
-# settings.
-IF(OpenIGTLink_DIR)
-  SET(OpenIGTLink_FOUND 1)
-  INCLUDE(${OpenIGTLink_DIR}/OpenIGTLinkConfig.cmake)
-
-  # Set USE_OpenIGTLink_FILE for backward-compatability.
-  SET(USE_OpenIGTLink_FILE ${OpenIGTLink_USE_FILE})
-ELSE(OpenIGTLink_DIR)
-  SET(OpenIGTLink_FOUND 0)
-  IF(OpenIGTLink_FIND_REQUIRED)
-    MESSAGE(FATAL_ERROR "Please set OpenIGTLink_DIR to the ${OpenIGTLink_DIR_STRING}")
-  ENDIF(OpenIGTLink_FIND_REQUIRED)
-ENDIF(OpenIGTLink_DIR)
-
-
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index a11a6f3b..4b19e090 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -1,15 +1,17 @@
-# list of libraries
+# Build library dependency list
 # Note: this part should be moved to OpenIGTLinkConfigPlatform.cmake
-IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
-  SET(LINK_LIBS
+IF(WIN32)
+  # for Windows
+  LIST(APPEND LINK_LIBS
     ws2_32
     wsock32
     )
   #For debug under win32 system, the run time check mode should be set to /RTCu for multithreading purpose
   STRING(REPLACE "/RTC1" "/RTCu" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
   SET(OpenIGTLink_REQUIRED_CXX_FLAGS ${OpenIGTLink_REQUIRED_CXX_FLAGS})
-ELSE() # for POSIX-compatible OSs
-  SET(LINK_LIBS
+ELSE()
+  # for POSIX-compatible OSs
+  LIST(APPEND LINK_LIBS
     m
     pthread
     )
@@ -17,7 +19,7 @@ ELSE() # for POSIX-compatible OSs
     LIST(APPEND LINK_LIBS
       c
       socket
-    )
+      )
   ENDIF()
   IF(OpenIGTLink_PLATFORM_SUNOS)
     LIST(APPEND LINK_LIBS
@@ -26,14 +28,12 @@ ELSE() # for POSIX-compatible OSs
   ENDIF()
 ENDIF()
 
-ADD_SUBDIRECTORY( igtlutil )
-
+#-----------------------------------------------------------------------------
+# Include directories
 SET(OpenIGTLink_INCLUDE_DIRS
   ${CMAKE_BINARY_DIR}
   ${CMAKE_CURRENT_SOURCE_DIR}
   ${CMAKE_CURRENT_BINARY_DIR}
-  ${CMAKE_CURRENT_SOURCE_DIR}/igtlutil
-  ${CMAKE_CURRENT_BINARY_DIR}/igtlutil
   )
 
 SET(OpenIGTLink_SOURCES
@@ -70,7 +70,7 @@ SET(OpenIGTLink_SOURCES
   )
 
 SET(OpenIGTLink_INCLUDE_FILES)
-IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
+IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
   LIST(APPEND OpenIGTLink_INCLUDE_FILES
     igtlutil/igtl_header.h
     igtlutil/igtl_image.h
@@ -118,7 +118,7 @@ IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
 ENDIF()
 
 # Add support for OpenIGTLink version 2
-IF (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1" )
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
   LIST(APPEND OpenIGTLink_SOURCES
     igtlutil/igtl_colortable.c
     igtlutil/igtl_imgmeta.c
@@ -148,7 +148,7 @@ IF (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1" )
     igtlBindMessage.cxx
     igtlNDArrayMessage.cxx
     )
-  IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
+  IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
     LIST(APPEND OpenIGTLink_INCLUDE_FILES
       igtlutil/igtl_colortable.h
       igtlutil/igtl_imgmeta.h
@@ -182,7 +182,7 @@ IF (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1" )
 ENDIF()
 
 # Add support for OpenIGTLink version 3
-IF( ${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" )
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
   LIST(APPEND OpenIGTLink_SOURCES
     igtlCommandMessage.cxx
     igtlQueryMessage.cxx
@@ -193,7 +193,7 @@ IF( ${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" )
     igtlUDPClientSocket.cxx
     igtlUDPServerSocket.cxx
     )
-  IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
+  IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
     LIST(APPEND OpenIGTLink_INCLUDE_FILES
       igtlCommandMessage.h
       igtlQueryMessage.h
@@ -211,29 +211,59 @@ ENDIF()
 # Configure VideoStreaming
 # Create the link to the VideoStreaming libraries
 IF(BUILD_VIDEOSTREAM)
-  include(${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VideoStreaming.cmake)
+  IF(USE_H264)
+    FIND_PACKAGE(OpenH264 REQUIRED)
+    LIST(APPEND LINK_LIBS OpenH264)
+  ENDIF()
+
+  IF(USE_VP9)
+    FIND_PACKAGE(VP9 REQUIRED)
+    LIST(APPEND LINK_LIBS VP9)
+  ENDIF()
+
+  IF(USE_X265)
+    FIND_PACKAGE(x265 REQUIRED)
+    LIST(APPEND LINK_LIBS x265)
+  ENDIF()
+
+  IF(USE_OPENHEVC)
+    FIND_PACKAGE(OpenHEVC REQUIRED)
+    LIST(APPEND LINK_LIBS OpenHEVC)
+  ENDIF()
+
+  INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/VideoStreaming/VideoStreaming.cmake)
 ENDIF()
-#-----------------------------------------------------------------------------
 
 #-----------------------------------------------------------------------------
 # Configure WebSocket
 # Create the link to the WebSocket libraries
 IF(BUILD_WEBSOCKET)
-  include(${PROJECT_SOURCE_DIR}/Source/WebSocket/WebSocket.cmake)
-  ADD_SUBDIRECTORY(${PROJECT_BINARY_DIR}/websocketpp ${PROJECT_BINARY_DIR})
-  include(${PROJECT_BINARY_DIR}/websocketpp/WebSocketConfig.cmake)
+  FIND_PACKAGE(WebSocket REQUIRED)
+  LIST(APPEND LINK_LIBS WebSocket)
+
+  LIST(APPEND OpenIGTLink_SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebServerSocket.cxx
+    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebClientSocket.cxx
+  )
+  
+  LIST(APPEND OpenIGTLink_INCLUDE_FILES
+    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebServerSocket.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebClientSocket.h
+  )
+
+  LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket
 ENDIF()
-#-----------------------------------------------------------------------------
 
+#-----------------------------------------------------------------------------
+# Create the library
 ADD_LIBRARY(OpenIGTLink ${OpenIGTLink_SOURCES} ${OpenIGTLink_INCLUDE_FILES})
 foreach(p IN LISTS OpenIGTLink_INCLUDE_DIRS)
-  target_include_directories(OpenIGTLink PUBLIC 
-    $<BUILD_INTERFACE:${p}>)
+  target_include_directories(OpenIGTLink PUBLIC $<BUILD_INTERFACE:${p}>)
 endforeach()
-target_include_directories(OpenIGTLink PUBLIC 
-  $<INSTALL_INTERFACE:${OpenIGTLink_INSTALL_INCLUDE_DIR}>)
+target_include_directories(OpenIGTLink PUBLIC $<INSTALL_INTERFACE:${OpenIGTLink_INSTALL_INCLUDE_DIR}>)
 
-TARGET_LINK_LIBRARIES(OpenIGTLink PUBLIC ${LINK_LIBS})
+TARGET_LINK_LIBRARIES(OpenIGTLink PUBLIC ${LINK_LIBS} igtlutil)
 
 IF(MSVC)
   target_compile_options(OpenIGTLink PRIVATE /MP)
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index e28489f7..df6eddc1 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -1,191 +1,7 @@
-#-----------------------------------------------------------------------------
-# OpenH264
-IF(LINK_H264)
-  configure_file(${OpenIGTLink_SOURCE_DIR}/SuperBuild/CMakeListsOpenH264.txt.in
-  ${PROJECT_BINARY_DIR}/OpenH264-download/CMakeLists.txt)
-	#Here the downloading project is triggered                                                               
-	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/OpenH264-download" )
-	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/OpenH264-download" )   
-  set(H264_SOURCE_DIR "" CACHE PATH "H264 source directory")
-  set(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory")                    
-	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")             
-					execute_process(COMMAND "make" WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/OpenH264" )             
-        set(H264_SOURCE_DIR "${PROJECT_BINARY_DIR}/OpenH264" CACHE PATH "H264 source directory" FORCE)
-        set(H264_LIBRARY_DIR "${PROJECT_BINARY_DIR}/OpenH264" CACHE PATH "H264 source directory" FORCE)          
-	endif(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
-	IF(NOT ${H264_SOURCE_DIR} EQUAL "")
-  	include_directories("${H264_SOURCE_DIR}")
-  ENDIF()
-  IF(NOT ${H264_LIBRARY_DIR} EQUAL "")	
-    include_directories("${H264_LIBRARY_DIR}")
-    LINK_DIRECTORIES("${H264_LIBRARY_DIR}")
-  ENDIF()
-ENDIF()
-
-# VP9 codec
-IF(LINK_VP9)
-  configure_file(${OpenIGTLink_SOURCE_DIR}/SuperBuild/CMakeListsVPX.txt.in
-  ${PROJECT_BINARY_DIR}/OpenVPX-download/CMakeLists.txt)
-  #Here the downloading project is triggered
-  execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
-                  WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/OpenVPX-download" )
-  execute_process(COMMAND "${CMAKE_COMMAND}" --build .
-              WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/OpenVPX-download" )
-  set(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory")
-  set(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")            
-  if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
-    #execute_process(COMMAND "cd" "${PROJECT_BINARY_DIR}/OpenVPX/configure")
-    execute_process(COMMAND "${PROJECT_BINARY_DIR}/OpenVPX/configure" --disable-examples --disable-tools --disable-docs --disable-vp8 --disable-libyuv --disable-unit_tests --disable-postproc WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/OpenVPX" )
-    execute_process(COMMAND "make" WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/OpenVPX" )
-    set(VP9_SOURCE_DIR "${PROJECT_BINARY_DIR}/OpenVPX" CACHE PATH "VP9 source directory" FORCE)
-    set(VP9_LIBRARY_DIR "${PROJECT_BINARY_DIR}/OpenVPX" CACHE PATH "VP9 library directory" FORCE) 
-  endif(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
-  IF(NOT ${VP9_SOURCE_DIR} EQUAL "")
-  	include_directories("${VP9_SOURCE_DIR}")
-  ENDIF()
-  IF(NOT ${VP9_LIBRARY_DIR} EQUAL "")	
-    include_directories("${VP9_LIBRARY_DIR}")
-    LINK_DIRECTORIES("${VP9_LIBRARY_DIR}")
-  ENDIF()
-ENDIF()
-
-
-# VPX codec
-IF(LINK_X265)
-  set(X265_SOURCE_DIR "" CACHE PATH "X265 source directory")
-  set(X265_LIBRARY_DIR "" CACHE PATH "X265 library directory")
-  IF(NOT ${X265_SOURCE_DIR} EQUAL "")
-  	include_directories("${X265_SOURCE_DIR}")
-  ENDIF()
-  IF(NOT ${X265_LIBRARY_DIR} EQUAL "")	
-    include_directories("${X265_LIBRARY_DIR}")
-    LINK_DIRECTORIES("${X265_LIBRARY_DIR}")
-  ENDIF()
-ENDIF()
-
-IF(LINK_OPENHEVC)
-  set(OPENHEVC_LIBRARY_DIR "" CACHE PATH "HEVC decoder library directory")
-  set(OPENHEVC_SOURCE_DIR "" CACHE PATH "HEVC decoder source directory")
-  IF(NOT ${OPENHEVC_SOURCE_DIR} EQUAL "")
-  	include_directories("${OPENHEVC_SOURCE_DIR}")
-  ENDIF()
-  IF(NOT ${OPENHEVC_LIBRARY_DIR} EQUAL "")	
-    include_directories("${OPENHEVC_LIBRARY_DIR}")
-    LINK_DIRECTORIES("${OPENHEVC_LIBRARY_DIR}")
-  ENDIF()
-ENDIF()
-
-IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
-  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_H264)
-		SET(LINK_LIBS
-    ${LINK_LIBS}
-    ${H264_LIBRARY_DIR}/openh264.lib
-    )
-	  #SET(LINK_LIBS ${TEMP_LINK_LIBS} PARENT_SCOPE)    ## Set local and the parent scope. Use Cache internal might be a better solution 
-  ENDIF()
-  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_VP9)
-    #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
-    SET(LINK_VP9_LIBRARY optimized ${VP9_LIBRARY_DIR}\\$(Platform)\\Release\\vpxmd.lib debug ${VP9_LIBRARY_DIR}\\$(Platform)\\Debug\\vpxmdd.lib)
-    SET(LINK_LIBS
-      ${LINK_LIBS}
-      ${LINK_VP9_LIBRARY}
-    )
-  ENDIF()
-  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_X265)
-    SET(LINK_X265_LIBRARY optimized ${X265_LIBRARY_DIR}\\Release\\x265-static.lib debug ${X265_LIBRARY_DIR}\\Debug\\x265-static.lib)
-    SET(LINK_LIBS
-      ${LINK_LIBS}
-      ${LINK_X265_LIBRARY}
-    )
-  ENDIF()
-	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_OPENHEVC)
-    SET(LINK_OPENHEVC_LIBRARY ${OPENHEVC_LIBRARY_DIR}\\libLibOpenHevcWrapper.dll)
-		SET(LINK_LIBS
-      ${LINK_LIBS}
-      ${LINK_OPENHEVC_LIBRARY}
-    )
-  ENDIF()  
-ELSE() # for POSIX-compatible OSs
-	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_H264)
-		SET(LINK_LIBS
-		  ${LINK_LIBS}
-		  ${H264_LIBRARY_DIR}/libopenh264.a
-		)
-	ENDIF()
-  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_VP9)
-    SET(LINK_LIBS
-      ${LINK_LIBS}
-      ${VP9_LIBRARY_DIR}/libvpx.a
-    )
-  ENDIF()
-  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_X265)
-    SET(LINK_X265_LIBRARY optimized ${X265_LIBRARY_DIR}/libx265.a debug ${X265_LIBRARY_DIR}/libx265.a)
-    SET(LINK_LIBS
-      ${LINK_LIBS}
-      ${LINK_X265_LIBRARY}
-    )
-  ENDIF()
-  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_OPENHEVC)
-    SET(LINK_OPENHEVC_LIBRARY ${OPENHEVC_LIBRARY_DIR}/libLibOpenHevcWrapper.a)
-    SET(LINK_LIBS
-      ${LINK_LIBS}
-      ${LINK_OPENHEVC_LIBRARY}
-    )
-  ENDIF()	
-ENDIF()
-
-  
-IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_H264)
-	SET(OpenIGTLink_INCLUDE_DIRS
-	${OpenIGTLink_INCLUDE_DIRS}
-  ${H264_SOURCE_DIR}/codec
-  ${H264_SOURCE_DIR}/codec/common/inc
-  ${H264_SOURCE_DIR}/codec/console/common/src
-	${H264_SOURCE_DIR}/codec/console/common/inc
-	${H264_SOURCE_DIR}/codec/console/dec/inc
-	${H264_SOURCE_DIR}/codec/console/enc/src
-	${H264_SOURCE_DIR}/codec/api/svc
-	${H264_SOURCE_DIR}/codec/encoder/core/inc
-	${H264_SOURCE_DIR}/codec/processing/interface
-	${H264_SOURCE_DIR}/test
-	)
-ENDIF()
-
-IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_VP9)
-  SET(OpenIGTLink_INCLUDE_DIRS
-    ${OpenIGTLink_INCLUDE_DIRS}
-    "${VP9_SOURCE_DIR}"
-    "${VP9_SOURCE_DIR}/vpx"
-    "${VP9_SOURCE_DIR}/vp9"
-    "${VP9_SOURCE_DIR}/vp9/common"
-    "${VP9_LIBRARY_DIR}"
-  )
-ENDIF()
-
-IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_X265)
-  SET(OpenIGTLink_INCLUDE_DIRS
-    ${OpenIGTLink_INCLUDE_DIRS}
-    "${X265_SOURCE_DIR}"
-    "${X265_LIBRARY_DIR}"
-  )
-ENDIF()
-
-IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND LINK_OPENHEVC)
-  SET(OpenIGTLink_INCLUDE_DIRS
-    ${OpenIGTLink_INCLUDE_DIRS}
-    "${OPENHEVC_SOURCE_DIR}"
-	  "${OPENHEVC_SOURCE_DIR}/platform/arm" # To be removed
-    "${OPENHEVC_LIBRARY_DIR}"
-  )
-ENDIF()
-
 # Add support for OpenIGTLink version 3
-IF( ${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LINK_X265 OR LINK_OPENHEVC))
-  SET(OpenIGTLink_INCLUDE_DIRS ${OpenIGTLink_INCLUDE_DIRS} "${PROJECT_SOURCE_DIR}/Source/VideoStreaming")
-  SET(OpenIGTLink_SOURCES
-    ${OpenIGTLink_SOURCES} 
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LINK_X265 OR LINK_OPENHEVC))
+  LIST(APPEND OpenIGTLink_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/Source/VideoStreaming)
+  LIST(APPEND OpenIGTLink_SOURCES
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtl_video.c
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtl_videometa.c
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlVideoMessage.cxx
@@ -194,13 +10,11 @@ IF( ${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LI
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlCodecCommonClasses.cxx
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlVideoMetaMessage.cxx
     )
-	SET(OpenIGTLink_INCLUDE_DIRS
-    ${OpenIGTLink_INCLUDE_DIRS}
+  LIST(APPENDOpenIGTLink_INCLUDE_DIRS
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming
-  )
-  IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
-    SET(OpenIGTLink_INCLUDE_FILES
-      ${OpenIGTLink_INCLUDE_FILES} 
+    )
+  IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+    LIST(APPEND OpenIGTLink_INCLUDE_FILES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtl_video.h
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtl_videometa.h
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlVideoMessage.h
@@ -210,17 +24,15 @@ IF( ${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LI
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlVideoMetaMessage.h
       )
   ENDIF()
-  IF(LINK_H264)
-    SET(OpenIGTLink_SOURCES
-      ${OpenIGTLink_SOURCES}
+  IF(USE_H264 AND OpenH264_FOUND)
+    LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.cxx
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.cxx
       ${H264_SOURCE_DIR}/test/api/sha1.c
       ${H264_SOURCE_DIR}/codec/console/common/src/read_config.cpp
-    )
-    IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
-      SET(OpenIGTLink_INCLUDE_FILES
-      	${OpenIGTLink_INCLUDE_FILES} 
+      )
+    IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+      LIST(APPEND OpenIGTLink_INCLUDE_FILES
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.h
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.h
         ${H264_SOURCE_DIR}/test/sha1.h
@@ -228,19 +40,18 @@ IF( ${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LI
       )
     ENDIF()
   ENDIF()
-  IF(LINK_VP9)
-    SET(OpenIGTLink_SOURCES
-    	${OpenIGTLink_SOURCES}
+
+  IF(USE_VP9 AND VP9_FOUND)
+    LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Decoder.cxx
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Encoder.cxx
       ${VP9_SOURCE_DIR}/tools_common.c
       ${VP9_SOURCE_DIR}/video_reader.c
       ${VP9_SOURCE_DIR}/ivfdec.c
       ${VP9_LIBRARY_DIR}/vpx_config.c
-    )
-    IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
-      SET(OpenIGTLink_INCLUDE_FILES
-      	${OpenIGTLink_INCLUDE_FILES}
+      )
+    IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+      LIST(APPEND OpenIGTLink_INCLUDE_FILES
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Decoder.h
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Encoder.h
         ${VP9_LIBRARY_DIR}/vpx_config.h
@@ -250,26 +61,24 @@ IF( ${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LI
       )
     ENDIF()
   ENDIF()
-  IF(LINK_X265)
-    SET(OpenIGTLink_SOURCES
-      ${OpenIGTLink_SOURCES}
+
+  IF(USE_X265 AND X265_FOUND)
+    LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.cxx
-    )
-    IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
-      SET(OpenIGTLink_INCLUDE_FILES
-        ${OpenIGTLink_INCLUDE_FILES}
+      )
+    IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+      LIST(APPEND OpenIGTLink_INCLUDE_FILES
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.h
         )
     ENDIF()
   ENDIF()
-  IF(LINK_OPENHEVC)
-    SET(OpenIGTLink_SOURCES
-      ${OpenIGTLink_SOURCES}
+
+  IF(USE_OPENHEVC and OpenHEVC_FOUND)
+    LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Decoder.cxx
-    )
-    IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode" )
-      SET(OpenIGTLink_INCLUDE_FILES
-        ${OpenIGTLink_INCLUDE_FILES}
+      )
+    IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+      LIST(APPEND OpenIGTLink_INCLUDE_FILES
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Decoder.h
         )
     ENDIF()
diff --git a/Source/WebSocket/WebSocket.cmake b/Source/WebSocket/WebSocket.cmake
deleted file mode 100644
index ce8b9e72..00000000
--- a/Source/WebSocket/WebSocket.cmake
+++ /dev/null
@@ -1,28 +0,0 @@
-IF(BUILD_WEBSOCKET)
-  # Download and unpack Websocket at configure time
-  configure_file(${OpenIGTLink_SOURCE_DIR}/SuperBuild/CMakeListsWebSocket.txt.in
-  ${PROJECT_BINARY_DIR}/WebSocket-download/CMakeLists.txt)
-	#Here the downloading project is triggered                                                               
-	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/WebSocket-download" )
-	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/WebSocket-download" ) 		
-
-  SET(OpenIGTLink_INCLUDE_DIRS
-    ${OpenIGTLink_INCLUDE_DIRS}
-    ${PROJECT_SOURCE_DIR}/Source/WebSocket
-		${PROJECT_BINARY_DIR}/websocketpp
-    ${PROJECT_BINARY_DIR}/websocketpp/websocketpp
-  )
-  SET(OpenIGTLink_SOURCES
-    ${OpenIGTLink_SOURCES}
-    ${PROJECT_SOURCE_DIR}/Source/WebSocket/igtlWebServerSocket.cxx
-    ${PROJECT_SOURCE_DIR}/Source/WebSocket/igtlWebClientSocket.cxx
-  )
-  
-  SET(OpenIGTLink_INCLUDE_FILES
-    ${OpenIGTLink_INCLUDE_FILES}
-    ${PROJECT_SOURCE_DIR}/Source/WebSocket/igtlWebServerSocket.h
-    ${PROJECT_SOURCE_DIR}/Source/WebSocket/igtlWebClientSocket.h
-  )
-ENDIF()
diff --git a/Source/igtlutil/CMakeLists.txt b/Source/igtlutil/CMakeLists.txt
index d0a216e3..26a6767d 100644
--- a/Source/igtlutil/CMakeLists.txt
+++ b/Source/igtlutil/CMakeLists.txt
@@ -1,14 +1,21 @@
-#SET(IGTL_UTIL_PROTOCOL_VERSION "1")
-#SET(IGTL_UTIL_PROTOCOL_VERSION ${OpenIGTLink_PROTOCOL_VERSION})
+PROJECT(igtlutil)
 
-if(OpenIGTLink_BUILD_SHARED_LIBS)
-  set(igtlutil_BUILD_SHARED_LIBS ${OpenIGTLink_BUILD_SHARED_LIBS})
-endif(OpenIGTLink_BUILD_SHARED_LIBS)
+#-----------------------------------------------------------------------------
+# Include directories
+SET(igtlutil_INCLUDE_DIRS
+  ${CMAKE_BINARY_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_BINARY_DIR}
+  )
+
+IF(OpenIGTLink_BUILD_SHARED_LIBS)
+  SET(igtlutil_BUILD_SHARED_LIBS ${OpenIGTLink_BUILD_SHARED_LIBS})
+ENDIF()
 
-if(OpenIGTLink_BUILD_GENERATE_PIC)
-  set(igtlutil_BUILD_GENERATE_PIC ${OpenIGTLink_BUILD_GENERATE_PIC})
-  set(IGTLSTATIC 1)
-endif(OpenIGTLink_BUILD_GENERATE_PIC)
+IF(OpenIGTLink_BUILD_GENERATE_PIC)
+  SET(igtlutil_BUILD_GENERATE_PIC ${OpenIGTLink_BUILD_GENERATE_PIC})
+  SET(IGTLSTATIC 1)
+ENDIF()
 
 SET(igtlutil_HEADS
   igtl_header.h
@@ -29,7 +36,7 @@ SET(igtlutil_SOURCES
   igtl_capability.c
   )
 
-if (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
   SET(igtlutil_HEADS
     ${igtlutil_HEADS}
     igtl_colortable.h
@@ -64,9 +71,9 @@ if (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
     igtl_qtrans.c
     igtl_polydata.c
     )
-endif (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
+ENDIF()
 
-if (${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
   SET(igtlutil_HEADS
     ${igtlutil_HEADS}
     igtl_command.h
@@ -75,9 +82,9 @@ if (${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
     ${igtlutil_SOURCES}
     igtl_command.c
     )
-endif (${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
+ENDIF()
 
-IF( MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
   ADD_LIBRARY(igtlutil
     ${igtlutil_SOURCES}
     ${igtlutil_HEADS}
@@ -88,6 +95,11 @@ ELSE()
     )
 ENDIF()
 
+FOREACH(p IN LISTS igtlutil_INCLUDE_DIRS)
+  target_include_directories(igtlutil PUBLIC $<BUILD_INTERFACE:${p}>)
+ENDFOREACH()
+target_include_directories(igtlutil PUBLIC $<INSTALL_INTERFACE:${igtlutil_INSTALL_INCLUDE_DIR}>)
+
 IF(MSVC)
   target_compile_options(igtlutil PRIVATE /MP)
 ENDIF()
@@ -97,6 +109,11 @@ SET_TARGET_PROPERTIES(igtlutil PROPERTIES
   SOVERSION ${OpenIGTLink_VERSION_MAJOR}
 )
 
-#TARGET_LINK_LIBRARIES(igtlutil
-#  ${LIBS}
-#  )
+INSTALL(FILES ${igtlutil_HEADS}
+  DESTINATION ${igtlutil_INSTALL_INCLUDE_DIR}
+  COMPONENT Development)
+
+INSTALL(TARGETS OpenIGTLink EXPORT OpenIGTLink
+  RUNTIME DESTINATION ${OpenIGTLink_INSTALL_BIN_DIR} COMPONENT RuntimeLibraries
+  LIBRARY DESTINATION ${OpenIGTLink_INSTALL_LIB_DIR} COMPONENT RuntimeLibraries
+  ARCHIVE DESTINATION ${OpenIGTLink_INSTALL_LIB_DIR} COMPONENT Development)
\ No newline at end of file
diff --git a/SuperBuild/CMakeListsOpenH264.txt.in b/SuperBuild/CMakeListsOpenH264.txt.in
deleted file mode 100644
index fcbb0fdc..00000000
--- a/SuperBuild/CMakeListsOpenH264.txt.in
+++ /dev/null
@@ -1,15 +0,0 @@
-
-cmake_minimum_required(VERSION 2.8.2)
- 
-project(OpenH264-download NONE)
-include(ExternalProject)
-ExternalProject_Add(OpenH264
-  GIT_REPOSITORY https://github.com/leochan2009/openh264.git
-  GIT_TAG fe82c0693484dbbcb6ec7b29b98864892d24d301
-  SOURCE_DIR        "${PROJECT_BINARY_DIR}/OpenH264"
-  BINARY_DIR        "${PROJECT_BINARY_DIR}/OpenH264"
-  CONFIGURE_COMMAND ""
-  BUILD_COMMAND     ""
-  INSTALL_COMMAND   ""
-  TEST_COMMAND      ""
-)
diff --git a/SuperBuild/CMakeListsVPX.txt.in b/SuperBuild/CMakeListsVPX.txt.in
deleted file mode 100644
index a98e41eb..00000000
--- a/SuperBuild/CMakeListsVPX.txt.in
+++ /dev/null
@@ -1,15 +0,0 @@
-
-cmake_minimum_required(VERSION 2.8.2)
- 
-project(OpenVPX-download NONE)
-include(ExternalProject)
-ExternalProject_Add(OpenVPX
-  GIT_REPOSITORY https://github.com/webmproject/libvpx/
-  GIT_TAG master
-  SOURCE_DIR        "${PROJECT_BINARY_DIR}/OpenVPX"
-  BINARY_DIR        "${PROJECT_BINARY_DIR}/OpenVPX"
-  CONFIGURE_COMMAND ""
-  BUILD_COMMAND     ""
-  INSTALL_COMMAND   ""
-  TEST_COMMAND      ""
-)
diff --git a/SuperBuild/CMakeListsWebSocket.txt.in b/SuperBuild/CMakeListsWebSocket.txt.in
deleted file mode 100755
index 207b8e44..00000000
--- a/SuperBuild/CMakeListsWebSocket.txt.in
+++ /dev/null
@@ -1,23 +0,0 @@
-cmake_minimum_required(VERSION 2.8.2)
- 
-project(WebSocket-download NONE)
-include(ExternalProject)
-
-set(ConfigureCommand "")
-set(BuildCommand "")
-
-if (NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
-        set(ConfigureCommand "${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF ${CMAKE_BINARY_DIR}/websocketpp")
-        set(BuildCommand "make")
-endif(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
-
-ExternalProject_Add(WebSocketpp
-  GIT_REPOSITORY https://github.com/leochan2009/websocketpp.git
-  GIT_TAG e50fb00bec150fc1e377cab272a918c8b4453a82
-  SOURCE_DIR        "${PROJECT_BINARY_DIR}/websocketpp"
-  BINARY_DIR        "${PROJECT_BINARY_DIR}/websocketpp"
-  CONFIGURE_COMMAND ConfigureCommand
-  BUILD_COMMAND     BuildCommand
-  INSTALL_COMMAND   ""
-  TEST_COMMAND      ""
-)
\ No newline at end of file
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
new file mode 100644
index 00000000..d7d52996
--- /dev/null
+++ b/SuperBuild/External_x265.cmake
@@ -0,0 +1,45 @@
+IF(x265_DIR)
+  # x265 has been built already
+  FIND_PACKAGE(x265 REQUIRED)
+
+  MESSAGE(STATUS "Using x265 available at: ${x265_DIR}")
+
+  SET(OpenIGTLink_x265_DIR "${x265_DIR}" CACHE INTERNAL "Path to store x265 binaries")
+ELSE()
+  # x265 has not been built yet, so download and build it as an external project
+  SET(GIT_REPOSITORY "https://github.com/videolan/x265.git")
+  SET(GIT_TAG "2.5")
+
+  IF(MSVC)
+    LIST(APPEND PLATFORM_SPECIFIC_ARGS -DCMAKE_CXX_MP_FLAG:BOOL=ON)
+  ENDIF()
+  
+  MESSAGE(STATUS "Downloading x265 ${GIT_TAG} from: ${GIT_REPOSITORY}")
+
+  SET (OpenIGTLink_x265_SRC_DIR "${CMAKE_BINARY_DIR}/Deps/x265")
+  SET (OpenIGTLink_x265_DIR "${CMAKE_BINARY_DIR}/Deps/x265-bin" CACHE INTERNAL "Path to store x265 binaries")
+
+  ExternalProject_Add( x265
+    PREFIX "${CMAKE_BINARY_DIR}/Deps/x265-prefix"
+    SOURCE_DIR "${OpenIGTLink_x265_SRC_DIR}"
+    SOURCE_SUBDIR source
+    BINARY_DIR "${OpenIGTLink_x265_DIR}"
+    #--Download step--------------
+    GIT_REPOSITORY "${GIT_REPOSITORY}"
+    GIT_TAG ${GIT_TAG}
+    #--Configure step-------------
+    CMAKE_ARGS
+      ${PLATFORM_SPECIFIC_ARGS}
+      -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/x265-install"
+      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+      -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+      -DBUILD_TESTING:BOOL=OFF 
+      -DBUILD_EXAMPLES:BOOL=OFF
+      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+    #--Build step-----------------
+    BUILD_ALWAYS 1
+    )
+ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
new file mode 100644
index 00000000..08b80749
--- /dev/null
+++ b/SuperBuild/Superbuild.cmake
@@ -0,0 +1,63 @@
+#---------------------------------------------------
+SET(OpenIGTLink_DEPENDENCIES)
+
+#---------------------------------------------------
+# VideoStreaming dependencies
+IF(USE_H264)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_OpenH264.cmake)
+  LIST(APPEND OpenIGTLink_DEPENDENCIES openh264)
+ENDIF()
+
+IF(USE_VP9)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_VPX.cmake)
+  LIST(APPEND OpenIGTLink_DEPENDENCIES vpx)
+ENDIF()
+
+IF(USE_X265)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_x265.cmake)
+  LIST(APPEND OpenIGTLink_DEPENDENCIES x265)
+ENDIF()
+
+IF(USE_OPENHEVC)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_OpenHEVC.cmake)
+  LIST(APPEND OpenIGTLink_DEPENDENCIES openHEVC)
+ENDIF()
+
+IF(BUILD_WEBSOCKET)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_WebSocket.cmake)
+  LIST(APPEND OpenIGTLink_DEPENDENCIES websocket)
+ENDIF()
+
+IF(BUILD_TESTING AND USE_GTEST)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_googletest.cmake)
+  LIST(APPEND OpenIGTLink_DEPENDENCIES googletest)
+ENDIF()
+
+#---------------------------------------------------
+# OpenIGTLink library
+ExternalProject_Add( OpenIGTLink-lib
+  PREFIX "${CMAKE_BINARY_DIR}/OpenIGTLink-prefix"
+  SOURCE_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink"
+  BINARY_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink-bin"
+  #--Download step--------------
+  GIT_REPOSITORY "https://github.com/openigtlink/OpenIGTLink.git"
+  GIT_TAG master
+  #--Configure step-------------
+  CMAKE_ARGS
+    ${PLATFORM_SPECIFIC_ARGS}
+    -DIGTL_SUPERBUILD:BOOL=OFF
+    -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+    -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+    -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+    -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+    -DBUILD_TESTING:BOOL=${BUILD_TESTING}
+    -DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
+    -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+    -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+    -DGTEST_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
+    -DGMOCK_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
+  #--Build step-----------------
+  BUILD_ALWAYS 1
+  DEPENDS ${OpenIGTLink_DEPENDENCIES}
+  )
\ No newline at end of file
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index a14d488c..e6bfa3ec 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -1,215 +1,175 @@
-PROJECT( OpenIGTLinkTesting )
-
-cmake_minimum_required(VERSION 2.9)
-find_package(OpenIGTLink REQUIRED)
-include(${OpenIGTLink_USE_FILE})
-include_directories(${OpenIGTLink_INCLUDE_DIRS})
-link_directories(${OpenIGTLink_LIBRARY_DIRS})
-include_directories(${PROJECT_BINARY_DIR})
-OPTION(USE_GTEST "Build the testing tree." ON)
-IF(USE_GTEST)
-	SET(OpenIGTLink_USE_GTEST "1")
-ELSE()
-  SET(OpenIGTLink_USE_GTEST "0")
-ENDIF()	
-configure_file(${PROJECT_SOURCE_DIR}/igtlTestConfig.h.in ${PROJECT_BINARY_DIR}/igtlTestConfig.h)
-ENABLE_TESTING()
-ADD_SUBDIRECTORY( igtlutil )
+PROJECT(OpenIGTLinkTesting)
+
+CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
+
+OPTION(USE_GTEST "Use Googletest to drive the testing." ON)
+CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/igtlTestConfig.h.in ${PROJECT_BINARY_DIR}/igtlTestConfig.h)
+
 IF(OpenIGTLink_USE_GTEST)
-	#-----------
-	#download of GoogleTest
-	if( MSVC ) # VS2012 doesn't support correctly the tuples yet
-		add_definitions("-D_VARIADIC_MAX=10")
-	endif()
-	# Download and unpack googletest at configure time
-	configure_file(CMakeLists.txt.in
-								 googletest-download/CMakeLists.txt)
-	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 
-		WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/googletest-download" )
-
-	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
-		WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/googletest-download" )
-
-	# Prevent GoogleTest from overriding our compiler/linker options
-	# when building with Visual Studio
-	set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-
-	# Add googletest directly to our build. This adds
-	# the following targets: gtest, gtest_main, gmock
-	# and gmock_main
-	add_subdirectory("${PROJECT_BINARY_DIR}/gmock"
-									 "${PROJECT_BINARY_DIR}/gmock-build" )
-
-	# The gtest/gmock targets carry header search path
-	# dependencies automatically when using CMake 2.8.11 or
-	# later. Otherwise we have to add them here ourselves.
-	include_directories("${gtest_SOURCE_DIR}/include")
-	include_directories("${gmock_SOURCE_DIR}/include")
-#---------------
+  IF(${CMAKE_GENERATOR} MATCHES "Visual Studio 11" ) # VS2012 doesn't support correctly the tuples yet
+    ADD_DEFINITIONS("-D_VARIADIC_MAX=10")
+  ENDIF()
+
+  # Prevent GoogleTest from overriding our compiler/linker options
+  # when building with Visual Studio
+  SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
+
+  FIND_PACKAGE(GTest REQUIRED)
+  FIND_PACKAGE(GMock REQUIRED)
 ENDIF()
 
-ADD_EXECUTABLE(igtlMultiThreaderTest1   igtlMultiThreaderTest1.cxx)
-ADD_EXECUTABLE(igtlMultiThreaderTest2   igtlMultiThreaderTest2.cxx)
-ADD_EXECUTABLE(igtlMultiThreaderTest3   igtlMultiThreaderTest3.cxx)
-ADD_EXECUTABLE(igtlMessageFactoryTest   igtlMessageFactoryTest.cxx)
-ADD_EXECUTABLE(igtlTimeStampTest1   igtlTimeStampTest1.cxx)
-ADD_EXECUTABLE(igtlMessageBaseTest   igtlMessageBaseTest.cxx)
-ADD_EXECUTABLE(igtlConditionVariableTest   igtlConditionVariableTest.cxx)
-
-ADD_EXECUTABLE(igtlImageMessageTest   igtlImageMessageTest.cxx)
-ADD_EXECUTABLE(igtlImageMessage2Test   igtlImageMessage2Test.cxx)
-ADD_EXECUTABLE(igtlTransformMessageTest   igtlTransformMessageTest.cxx)
-ADD_EXECUTABLE(igtlPositionMessageTest   igtlPositionMessageTest.cxx)
-ADD_EXECUTABLE(igtlStatusMessageTest   igtlStatusMessageTest.cxx)
-ADD_EXECUTABLE(igtlCapabilityMessageTest   igtlCapabilityMessageTest.cxx)
-
-#ADD_EXECUTABLE(igtlSocketTest         igtlSocketTest.cxx)
-#ADD_EXECUTABLE(igtlServerSocketTest   igtlServerSocketTest.cxx)
-#ADD_EXECUTABLE(igtlClientSocketTest   igtlClientSocketTest.cxx)
+ADD_SUBDIRECTORY(igtlutil)
+
+ADD_EXECUTABLE(igtlMultiThreaderTest1       igtlMultiThreaderTest1.cxx)
+ADD_EXECUTABLE(igtlMultiThreaderTest2       igtlMultiThreaderTest2.cxx)
+ADD_EXECUTABLE(igtlMultiThreaderTest3       igtlMultiThreaderTest3.cxx)
+ADD_EXECUTABLE(igtlMessageFactoryTest       igtlMessageFactoryTest.cxx)
+ADD_EXECUTABLE(igtlTimeStampTest1           igtlTimeStampTest1.cxx)
+ADD_EXECUTABLE(igtlMessageBaseTest          igtlMessageBaseTest.cxx)
+ADD_EXECUTABLE(igtlConditionVariableTest    igtlConditionVariableTest.cxx)
+
+ADD_EXECUTABLE(igtlImageMessageTest         igtlImageMessageTest.cxx)
+ADD_EXECUTABLE(igtlImageMessage2Test        igtlImageMessage2Test.cxx)
+ADD_EXECUTABLE(igtlTransformMessageTest     igtlTransformMessageTest.cxx)
+ADD_EXECUTABLE(igtlPositionMessageTest      igtlPositionMessageTest.cxx)
+ADD_EXECUTABLE(igtlStatusMessageTest        igtlStatusMessageTest.cxx)
+ADD_EXECUTABLE(igtlCapabilityMessageTest    igtlCapabilityMessageTest.cxx)
 
 # Message Tests Added in Version 2
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  ADD_EXECUTABLE(igtlBindMessageTest   igtlBindMessageTest.cxx)
-  ADD_EXECUTABLE(igtlColorTableMessageTest   igtlColorTableMessageTest.cxx)
-  ADD_EXECUTABLE(igtlLabelMetaMessageTest   igtlLabelMetaMessageTest.cxx)
-  ADD_EXECUTABLE(igtlNDArrayMessageTest   igtlNDArrayMessageTest.cxx)
-  ADD_EXECUTABLE(igtlImageMetaMessageTest   igtlImageMetaMessageTest.cxx)
-  ADD_EXECUTABLE(igtlPointMessageTest   igtlPointMessageTest.cxx)
-  ADD_EXECUTABLE(igtlPolyDataMessageTest   igtlPolyDataMessageTest.cxx)
-  ADD_EXECUTABLE(igtlSensorMessageTest   igtlSensorMessageTest.cxx)
-  ADD_EXECUTABLE(igtlStringMessageTest   igtlStringMessageTest.cxx)
-  ADD_EXECUTABLE(igtlTrackingDataMessageTest   igtlTrackingDataMessageTest.cxx)
-  ADD_EXECUTABLE(igtlTrajectoryMessageTest   igtlTrajectoryMessageTest.cxx)
+  ADD_EXECUTABLE(igtlBindMessageTest          igtlBindMessageTest.cxx)
+  ADD_EXECUTABLE(igtlColorTableMessageTest    igtlColorTableMessageTest.cxx)
+  ADD_EXECUTABLE(igtlLabelMetaMessageTest     igtlLabelMetaMessageTest.cxx)
+  ADD_EXECUTABLE(igtlNDArrayMessageTest       igtlNDArrayMessageTest.cxx)
+  ADD_EXECUTABLE(igtlImageMetaMessageTest     igtlImageMetaMessageTest.cxx)
+  ADD_EXECUTABLE(igtlPointMessageTest         igtlPointMessageTest.cxx)
+  ADD_EXECUTABLE(igtlPolyDataMessageTest      igtlPolyDataMessageTest.cxx)
+  ADD_EXECUTABLE(igtlSensorMessageTest        igtlSensorMessageTest.cxx)
+  ADD_EXECUTABLE(igtlStringMessageTest        igtlStringMessageTest.cxx)
+  ADD_EXECUTABLE(igtlTrackingDataMessageTest  igtlTrackingDataMessageTest.cxx)
+  ADD_EXECUTABLE(igtlTrajectoryMessageTest    igtlTrajectoryMessageTest.cxx)
 ENDIF()
 
 # Message Tests Added in Version 3
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
-  ADD_EXECUTABLE(igtlCommandMessageTest   igtlCommandMessageTest.cxx)
-  ADD_EXECUTABLE(igtlMessageRTPWrapperTest   igtlMessageRTPWrapperTest.cxx)
+  ADD_EXECUTABLE(igtlCommandMessageTest       igtlCommandMessageTest.cxx)
+  ADD_EXECUTABLE(igtlMessageRTPWrapperTest    igtlMessageRTPWrapperTest.cxx)
 ENDIF()
 
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
-  ADD_EXECUTABLE(igtlVideoMessageTest   igtlVideoMessageTest.cxx)
-  ADD_EXECUTABLE(igtlVideoMetaMessageTest   igtlVideoMetaMessageTest.cxx)
+  ADD_EXECUTABLE(igtlVideoMessageTest         igtlVideoMessageTest.cxx)
+  ADD_EXECUTABLE(igtlVideoMetaMessageTest     igtlVideoMetaMessageTest.cxx)
 ENDIF()
 
-
 IF(USE_GTEST)
-  SET(GTEST_LINK OpenIGTLink gtest_main gtest gmock_main gmock)
+  SET(GTEST_LINK OpenIGTLink GTest::Main GTest::GTest gmock_main gmock)
 ELSE()
   SET(GTEST_LINK OpenIGTLink)
 ENDIF()
 
-TARGET_LINK_LIBRARIES(igtlMultiThreaderTest1 OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMultiThreaderTest2 OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMultiThreaderTest3 OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMessageFactoryTest OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlTimeStampTest1 OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMessageBaseTest ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlMultiThreaderTest1    OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMultiThreaderTest2    OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMultiThreaderTest3    OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMessageFactoryTest    OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlTimeStampTest1        OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMessageBaseTest       ${GTEST_LINK})
 TARGET_LINK_LIBRARIES(igtlConditionVariableTest ${GTEST_LINK})
 
-TARGET_LINK_LIBRARIES(igtlImageMessageTest ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlImageMessage2Test ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlImageMessageTest      ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlImageMessage2Test     ${GTEST_LINK})
 TARGET_LINK_LIBRARIES(igtlCapabilityMessageTest ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlStatusMessageTest ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlTransformMessageTest ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlPositionMessageTest ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlStatusMessageTest     ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlTransformMessageTest  ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlPositionMessageTest   ${GTEST_LINK})
 
 # Message Tests Added in Version 2
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  TARGET_LINK_LIBRARIES(igtlBindMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlColorTableMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlLabelMetaMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlNDArrayMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlImageMetaMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlPointMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlPolyDataMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlSensorMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlStringMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlBindMessageTest         ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlColorTableMessageTest   ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlLabelMetaMessageTest    ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlNDArrayMessageTest      ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlImageMetaMessageTest    ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlPointMessageTest        ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlPolyDataMessageTest     ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlSensorMessageTest       ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlStringMessageTest       ${GTEST_LINK})
   TARGET_LINK_LIBRARIES(igtlTrackingDataMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlTrajectoryMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlTrajectoryMessageTest   ${GTEST_LINK})
 ENDIF()
 
 # Message Tests Added in Version 3
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
-  TARGET_LINK_LIBRARIES(igtlCommandMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlMessageRTPWrapperTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlCommandMessageTest      ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlMessageRTPWrapperTest   ${GTEST_LINK})
 ENDIF()
 
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
-  TARGET_LINK_LIBRARIES(igtlVideoMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlVideoMetaMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlVideoMessageTest        ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlVideoMetaMessageTest    ${GTEST_LINK})
 ENDIF()
 
+SET(TestStringFormat1 "--gtest_filter=*.*FormatVersion1")
 
-#TARGET_LINK_LIBRARIES(igtlSocketTest ${GTEST_LINK})
-#TARGET_LINK_LIBRARIES(igtlClientSocketTest ${GTEST_LINK})
-#TARGET_LINK_LIBRARIES(igtlServerSocketTest ${GTEST_LINK})
-
-set(TestStringFormat1 "--gtest_filter=*.*FormatVersion1")
-
-ADD_TEST(igtlMultiThreaderTest1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest1)
-ADD_TEST(igtlMultiThreaderTest2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest2)
-ADD_TEST(igtlMultiThreaderTest3 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest3)
-ADD_TEST(igtlMessageFactoryTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageFactoryTest)
-ADD_TEST(igtlTimeStampTest1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTimeStampTest1)
-ADD_TEST(igtlMessageBaseTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat1})
-ADD_TEST(igtlConditionVariableTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat1})
-
-ADD_TEST(igtlImageMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat1})
-ADD_TEST(igtlImageMessage2Test ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat1})
-ADD_TEST(igtlCapabilityMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat1})
-ADD_TEST(igtlStatusMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat1})
-ADD_TEST(igtlTransformMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat1})
-ADD_TEST(igtlPositionMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest ${TestStringFormat1})
+ADD_TEST(igtlMultiThreaderTest1     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest1)
+ADD_TEST(igtlMultiThreaderTest2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest2)
+ADD_TEST(igtlMultiThreaderTest3     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest3)
+ADD_TEST(igtlMessageFactoryTest     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageFactoryTest)
+ADD_TEST(igtlTimeStampTest1         ${OpenIGTLink_EXECUTABLE_PATH}/igtlTimeStampTest1)
+ADD_TEST(igtlMessageBaseTest        ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat1})
+ADD_TEST(igtlConditionVariableTest  ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat1})
 
+ADD_TEST(igtlImageMessageTest       ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat1})
+ADD_TEST(igtlImageMessage2Test      ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat1})
+ADD_TEST(igtlCapabilityMessageTest  ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat1})
+ADD_TEST(igtlStatusMessageTest      ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat1})
+ADD_TEST(igtlTransformMessageTest   ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat1})
+ADD_TEST(igtlPositionMessageTest    ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest ${TestStringFormat1})
 
 # Message Tests Added in Version 2
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  ADD_TEST(igtlBindMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlColorTableMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlLabelMetaMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlNDArrayMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlImageMetaMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlPointMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlPolyDataMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlSensorMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlStringMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlTrackingDataMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlTrajectoryMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlBindMessageTest          ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlColorTableMessageTest    ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlLabelMetaMessageTest     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlNDArrayMessageTest       ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlImageMetaMessageTest     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlPointMessageTest         ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlPolyDataMessageTest      ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlSensorMessageTest        ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlStringMessageTest        ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlTrackingDataMessageTest  ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlTrajectoryMessageTest    ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat1})
 ENDIF()
 
-set(TestStringFormat2 "--gtest_filter=*.*FormatVersion2")
+SET(TestStringFormat2 "--gtest_filter=*.*FormatVersion2")
 # Message Tests Added in Version 3
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
-  ADD_TEST(igtlMessageBaseTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat2})
-  ADD_TEST(igtlImageMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlImageMessage2TestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat2})
-  ADD_TEST(igtlBindMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlCapabilityMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlColorTableMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlConditionVariableTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat2})
-  ADD_TEST(igtlLabelMetaMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlNDArrayMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlImageMetaMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlPointMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlPolyDataMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlSensorMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlStatusMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlStringMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlTrackingDataMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlTrajectoryMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlTransformMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlPositionMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest)
+  ADD_TEST(igtlMessageBaseTestFormatVersion2          ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat2})
+  ADD_TEST(igtlImageMessageTestFormatVersion2         ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlImageMessage2TestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat2})
+  ADD_TEST(igtlBindMessageTestFormatVersion2          ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlCapabilityMessageTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlColorTableMessageTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlConditionVariableTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat2})
+  ADD_TEST(igtlLabelMetaMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlNDArrayMessageTestFormatVersion2       ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlImageMetaMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlPointMessageTestFormatVersion2         ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlPolyDataMessageTestFormatVersion2      ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlSensorMessageTestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlStatusMessageTestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlStringMessageTestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlTrackingDataMessageTestFormatVersion2  ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlTrajectoryMessageTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlTransformMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlPositionMessageTest                    ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest)
   ## Command message is available in Protocol version 3, however, we will test both header version 1 and 2
-  ADD_TEST(igtlCommandMessageTestFormatVersion1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlCommandMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlMessageRTPWrapperTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageRTPWrapperTest ${TestStringFormat2})
+  ADD_TEST(igtlCommandMessageTestFormatVersion1       ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlCommandMessageTestFormatVersion2       ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlMessageRTPWrapperTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageRTPWrapperTest ${TestStringFormat2})
 ENDIF()
 
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9))
-  ADD_TEST(igtlVideoMessageTestFormatVersion1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlVideoMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlVideoMetaMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMetaMessageTest ${TestStringFormat2})
-ENDIF()
-
+  ADD_TEST(igtlVideoMessageTestFormatVersion1         ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlVideoMessageTestFormatVersion2         ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlVideoMetaMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMetaMessageTest ${TestStringFormat2})
+ENDIF()
\ No newline at end of file
diff --git a/Testing/CMakeLists.txt.in b/Testing/CMakeLists.txt.in
deleted file mode 100644
index d2a56779..00000000
--- a/Testing/CMakeLists.txt.in
+++ /dev/null
@@ -1,26 +0,0 @@
-cmake_minimum_required(VERSION 2.8.2)
- 
-project(googletest-download NONE)
-include(ExternalProject)
-ExternalProject_Add(googletest
-  URL https://github.com/google/googletest/archive/release-1.7.0.zip
-  #GIT_REPOSITORY    https://github.com/google/googletest.git
-  #GIT_TAG           master
-  SOURCE_DIR        "${PROJECT_BINARY_DIR}/gtest"
-  BINARY_DIR        "${PROJECT_BINARY_DIR}/gtest-build"
-  CONFIGURE_COMMAND ""
-  BUILD_COMMAND ""
-  INSTALL_COMMAND   ""
-  TEST_COMMAND      ""
-)
-
-ExternalProject_Add(googlemock
-  URL https://github.com/google/googlemock/archive/release-1.7.0.zip
-  SOURCE_DIR        "${PROJECT_BINARY_DIR}/gmock"
-  BINARY_DIR        "${PROJECT_BINARY_DIR}/gmock-build"
-  CONFIGURE_COMMAND ""
-  BUILD_COMMAND ""
-  INSTALL_COMMAND   ""
-  TEST_COMMAND      ""
-)
-
diff --git a/Testing/igtlutil/CMakeLists.txt b/Testing/igtlutil/CMakeLists.txt
index 0a736152..32056269 100644
--- a/Testing/igtlutil/CMakeLists.txt
+++ b/Testing/igtlutil/CMakeLists.txt
@@ -1,69 +1,65 @@
-find_package(OpenIGTLink REQUIRED)
-include(${OpenIGTLink_USE_FILE})
-include_directories(${OpenIGTLink_INCLUDE_DIRS})
-link_directories(${OpenIGTLink_LIBRARY_DIRS})
-ADD_EXECUTABLE(igtl_image_test igtl_image_test.c)
-ADD_EXECUTABLE(igtl_header_test igtl_header_test.c)
-ADD_EXECUTABLE(igtl_transform_test igtl_transform_test.c)
-ADD_EXECUTABLE(igtl_status_test igtl_status_test.c)
-ADD_EXECUTABLE(igtl_util_test igtl_util_test.c)
-ADD_EXECUTABLE(igtl_position_test igtl_position_test.c)
+ADD_EXECUTABLE(igtl_image_test      igtl_image_test.c)
+ADD_EXECUTABLE(igtl_header_test     igtl_header_test.c)
+ADD_EXECUTABLE(igtl_transform_test  igtl_transform_test.c)
+ADD_EXECUTABLE(igtl_status_test     igtl_status_test.c)
+ADD_EXECUTABLE(igtl_util_test       igtl_util_test.c)
+ADD_EXECUTABLE(igtl_position_test   igtl_position_test.c)
 ADD_EXECUTABLE(igtl_capability_test igtl_capability_test.c)
 
-if (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
   ADD_EXECUTABLE(igtl_colortable_test igtl_colortable_test.c)
-  ADD_EXECUTABLE(igtl_imgmeta_test igtl_imgmeta_test.c)
-  ADD_EXECUTABLE(igtl_lbmeta_test igtl_lbmeta_test.c)
-  ADD_EXECUTABLE(igtl_point_test igtl_point_test.c)
-  ADD_EXECUTABLE(igtl_tdata_test igtl_tdata_test.c)
+  ADD_EXECUTABLE(igtl_imgmeta_test    igtl_imgmeta_test.c)
+  ADD_EXECUTABLE(igtl_lbmeta_test     igtl_lbmeta_test.c)
+  ADD_EXECUTABLE(igtl_point_test      igtl_point_test.c)
+  ADD_EXECUTABLE(igtl_tdata_test      igtl_tdata_test.c)
   ADD_EXECUTABLE(igtl_trajectory_test igtl_trajectory_test.c)
-  ADD_EXECUTABLE(igtl_sensor_test igtl_sensor_test.c)
-  ADD_EXECUTABLE(igtl_string_test igtl_string_test.c)
-  ADD_EXECUTABLE(igtl_bind_test igtl_bind_test.c)
-  ADD_EXECUTABLE(igtl_ndarray_test igtl_ndarray_test.c)
-  ADD_EXECUTABLE(igtl_polydata_test igtl_polydata_test.c)
-endif ()
+  ADD_EXECUTABLE(igtl_sensor_test     igtl_sensor_test.c)
+  ADD_EXECUTABLE(igtl_string_test     igtl_string_test.c)
+  ADD_EXECUTABLE(igtl_bind_test       igtl_bind_test.c)
+  ADD_EXECUTABLE(igtl_ndarray_test    igtl_ndarray_test.c)
+  ADD_EXECUTABLE(igtl_polydata_test   igtl_polydata_test.c)
+ENDIF()
 
-TARGET_LINK_LIBRARIES(igtl_image_test OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtl_header_test OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtl_transform_test OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtl_status_test OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtl_util_test OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtl_position_test OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtl_capability_test OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtl_image_test       OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtl_header_test      OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtl_transform_test   OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtl_status_test      OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtl_util_test        OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtl_position_test    OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtl_capability_test  OpenIGTLink)
 
-if (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  TARGET_LINK_LIBRARIES(igtl_colortable_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_imgmeta_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_lbmeta_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_point_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_tdata_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_trajectory_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_sensor_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_string_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_bind_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_ndarray_test OpenIGTLink)
-  TARGET_LINK_LIBRARIES(igtl_polydata_test OpenIGTLink)
-endif ()
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
+  TARGET_LINK_LIBRARIES(igtl_colortable_test  OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_imgmeta_test     OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_lbmeta_test      OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_point_test       OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_tdata_test       OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_trajectory_test  OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_sensor_test      OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_string_test      OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_bind_test        OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_ndarray_test     OpenIGTLink)
+  TARGET_LINK_LIBRARIES(igtl_polydata_test    OpenIGTLink)
+ENDIF()
 
-ADD_TEST( igtl_image_test_01      ${OpenIGTLink_EXECUTABLE_PATH}/igtl_image_test )
-ADD_TEST( igtl_header_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_header_test )
-ADD_TEST( igtl_transform_test_01  ${OpenIGTLink_EXECUTABLE_PATH}/igtl_transform_test )
-ADD_TEST( igtl_status_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_status_test )
-ADD_TEST( igtl_util_test_01       ${OpenIGTLink_EXECUTABLE_PATH}/igtl_util_test )
-ADD_TEST( igtl_position_test_01   ${OpenIGTLink_EXECUTABLE_PATH}/igtl_position_test )
-ADD_TEST( igtl_capability_test_01 ${OpenIGTLink_EXECUTABLE_PATH}/igtl_capability_test )
+ADD_TEST(igtl_image_test_01      ${OpenIGTLink_EXECUTABLE_PATH}/igtl_image_test )
+ADD_TEST(igtl_header_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_header_test )
+ADD_TEST(igtl_transform_test_01  ${OpenIGTLink_EXECUTABLE_PATH}/igtl_transform_test )
+ADD_TEST(igtl_status_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_status_test )
+ADD_TEST(igtl_util_test_01       ${OpenIGTLink_EXECUTABLE_PATH}/igtl_util_test )
+ADD_TEST(igtl_position_test_01   ${OpenIGTLink_EXECUTABLE_PATH}/igtl_position_test )
+ADD_TEST(igtl_capability_test_01 ${OpenIGTLink_EXECUTABLE_PATH}/igtl_capability_test )
 
-if (${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  ADD_TEST( igtl_colortable_test_01 ${OpenIGTLink_EXECUTABLE_PATH}/igtl_colortable_test )
-  ADD_TEST( igtl_imgmeta_test_01    ${OpenIGTLink_EXECUTABLE_PATH}/igtl_imgmeta_test )
-  ADD_TEST( igtl_lbmeta_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_lbmeta_test )
-  ADD_TEST( igtl_point_test_01      ${OpenIGTLink_EXECUTABLE_PATH}/igtl_point_test )
-  ADD_TEST( igtl_tdata_test_01      ${OpenIGTLink_EXECUTABLE_PATH}/igtl_tdata_test )
-  ADD_TEST( igtl_trajectory_test_01 ${OpenIGTLink_EXECUTABLE_PATH}/igtl_trajectory_test )
-  ADD_TEST( igtl_sensor_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_sensor_test )
-  ADD_TEST( igtl_string_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_string_test )
-  ADD_TEST( igtl_bind_test_01       ${OpenIGTLink_EXECUTABLE_PATH}/igtl_bind_test )
-  ADD_TEST( igtl_ndarray_test_01    ${OpenIGTLink_EXECUTABLE_PATH}/igtl_ndarray_test )
-  ADD_TEST( igtl_polydata_test_01   ${OpenIGTLink_EXECUTABLE_PATH}/igtl_polydata_test )
-endif ()
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
+  ADD_TEST(igtl_colortable_test_01 ${OpenIGTLink_EXECUTABLE_PATH}/igtl_colortable_test )
+  ADD_TEST(igtl_imgmeta_test_01    ${OpenIGTLink_EXECUTABLE_PATH}/igtl_imgmeta_test )
+  ADD_TEST(igtl_lbmeta_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_lbmeta_test )
+  ADD_TEST(igtl_point_test_01      ${OpenIGTLink_EXECUTABLE_PATH}/igtl_point_test )
+  ADD_TEST(igtl_tdata_test_01      ${OpenIGTLink_EXECUTABLE_PATH}/igtl_tdata_test )
+  ADD_TEST(igtl_trajectory_test_01 ${OpenIGTLink_EXECUTABLE_PATH}/igtl_trajectory_test )
+  ADD_TEST(igtl_sensor_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_sensor_test )
+  ADD_TEST(igtl_string_test_01     ${OpenIGTLink_EXECUTABLE_PATH}/igtl_string_test )
+  ADD_TEST(igtl_bind_test_01       ${OpenIGTLink_EXECUTABLE_PATH}/igtl_bind_test )
+  ADD_TEST(igtl_ndarray_test_01    ${OpenIGTLink_EXECUTABLE_PATH}/igtl_ndarray_test )
+  ADD_TEST(igtl_polydata_test_01   ${OpenIGTLink_EXECUTABLE_PATH}/igtl_polydata_test )
+ENDIF()

From 583148c379e284ade0dd2ad809402f7f7489233a Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Mon, 24 Jul 2017 18:06:23 -0400
Subject: [PATCH 02/21] EHN: Super build In progress

---
 .travis.yml                                |   4 +-
 BUILD.md                                   |   2 +-
 CMakeLists.txt                             |  84 +++++++++-----
 Examples/CMakeLists.txt                    |   2 +-
 Source/CMakeLists.txt                      |  83 +++++++-------
 Source/VideoStreaming/H264Decoder.h        |   4 +-
 Source/VideoStreaming/H264Encoder.cxx      | 122 ++++++++++++++-------
 Source/VideoStreaming/H264Encoder.h        |  15 +--
 Source/VideoStreaming/VP9Decoder.cxx       |  23 +++-
 Source/VideoStreaming/VP9Decoder.h         |  24 +++-
 Source/VideoStreaming/VP9Encoder.cxx       |  52 ++++++---
 Source/VideoStreaming/VP9Encoder.h         |  25 ++++-
 Source/VideoStreaming/VideoStreaming.cmake | 112 ++++++++++++-------
 Source/igtlutil/CMakeLists.txt             |   2 +-
 SuperBuild/External_VP9.cmake              |  28 +++++
 SuperBuild/External_openh264.cmake         |  27 +++++
 SuperBuild/External_x265.cmake             |   2 +
 SuperBuild/Superbuild.cmake                |  76 ++++++++-----
 Testing/CMakeLists.txt                     |  24 ++--
 Testing/External_googletest.cmake          |  40 +++++++
 Testing/igtlVideoMessageTest.cxx           |   3 +-
 21 files changed, 525 insertions(+), 229 deletions(-)
 create mode 100644 SuperBuild/External_VP9.cmake
 create mode 100644 SuperBuild/External_openh264.cmake
 create mode 100644 Testing/External_googletest.cmake

diff --git a/.travis.yml b/.travis.yml
index 8171f822..453c1e6c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,12 +38,12 @@ before_script:
   - cd    build
 
 script:
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DBUILD_VIDEOSTREAM=ON -DLINK_VP9=ON ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON ..
   - make
   - cd ..
   - mkdir TestBuild
   - cd TestBuild
-  - cmake -DCMAKE_PREFIX_PATH:PATH=../build -DBUILD_VIDEOSTREAM=ON -DLINK_VP9=ON ../Testing
+  - cmake -DCMAKE_PREFIX_PATH:PATH=../build -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON ../Testing
   - make 
   - make test 
   #########################
diff --git a/BUILD.md b/BUILD.md
index ee9d8f7c..0c489167 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -77,7 +77,7 @@ $ make
 or for VP9 configuration:
 
 ~~~~
-$ cmake -DBUILD_VIDEOSTREAM:BOOL=ON -DLINK_VP9:BOOL=ON -DOpenIGTLink_PROTOCOL_VERSION_3:BOOL=ON ../OpenIGTLink
+$ cmake -DBUILD_VIDEOSTREAM:BOOL=ON -DUSE_VP9:BOOL=ON -DOpenIGTLink_PROTOCOL_VERSION_3:BOOL=ON ../OpenIGTLink
 $ make
 ~~~~
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e66dad5b..1e099c5c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 PROJECT(OpenIGTLink)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
 
 INCLUDE(ExternalProject)
 
@@ -8,9 +8,6 @@ IF(COMMAND cmake_policy)
   cmake_policy(SET CMP0003 NEW)
 ENDIF(COMMAND cmake_policy)
 
-OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." ON)
-MARK_AS_ADVANCED(OpenIGTLink_SUPERBUILD)
-
 #-----------------------------------------------------------------------------
 # OpenIGTlink version number.
 SET(OpenIGTLink_VERSION_MAJOR "3")
@@ -32,12 +29,33 @@ ENDIF()
 
 #-----------------------------------------------------------------------------
 # Configure VideoStreaming
+# Create the link to the VideoStreaming libraries
 OPTION(BUILD_VIDEOSTREAM "Build the Video Stream." OFF)
+OPTION(USE_H264 "Link the OpenH264 tree." OFF)
+OPTION(USE_VP9 "Link the VP9 tree." OFF)
+OPTION(USE_X265 "Link the X265 tree." OFF)
+OPTION(USE_OPENHEVC "Link the OpenHevc tree." OFF)
+SET(OpenIGTLink_LINK_H264 "0")
+SET(OpenIGTLink_LINK_VP9 "0")
+SET(OpenIGTLink_LINK_X265 "0")
+SET(OpenIGTLink_LINK_OPENHEVC "0")
+SET(H264_SOURCE_DIR "" CACHE PATH "H264 source directory")
+SET(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory")
+SET(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory")
+SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")   
 IF(BUILD_VIDEOSTREAM)
-  OPTION(USE_H264 "Link the OpenH264 tree." OFF)
-  OPTION(USE_VP9 "Link the VP9 tree." OFF)
-  OPTION(USE_X265 "Link the X265 tree." OFF)
-  OPTION(USE_OPENHEVC "Link the OpenHevc tree." OFF)
+  IF(USE_H264)
+		SET(OpenIGTLink_LINK_H264 "1")     
+  ENDIF()
+  IF(USE_VP9)
+    SET(OpenIGTLink_LINK_VP9 "1")
+  ENDIF()
+  IF(USE_X265)
+    SET(OpenIGTLink_LINK_X265 "1")
+  ENDIF()
+  IF(USE_OPENHEVC)
+    SET(OpenIGTLink_LINK_OPENHEVC "1")
+  ENDIF()
 ENDIF()
 
 #-----------------------------------------------------------------------------
@@ -54,9 +72,20 @@ IF(NOT OpenIGTLink_BUILD_SHARED_LIBS)
   SET(OpenIGTLink_BUILD_GENERATE_PIC ${BUILD_GENERATE_PIC})
 ENDIF()
 
+#-----------------------------------------------------------------------------
 OPTION(BUILD_EXAMPLES "Build OpenIGTLink example programs." OFF)
 SET(OpenIGTLink_BUILD_EXAMPLES ${BUILD_EXAMPLES})
 
+#-----------------------------------------------------------------------------
+OPTION(BUILD_TESTING "Build the testing tree." ON)
+OPTION(USE_GTEST "Use googletest for testing" ON)
+SET(OpenIGTLink_BUILD_TESTING ${BUILD_TESTING})
+
+#-----------------------------------------------------------------------------
+OPTION(BUILD_DOCUMENTATION "Build OpenIGTLink Documentation" OFF)
+
+
+
 #-----------------------------------------------------------------------------
 # Output directories.
 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
@@ -160,9 +189,24 @@ ENDIF()
 
 #-----------------------------------------------------------------------------
 # Run superbuild script instead of library script
-IF(OpenIGTLink_SUPERBUILD)
-  INCLUDE(SuperBuild/Superbuild.cmake)
-  RETURN()
+IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
+  MESSAGE ("Cmake version is not less than 3.4, super build available")
+	OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." OFF)
+	#MARK_AS_ADVANCED(OpenIGTLink_SUPERBUILD)
+	IF(OpenIGTLink_SUPERBUILD)
+		INCLUDE(SuperBuild/Superbuild.cmake)
+		RETURN()
+	ENDIF()
+ENDIF()
+
+#-----------------------------------------------------------------------------
+# Configure Subdirectories
+ADD_SUBDIRECTORY(Source/igtlutil)
+ADD_SUBDIRECTORY(Source)
+ADD_SUBDIRECTORY(Tools)
+
+IF(OpenIGTLink_BUILD_EXAMPLES)
+ ADD_SUBDIRECTORY(Examples)
 ENDIF()
 
 #-----------------------------------------------------------------------------
@@ -227,16 +271,6 @@ LIST(APPEND CMAKE_EXE_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
 LIST(APPEND CMAKE_SHARED_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
 LIST(APPEND CMAKE_MODULE_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
 
-#-----------------------------------------------------------------------------
-# Configure Subdirectories
-ADD_SUBDIRECTORY(Source/igtlutil)
-ADD_SUBDIRECTORY(Source)
-ADD_SUBDIRECTORY(Tools)
-
-IF(OpenIGTLink_BUILD_EXAMPLES)
- ADD_SUBDIRECTORY(Examples)
-ENDIF()
-
 #-----------------------------------------------------------------------------
 # Export targets
 EXPORT(TARGETS OpenIGTLink
@@ -251,8 +285,6 @@ INSTALL(EXPORT OpenIGTLink
 
 #-----------------------------------------------------------------------------
 # Tests
-OPTION(BUILD_TESTING "Build the testing tree." ON)
-SET(OpenIGTLink_BUILD_TESTING ${BUILD_TESTING})
 IF(OpenIGTLink_BUILD_TESTING)
   ENABLE_TESTING()
   ADD_SUBDIRECTORY(Testing)
@@ -260,9 +292,7 @@ IF(OpenIGTLink_BUILD_TESTING)
 ENDIF()
 
 #-----------------------------------------------------------------------------
-# Doxygen
-OPTION(BUILD_DOCUMENTATION "Build OpenIGTLink Documentation" OFF)
-
+# Build Doxygen documentation
 IF(BUILD_DOCUMENTATION)
   ADD_SUBDIRECTORY(Documents/Doxygen)
-ENDIF()
\ No newline at end of file
+ENDIF()
diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt
index 2803439b..99df482e 100644
--- a/Examples/CMakeLists.txt
+++ b/Examples/CMakeLists.txt
@@ -33,7 +33,7 @@ if (${OpenIGTLink_PROTOCOL_VERSION} GREATER 1)
 endif (${OpenIGTLink_PROTOCOL_VERSION} GREATER 1)
 
 
-IF(BUILD_VIDEOSTREAM AND (LINK_H264 OR LINK_VP9 OR LINK_X265) AND (${OpenIGTLink_PROTOCOL_VERSION} GREATER 2))
+IF(BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR USE_X265) AND (${OpenIGTLink_PROTOCOL_VERSION} GREATER 2))
 	SET(EXAMPLE_DIRS
     ${EXAMPLE_DIRS}
     VideoStreaming
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 4b19e090..cf1f870c 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -34,6 +34,8 @@ SET(OpenIGTLink_INCLUDE_DIRS
   ${CMAKE_BINARY_DIR}
   ${CMAKE_CURRENT_SOURCE_DIR}
   ${CMAKE_CURRENT_BINARY_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/igtlutil
+  ${CMAKE_CURRENT_BINARY_DIR}/igtlutil
   )
 
 SET(OpenIGTLink_SOURCES
@@ -207,54 +209,40 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
   ENDIF()
 ENDIF()
 
-#-----------------------------------------------------------------------------
-# Configure VideoStreaming
-# Create the link to the VideoStreaming libraries
-IF(BUILD_VIDEOSTREAM)
-  IF(USE_H264)
-    FIND_PACKAGE(OpenH264 REQUIRED)
-    LIST(APPEND LINK_LIBS OpenH264)
-  ENDIF()
+IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
+	IF(BUILD_VIDEOSTREAM)	
+		IF(USE_X265)
+			FIND_PACKAGE(x265 REQUIRED)
+		ENDIF()
+	
+		IF(USE_OPENHEVC)
+			FIND_PACKAGE(OpenHEVC REQUIRED)
+		ENDIF()
+		INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/VideoStreaming/VideoStreaming.cmake)
+	ENDIF()
 
-  IF(USE_VP9)
-    FIND_PACKAGE(VP9 REQUIRED)
-    LIST(APPEND LINK_LIBS VP9)
-  ENDIF()
+	#-----------------------------------------------------------------------------
+	# Configure WebSocket
+	# Create the link to the WebSocket libraries
+	IF(BUILD_WEBSOCKET)
+		FIND_PACKAGE(WebSocket REQUIRED)
+		LIST(APPEND LINK_LIBS WebSocket)
 
-  IF(USE_X265)
-    FIND_PACKAGE(x265 REQUIRED)
-    LIST(APPEND LINK_LIBS x265)
-  ENDIF()
+		LIST(APPEND OpenIGTLink_SOURCES
+			${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebServerSocket.cxx
+			${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebClientSocket.cxx
+		)
+	
+		LIST(APPEND OpenIGTLink_INCLUDE_FILES
+			${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebServerSocket.h
+			${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebClientSocket.h
+		)
 
-  IF(USE_OPENHEVC)
-    FIND_PACKAGE(OpenHEVC REQUIRED)
-    LIST(APPEND LINK_LIBS OpenHEVC)
-  ENDIF()
-
-  INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/VideoStreaming/VideoStreaming.cmake)
+		LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+			${CMAKE_CURRENT_SOURCE_DIR}/WebSocket
+			)
+	ENDIF()
 ENDIF()
-
-#-----------------------------------------------------------------------------
-# Configure WebSocket
-# Create the link to the WebSocket libraries
-IF(BUILD_WEBSOCKET)
-  FIND_PACKAGE(WebSocket REQUIRED)
-  LIST(APPEND LINK_LIBS WebSocket)
-
-  LIST(APPEND OpenIGTLink_SOURCES
-    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebServerSocket.cxx
-    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebClientSocket.cxx
-  )
-  
-  LIST(APPEND OpenIGTLink_INCLUDE_FILES
-    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebServerSocket.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket/igtlWebClientSocket.h
-  )
-
-  LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    ${CMAKE_CURRENT_SOURCE_DIR}/WebSocket
-ENDIF()
-
 #-----------------------------------------------------------------------------
 # Create the library
 ADD_LIBRARY(OpenIGTLink ${OpenIGTLink_SOURCES} ${OpenIGTLink_INCLUDE_FILES})
@@ -263,7 +251,9 @@ foreach(p IN LISTS OpenIGTLink_INCLUDE_DIRS)
 endforeach()
 target_include_directories(OpenIGTLink PUBLIC $<INSTALL_INTERFACE:${OpenIGTLink_INSTALL_INCLUDE_DIR}>)
 
-TARGET_LINK_LIBRARIES(OpenIGTLink PUBLIC ${LINK_LIBS} igtlutil)
+LIST(APPEND OpenIGTLink_DEPENDENCIES igtlutil)
+
+TARGET_LINK_LIBRARIES(OpenIGTLink PUBLIC ${LINK_LIBS})
 
 IF(MSVC)
   target_compile_options(OpenIGTLink PRIVATE /MP)
@@ -281,4 +271,5 @@ INSTALL(FILES ${OpenIGTLink_INCLUDE_FILES}
 INSTALL(TARGETS OpenIGTLink EXPORT OpenIGTLink
   RUNTIME DESTINATION ${OpenIGTLink_INSTALL_BIN_DIR} COMPONENT RuntimeLibraries
   LIBRARY DESTINATION ${OpenIGTLink_INSTALL_LIB_DIR} COMPONENT RuntimeLibraries
-  ARCHIVE DESTINATION ${OpenIGTLink_INSTALL_LIB_DIR} COMPONENT Development)
\ No newline at end of file
+  ARCHIVE DESTINATION ${OpenIGTLink_INSTALL_LIB_DIR} COMPONENT Development)
+  
\ No newline at end of file
diff --git a/Source/VideoStreaming/H264Decoder.h b/Source/VideoStreaming/H264Decoder.h
index a15bc699..ced4e87d 100644
--- a/Source/VideoStreaming/H264Decoder.h
+++ b/Source/VideoStreaming/H264Decoder.h
@@ -48,8 +48,8 @@
 #include <vector>
 #include <limits.h>
 #include <string.h>
-#include "api/svc/codec_api.h"
-#include "api/svc/codec_app_def.h"
+#include "codec_api.h"
+#include "codec_app_def.h"
 #include "igtl_types.h"
 #include "igtlVideoMessage.h"
 #include "igtlCodecCommonClasses.h"
diff --git a/Source/VideoStreaming/H264Encoder.cxx b/Source/VideoStreaming/H264Encoder.cxx
index d4f34a36..04e5a8d7 100644
--- a/Source/VideoStreaming/H264Encoder.cxx
+++ b/Source/VideoStreaming/H264Encoder.cxx
@@ -70,11 +70,11 @@ int     g_iEncodedFrame  = 0;
 #endif
 //#define STICK_STREAM_SIZE
 
-#include "measure_time.h"
+//#include "measure_time.h"
 
 
-#include "typedefs.h"
-#include "read_config.h"
+//#include "typedefs.h"
+//#include "read_config.h"
 
 #ifdef _MSC_VER
 #include <io.h>     /* _setmode() */
@@ -83,12 +83,12 @@ int     g_iEncodedFrame  = 0;
 
 #include "codec_def.h"
 #include "codec_api.h"
-#include "extern.h"
-#include "macros.h"
-#include "wels_const.h"
+//#include "extern.h"
+//#include "macros.h"
+//#include "wels_const.h"
 
-#include "mt_defs.h"
-#include "WelsThreadLib.h"
+//#include "mt_defs.h"
+//#include "WelsThreadLib.h"
 
 #ifdef _WIN32
 #ifdef WINAPI_FAMILY
@@ -116,6 +116,8 @@ static void    SigIntHandler (int a) {
   g_iCtrlC = 1;
 }
 
+#define   CALC_BI_STRIDE(width,bitcount)  ((((width * bitcount) + 31) & ~31) >> 3)
+
 H264Encoder::H264Encoder(char *configFile):GenericEncoder()
 {
   this->pSVCEncoder = NULL;
@@ -144,34 +146,6 @@ H264Encoder::~H264Encoder()
   this->pSVCEncoder = NULL;
 }
 
-bool H264Encoder::CompareHash (const unsigned char* digest, const char* hashStr) {
-  char hashStrCmp[SHA_DIGEST_LENGTH * 2 + 1];
-  for (int i = 0; i < SHA_DIGEST_LENGTH; ++i)
-    {
-    sprintf (&hashStrCmp[i * 2], "%.2x", digest[i]);
-    }
-  hashStrCmp[SHA_DIGEST_LENGTH * 2] = '\0';
-  if (hashStr == hashStrCmp)
-    {
-    return true;
-    }
-  return false;
-}
-
-
-void H264Encoder::UpdateHashFromFrame (SFrameBSInfo& info, SHA1Context* ctx) {
-  for (int i = 0; i < info.iLayerNum; ++i)
-    {
-    const SLayerBSInfo& layerInfo = info.sLayerInfo[i];
-    int layerSize = 0;
-    for (int j = 0; j < layerInfo.iNalCount; ++j)
-      {
-      layerSize += layerInfo.pNalLengthInByte[j];
-      }
-    SHA1Input (ctx, layerInfo.pBsBuf, layerSize);
-    }
-}
-
 int H264Encoder::FillSpecificParameters() {
   /* Test for temporal, spatial, SNR scalability */
   sSvcParam.iUsageType = CAMERA_VIDEO_REAL_TIME;
@@ -213,7 +187,7 @@ int H264Encoder::FillSpecificParameters() {
   
   float fMaxFr = sSvcParam.sSpatialLayers[sSvcParam.iSpatialLayerNum - 1].fFrameRate;
   for (int32_t i = sSvcParam.iSpatialLayerNum - 2; i >= 0; --i) {
-    if (sSvcParam.sSpatialLayers[i].fFrameRate > fMaxFr + EPSN)
+    if (sSvcParam.sSpatialLayers[i].fFrameRate > (fMaxFr+EPSN))
       fMaxFr = sSvcParam.sSpatialLayers[i].fFrameRate;
   }
   sSvcParam.fMaxFrameRate = fMaxFr;
@@ -353,7 +327,6 @@ int H264Encoder::ParseLayerConfig (string strTag[], const int iLayer, SEncParamE
       {
       const char* kpString = strTag[0].c_str();
       int uiSliceIdx = atoi (&kpString[kiSize]);
-      assert (uiSliceIdx < MAX_SLICES_NUM);
       sLayerCtx.sSliceArgument.uiSliceMbNum[uiSliceIdx] = atoi (strTag[1].c_str());
       }
     }
@@ -594,12 +567,11 @@ int H264Encoder::ParseConfig() {
       }
     }
   
-  const igtlUint8 kiActualLayerNum = WELS_MIN (sSvcParam.iSpatialLayerNum, actLayerConfigNum);
+  const igtlUint8 kiActualLayerNum = sSvcParam.iSpatialLayerNum<actLayerConfigNum ? sSvcParam.iSpatialLayerNum:actLayerConfigNum;
   if (sSvcParam.iSpatialLayerNum >
       kiActualLayerNum) { // fixed number of dependency layer due to parameter error in settings
     sSvcParam.iSpatialLayerNum = kiActualLayerNum;
   }
-  assert (kiActualLayerNum <= MAX_DEPENDENCY_LAYER);
   return 0;
 }
 
@@ -701,6 +673,76 @@ int H264Encoder::SetPicWidthAndHeight(unsigned int Width, unsigned int Height)
   return 0;
 }
 
+
+igtlInt32 H264Encoder::InitPic (const void* kpSrc, const int32_t colorspace, const int32_t width, const int32_t height) {
+  SSourcePicture* pSrcPic = (SSourcePicture*)kpSrc;
+  
+  if (NULL == pSrcPic || width == 0 || height == 0)
+    return 1;
+  
+  pSrcPic->iColorFormat = colorspace;
+  pSrcPic->iPicWidth    = width;
+  pSrcPic->iPicHeight   = height;
+  
+  //currently encoder only supports videoFormatI420.
+  if ((colorspace & (~videoFormatVFlip)) != videoFormatI420)
+    return 2;
+  switch (colorspace & (~videoFormatVFlip)) {
+    case videoFormatI420:
+    case videoFormatYV12:
+      pSrcPic->pData[0]   = NULL;
+      pSrcPic->pData[1]   = NULL;
+      pSrcPic->pData[2]   = NULL;
+      pSrcPic->pData[3]   = NULL;
+      pSrcPic->iStride[0] = width;
+      pSrcPic->iStride[2] = pSrcPic->iStride[1] = width >> 1;
+      pSrcPic->iStride[3] = 0;
+      break;
+    case videoFormatYUY2:
+    case videoFormatYVYU:
+    case videoFormatUYVY:
+      pSrcPic->pData[0]   = NULL;
+      pSrcPic->pData[1]   = NULL;
+      pSrcPic->pData[2]   = NULL;
+      pSrcPic->pData[3]   = NULL;
+      pSrcPic->iStride[0] = CALC_BI_STRIDE (width,  16);
+      pSrcPic->iStride[3] = pSrcPic->iStride[2] = pSrcPic->iStride[1] = 0;
+      break;
+    case videoFormatRGB:
+    case videoFormatBGR:
+      pSrcPic->pData[0]   = NULL;
+      pSrcPic->pData[1]   = NULL;
+      pSrcPic->pData[2]   = NULL;
+      pSrcPic->pData[3]   = NULL;
+      pSrcPic->iStride[0] = CALC_BI_STRIDE (width, 24);
+      pSrcPic->iStride[3] = pSrcPic->iStride[2] = pSrcPic->iStride[1] = 0;
+      if (colorspace & videoFormatVFlip)
+        pSrcPic->iColorFormat = colorspace & (~videoFormatVFlip);
+      else
+        pSrcPic->iColorFormat = colorspace | videoFormatVFlip;
+      break;
+    case videoFormatBGRA:
+    case videoFormatRGBA:
+    case videoFormatARGB:
+    case videoFormatABGR:
+      pSrcPic->pData[0]   = NULL;
+      pSrcPic->pData[1]   = NULL;
+      pSrcPic->pData[2]   = NULL;
+      pSrcPic->pData[3]   = NULL;
+      pSrcPic->iStride[0] = width << 2;
+      pSrcPic->iStride[3] = pSrcPic->iStride[2] = pSrcPic->iStride[1] = 0;
+      if (colorspace & videoFormatVFlip)
+        pSrcPic->iColorFormat = colorspace & (~videoFormatVFlip);
+      else
+        pSrcPic->iColorFormat = colorspace | videoFormatVFlip;
+      break;
+    default:
+      return 2; // any else?
+  }
+  
+  return 0;
+}
+
 int H264Encoder::ConvertToLocalImageFormat(SourcePicture* pSrcPic)
 {
   if(pSrcPic->colorFormat==FormatI420)
diff --git a/Source/VideoStreaming/H264Encoder.h b/Source/VideoStreaming/H264Encoder.h
index 19ab595a..59645a8c 100644
--- a/Source/VideoStreaming/H264Encoder.h
+++ b/Source/VideoStreaming/H264Encoder.h
@@ -62,7 +62,7 @@
 #include <iostream>
 
 #include "igtlCodecCommonClasses.h"
-#include "sha1.h"
+//#include "sha1.h"
 #include "igtl_header.h"
 #include "igtl_video.h"
 #include "igtlOSUtil.h"
@@ -71,9 +71,12 @@
 #include "igtlTimeStamp.h"
 #include "codec_def.h"
 #include "codec_app_def.h"
-#include "read_config.h"
-#include "wels_const.h"
+//#include "read_config.h"
+//#include "wels_const.h"
 
+#define MAX_DEPENDENCY_LAYER 4
+#define MAX_THREADS_NUM 4
+#define EPSN (0.000001f) 
 
 using namespace std;
 
@@ -104,10 +107,6 @@ class H264Encoder: public GenericEncoder
   H264Encoder(char * configFile = NULL);
   ~H264Encoder();
   
-  void UpdateHashFromFrame (SFrameBSInfo& info, SHA1Context* ctx);
-  
-  bool CompareHash (const unsigned char* digest, const char* hashStr);
-
   virtual int FillSpecificParameters();
   
   /**
@@ -166,6 +165,8 @@ class H264Encoder: public GenericEncoder
   
   int ParseConfig();
   
+  igtlInt32 InitPic (const void* kpSrc, const int32_t colorspace, const int32_t width, const int32_t height);
+  
   ISVCEncoder*  pSVCEncoder;
   
   SEncParamExt sSvcParam;
diff --git a/Source/VideoStreaming/VP9Decoder.cxx b/Source/VideoStreaming/VP9Decoder.cxx
index e52e8362..94bdf72f 100644
--- a/Source/VideoStreaming/VP9Decoder.cxx
+++ b/Source/VideoStreaming/VP9Decoder.cxx
@@ -13,9 +13,29 @@
 
 #include "VP9Decoder.h"
 
+
+static const VpxInterfaceDecoder vp9StaticDecoder[] = {{&vpx_codec_vp9_dx}};
+
+// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
+// of vpx_image_t support, this section will be removed when it is moved to vpx_image
+int VP9Decoder::vpx_img_plane_width(const vpx_image_t *img, int plane) {
+  if (plane > 0 && img->x_chroma_shift > 0)
+    return (img->d_w + 1) >> img->x_chroma_shift;
+  else
+    return img->d_w;
+}
+
+int VP9Decoder::vpx_img_plane_height(const vpx_image_t *img, int plane) {
+  if (plane > 0 && img->y_chroma_shift > 0)
+    return (img->d_h + 1) >> img->y_chroma_shift;
+  else
+    return img->d_h;
+}
+
+
 VP9Decoder::VP9Decoder()
 {
-  decoder = get_vpx_decoder_by_name("vp9");
+  decoder = &vp9StaticDecoder[0];
   vpx_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0);
   this->deviceName = "";
 }
@@ -96,7 +116,6 @@ int VP9Decoder::DecodeBitStreamIntoFrame(unsigned char* bitstream,igtl_uint8* ou
     {
     vpx_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0);
     std::cerr << "decode failed" << std::endl;
-    //die_codec(&codec, "Failed to decode frame.");
     }
   return -1;
 }
\ No newline at end of file
diff --git a/Source/VideoStreaming/VP9Decoder.h b/Source/VideoStreaming/VP9Decoder.h
index c9788a51..14aaa9a2 100644
--- a/Source/VideoStreaming/VP9Decoder.h
+++ b/Source/VideoStreaming/VP9Decoder.h
@@ -31,9 +31,23 @@
 #include "igtlVideoMessage.h"
 #include "igtlCodecCommonClasses.h"
 #include "vpx/vpx_decoder.h"
-#include "tools_common.h"
-#include "video_reader.h"
 #include "vpx_config.h"
+#include "vpx/vp8dx.h"
+#include "vpx/vpx_codec.h"
+#include "vpx/vpx_image.h"
+#include "vpx/vpx_integer.h"
+#include "vpx_ports/msvc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  typedef struct VpxInterfaceDecoder {
+    vpx_codec_iface_t *(*const codec_interface)();
+  } VpxInterfaceDecoder;
+  
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
 
 #define NO_DELAY_DECODING
 class VP9Decoder:public GenericDecoder
@@ -49,7 +63,11 @@ class VP9Decoder:public GenericDecoder
 private:
   virtual void ComposeByteSteam(igtl_uint8** inputData, int dimension[2], int iStride[2], igtl_uint8 *outputFrame);
   
-  const VpxInterface* decoder;
+  const VpxInterfaceDecoder* decoder;
+  
+  int vpx_img_plane_width(const vpx_image_t *img, int plane);
+  
+  int vpx_img_plane_height(const vpx_image_t *img, int plane);
   
   vpx_codec_ctx_t codec;
   
diff --git a/Source/VideoStreaming/VP9Encoder.cxx b/Source/VideoStreaming/VP9Encoder.cxx
index 5188ad9d..83258804 100644
--- a/Source/VideoStreaming/VP9Encoder.cxx
+++ b/Source/VideoStreaming/VP9Encoder.cxx
@@ -15,11 +15,37 @@
 #include "VP9Encoder.h"
 #include "igtlVideoMessage.h"
 
-void usage_exit(void) {exit(EXIT_FAILURE);};
+static const VpxInterfaceEncoder vp9StaticEncoder[] = {{&vpx_codec_vp9_cx}};
+
+void VP9Encoder::error_output(vpx_codec_ctx_t *ctx, const char *s) {
+  const char *detail = vpx_codec_error_detail(ctx);
+  
+  printf("%s: %s\n", s, vpx_codec_error(ctx));
+  if (detail) printf("    %s\n", detail);
+  exit(EXIT_FAILURE);
+}
+
+
+// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
+// of vpx_image_t support, this section will be removed when it is moved to vpx_image
+int VP9Encoder::vpx_img_plane_width(const vpx_image_t *img, int plane) {
+  if (plane > 0 && img->x_chroma_shift > 0)
+    return (img->d_w + 1) >> img->x_chroma_shift;
+  else
+    return img->d_w;
+}
+
+int VP9Encoder::vpx_img_plane_height(const vpx_image_t *img, int plane) {
+  if (plane > 0 && img->y_chroma_shift > 0)
+    return (img->d_h + 1) >> img->y_chroma_shift;
+  else
+    return img->d_h;
+}
+
 
 VP9Encoder::VP9Encoder(char *configFile):GenericEncoder()
 {
-  this->encoder = get_vpx_encoder_by_name("vp9");
+  this->encoder = &vp9StaticEncoder[0];
   codec = new vpx_codec_ctx_t();
   encodedBuf = new vpx_fixed_buf_t();
   inputImage = new vpx_image_t();
@@ -46,14 +72,14 @@ VP9Encoder::~VP9Encoder()
 int VP9Encoder::FillSpecificParameters() {
   if (vpx_codec_enc_config_default(encoder->codec_interface(), &cfg, 0))
     {
-    die_codec(codec, "Failed to get default codec config.");
+    error_output(codec, "Failed to get default codec config.");
     return -1;
     }
   cfg.g_error_resilient = true;
   vpx_codec_enc_init(codec, encoder->codec_interface(), &cfg, 0);
   if(this->SetSpeed(FastestSpeed)!=0)
     {
-    die_codec(codec, "Failed to set the speed to be the fastest.");
+    error_output(codec, "Failed to set the speed to be the fastest.");
     return -1;
     }
   return 0;
@@ -64,7 +90,7 @@ int VP9Encoder::SetRCMode(int value)
   this->cfg.rc_end_usage = (vpx_rc_mode) value;
   if(vpx_codec_enc_config_set(codec, &this->cfg))
     {
-    die_codec(codec, "Failed to set RC mode");
+    error_output(codec, "Failed to set RC mode");
     return -1;
     }
   return 0;
@@ -76,7 +102,7 @@ int VP9Encoder::SetKeyFrameDistance(int frameNum)
   this->cfg.kf_min_dist = frameNum;
   if(vpx_codec_enc_config_set(codec, &this->cfg))
     {
-    die_codec(codec, "Failed to key frame distance");
+    error_output(codec, "Failed to key frame distance");
     return -1;
     }
   return 0;
@@ -95,7 +121,7 @@ int VP9Encoder::SetRCTaregetBitRate(unsigned int bitRate)
     }
   if (vpx_codec_enc_config_set(codec, &this->cfg))
     {
-    die_codec(codec, "Failed to set target bit rate");
+    error_output(codec, "Failed to set target bit rate");
     return -1;
     }
   this->initializationDone = true;
@@ -109,7 +135,7 @@ int VP9Encoder::SetQP(int maxQP, int minQP)
   this->cfg.rc_end_usage = VPX_Q;
   if (vpx_codec_enc_config_set(codec, &this->cfg))
     {
-    die_codec(codec, "Failed to set QP");
+    error_output(codec, "Failed to set QP");
     return -1;
     }
   this->initializationDone = true;
@@ -122,7 +148,7 @@ int VP9Encoder::SetLosslessLink(bool linkMethod)
   this->isLossLessLink = linkMethod;
   if (vpx_codec_control_(codec, VP9E_SET_LOSSLESS, linkMethod))
     {
-    die_codec(codec, "Failed to set lossless mode");
+    error_output(codec, "Failed to set lossless mode");
     return -1;
     }
   else
@@ -153,13 +179,13 @@ int VP9Encoder::InitializeEncoder()
                 cfg.g_h, 1);
   if (vpx_codec_enc_init(codec, encoder->codec_interface(), &cfg, 0))
     {
-    die_codec(codec, "Failed to initialize encoder");
+    error_output(codec, "Failed to initialize encoder");
     return -1;
     }
   
   if (vpx_codec_control_(codec, VP9E_SET_LOSSLESS, this->GetLosslessLink()))
     {
-    die_codec(codec, "Failed to set lossless mode");
+    error_output(codec, "Failed to set lossless mode");
     return -1;
     }
   
@@ -167,7 +193,7 @@ int VP9Encoder::InitializeEncoder()
     {
     if (vpx_codec_control(codec, VP8E_SET_CPUUSED, codecSpeed))
       {
-      die_codec(codec, "Failed to set Speed");
+      error_output(codec, "Failed to set Speed");
       return -1;
       }
     }
@@ -235,7 +261,7 @@ int VP9Encoder::EncodeSingleFrameIntoVideoMSG(SourcePicture* pSrcPic, igtl::Vide
       const vpx_codec_err_t res2 = vpx_codec_encode(codec, inputImage, messageID, 1, 0, this->deadlineMode);
       if (res2 != VPX_CODEC_OK)
         {
-        die_codec(codec, "Failed to encode frame");
+        error_output(codec, "Failed to encode frame");
         return -1;
         }
       iter = NULL;
diff --git a/Source/VideoStreaming/VP9Encoder.h b/Source/VideoStreaming/VP9Encoder.h
index 6af2cc9e..941800da 100644
--- a/Source/VideoStreaming/VP9Encoder.h
+++ b/Source/VideoStreaming/VP9Encoder.h
@@ -19,9 +19,10 @@
 
 #include "vpx/vpx_encoder.h"
 #include "vpx/vp8cx.h"
-#include "vp9/common/vp9_common.h"
-#include "tools_common.h"
-#include "video_writer.h"
+#include "vpx/vpx_codec.h"
+#include "vpx/vpx_image.h"
+#include "vpx/vpx_integer.h"
+#include "vpx_ports/msvc.h"
 
 #include "igtlCodecCommonClasses.h"
 #include "igtl_header.h"
@@ -31,6 +32,16 @@
 #include "igtlVideoMessage.h"
 #include "igtlTimeStamp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+  typedef struct VpxInterfaceEncoder {
+    vpx_codec_iface_t *(*const codec_interface)();
+  } VpxInterfaceEncoder;
+  
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
 
 using namespace std;
 
@@ -90,7 +101,13 @@ class VP9Encoder: public GenericEncoder
   
 private:
   
-  const VpxInterface *encoder;
+  const VpxInterfaceEncoder *encoder;
+  
+  void error_output(vpx_codec_ctx_t *ctx, const char *s);
+  
+  int vpx_img_plane_width(const vpx_image_t *img, int plane);
+  
+  int vpx_img_plane_height(const vpx_image_t *img, int plane);
   
   vpx_codec_enc_cfg_t cfg;
   
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index df6eddc1..8829cb87 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -1,5 +1,5 @@
 # Add support for OpenIGTLink version 3
-IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LINK_X265 OR LINK_OPENHEVC))
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X265 OR USE_OPENHEVC))
   LIST(APPEND OpenIGTLink_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/Source/VideoStreaming)
   LIST(APPEND OpenIGTLink_SOURCES
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtl_video.c
@@ -10,7 +10,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LIN
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlCodecCommonClasses.cxx
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlVideoMetaMessage.cxx
     )
-  LIST(APPENDOpenIGTLink_INCLUDE_DIRS
+  LIST(APPEND OpenIGTLink_INCLUDE_DIRS
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming
     )
   IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
@@ -24,45 +24,52 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LIN
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtlVideoMetaMessage.h
       )
   ENDIF()
-  IF(USE_H264 AND OpenH264_FOUND)
-    LIST(APPEND OpenIGTLink_SOURCES
-      ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.cxx
-      ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.cxx
-      ${H264_SOURCE_DIR}/test/api/sha1.c
-      ${H264_SOURCE_DIR}/codec/console/common/src/read_config.cpp
-      )
-    IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
-      LIST(APPEND OpenIGTLink_INCLUDE_FILES
-        ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.h
-        ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.h
-        ${H264_SOURCE_DIR}/test/sha1.h
-        ${H264_SOURCE_DIR}/codec/console/common/inc/read_config.h
-      )
-    ENDIF()
-  ENDIF()
-
-  IF(USE_VP9 AND VP9_FOUND)
-    LIST(APPEND OpenIGTLink_SOURCES
-      ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Decoder.cxx
-      ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Encoder.cxx
-      ${VP9_SOURCE_DIR}/tools_common.c
-      ${VP9_SOURCE_DIR}/video_reader.c
-      ${VP9_SOURCE_DIR}/ivfdec.c
-      ${VP9_LIBRARY_DIR}/vpx_config.c
-      )
-    IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
-      LIST(APPEND OpenIGTLink_INCLUDE_FILES
-        ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Decoder.h
-        ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Encoder.h
-        ${VP9_LIBRARY_DIR}/vpx_config.h
-        ${VP9_SOURCE_DIR}/tools_common.h
-        ${VP9_SOURCE_DIR}/video_reader.h
-        ${VP9_SOURCE_DIR}/ivfdec.h
-      )
-    ENDIF()
+  IF(USE_H264)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES openh264)
+    INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_openh264.cmake)
+  	IF((EXISTS ${H264_SOURCE_DIR}) AND (EXISTS ${H264_LIBRARY_DIR}))
+			LIST(APPEND OpenIGTLink_SOURCES
+				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.cxx
+				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.cxx
+				)
+			IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+				LIST(APPEND OpenIGTLink_INCLUDE_FILES
+					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.h
+					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.h)
+			ENDIF()
+			LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		${H264_SOURCE_DIR}/codec/api/svc/
+    	)
+		ELSE()
+			MESSAGE("H264_SOURCE_DIR or H264_LIBRARY_DIR no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
+		ENDIF()
+	ENDIF()
+	
+  IF(USE_VP9)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
+    INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_VP9.cmake)
+  	IF((EXISTS ${VP9_SOURCE_DIR}) AND (EXISTS ${VP9_LIBRARY_DIR}))
+  		LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		${VP9_SOURCE_DIR}
+    		${VP9_LIBRARY_DIR}
+    	)
+			LIST(APPEND OpenIGTLink_SOURCES
+				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Decoder.cxx
+				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Encoder.cxx
+				)
+			IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
+				LIST(APPEND OpenIGTLink_INCLUDE_FILES
+					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Decoder.h
+					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Encoder.h
+				)
+			ENDIF()
+		ELSE()
+			MESSAGE("VP9_SOURCE_DIR or VP9_LIBRARY_DIR no found")
+		ENDIF()
   ENDIF()
 
   IF(USE_X265 AND X265_FOUND)
+  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_x264.cmake)
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.cxx
       )
@@ -73,7 +80,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LIN
     ENDIF()
   ENDIF()
 
-  IF(USE_OPENHEVC and OpenHEVC_FOUND)
+  IF(USE_OPENHEVC AND OpenHEVC_FOUND)
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Decoder.cxx
       )
@@ -84,3 +91,30 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9 OR LIN
     ENDIF()
   ENDIF()
 ENDIF()
+
+
+IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
+  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
+		LIST(APPEND LINK_LIBS
+    	${H264_LIBRARY_DIR}/openh264.lib
+    )
+	ENDIF()
+  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
+    #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
+    SET(LINK_VP9_LIBRARY optimized ${VP9_LIBRARY_DIR}\\$(Platform)\\Release\\vpxmd.lib debug ${VP9_LIBRARY_DIR}\\$(Platform)\\Debug\\vpxmdd.lib)
+    LIST(APPEND LINK_LIBS
+      ${LINK_VP9_LIBRARY}
+    )
+  ENDIF()
+ELSE() # for POSIX-compatible OSs
+	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
+		LIST(APPEND LINK_LIBS
+		  ${H264_LIBRARY_DIR}/libopenh264.a
+		)
+	ENDIF()
+  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
+    LIST(APPEND LINK_LIBS
+      ${VP9_LIBRARY_DIR}/libvpx.a
+    )
+  ENDIF()
+ENDIF()
diff --git a/Source/igtlutil/CMakeLists.txt b/Source/igtlutil/CMakeLists.txt
index 26a6767d..b44a4149 100644
--- a/Source/igtlutil/CMakeLists.txt
+++ b/Source/igtlutil/CMakeLists.txt
@@ -113,7 +113,7 @@ INSTALL(FILES ${igtlutil_HEADS}
   DESTINATION ${igtlutil_INSTALL_INCLUDE_DIR}
   COMPONENT Development)
 
-INSTALL(TARGETS OpenIGTLink EXPORT OpenIGTLink
+INSTALL(TARGETS igtlutil EXPORT OpenIGTLink
   RUNTIME DESTINATION ${OpenIGTLink_INSTALL_BIN_DIR} COMPONENT RuntimeLibraries
   LIBRARY DESTINATION ${OpenIGTLink_INSTALL_LIB_DIR} COMPONENT RuntimeLibraries
   ARCHIVE DESTINATION ${OpenIGTLink_INSTALL_LIB_DIR} COMPONENT Development)
\ No newline at end of file
diff --git a/SuperBuild/External_VP9.cmake b/SuperBuild/External_VP9.cmake
new file mode 100644
index 00000000..59bc5468
--- /dev/null
+++ b/SuperBuild/External_VP9.cmake
@@ -0,0 +1,28 @@
+cmake_minimum_required(VERSION 2.8.2)
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+IF((EXISTS ${VP9_SOURCE_DIR}) AND (EXISTS ${VP9_LIBRARY_DIR}))
+  IF(${OpenIGTLink_PROTOCOL_VERSION} LESS 3 OR (NOT ${BUILD_VIDEOSTREAM}))
+    MESSAGE(FATAL_ERROR "Video streaming requires a build of OpenIGTLink with v3 support enabled. Please set the OpenIGTLink_PROTOCOL_VERSION_3 to true and activate the BUILD_VIDEOSTREAM.")
+  ENDIF()
+ELSE()
+  # OpenIGTLink has not been built yet, so download and build it as an external project
+  MESSAGE(STATUS "Downloading VP9 from https://github.com/webmproject/libvpx.git")              
+	IF(NOT ${VP9_SOURCE_DIR} EQUAL "")
+  	include_directories("${VP9_SOURCE_DIR}")
+  ENDIF()
+  SET (VP9_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
+  SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9-bin" CACHE PATH "VP9 library directory"  FORCE)
+  ExternalProject_Add(VP9
+    SOURCE_DIR "${VP9_SOURCE_DIR}"
+    BINARY_DIR "${VP9_LIBRARY_DIR}"
+    #--Download step--------------
+    GIT_REPOSITORY https://github.com/webmproject/libvpx.git
+    GIT_TAG master
+    #--Configure step-------------
+    CONFIGURE_COMMAND ""
+    #--Build step-----------------
+    BUILD_COMMAND "" 
+    #--Install step-----------------
+    INSTALL_COMMAND ""
+    )  
+ENDIF()
diff --git a/SuperBuild/External_openh264.cmake b/SuperBuild/External_openh264.cmake
new file mode 100644
index 00000000..e75941cb
--- /dev/null
+++ b/SuperBuild/External_openh264.cmake
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 2.8.2)
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+IF((EXISTS ${H264_SOURCE_DIR}) AND (EXISTS ${H264_LIBRARY_DIR}))
+  # H264 has been built already
+  #FIND_PACKAGE(openh264)
+  IF(${OpenIGTLink_PROTOCOL_VERSION} LESS 3 OR (NOT ${BUILD_VIDEOSTREAM}))
+    MESSAGE(FATAL_ERROR "Video streaming requires a build of OpenIGTLink with v3 support enabled. Please set the OpenIGTLink_PROTOCOL_VERSION_3 to true and activate the BUILD_VIDEOSTREAM.")
+  ENDIF()
+ELSE()
+  # OpenIGTLink has not been built yet, so download and build it as an external project
+  MESSAGE(STATUS "Downloading openh264 from https://github.com/cisco/openh264.git.")              
+  SET (H264_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 source directory" FORCE)
+  SET (H264_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 library directory" FORCE)
+  ExternalProject_Add(openh264
+    SOURCE_DIR "${H264_SOURCE_DIR}"
+    BINARY_DIR "${H264_LIBRARY_DIR}"
+    #--Download step--------------
+    GIT_REPOSITORY https://github.com/cisco/openh264.git
+    GIT_TAG master
+    #--Configure step-------------
+    CONFIGURE_COMMAND ""
+    #--Build step-----------------
+    BUILD_COMMAND "" 
+    #--Install step-----------------
+    INSTALL_COMMAND ""
+    )  
+ENDIF()
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index d7d52996..e803e501 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -1,3 +1,5 @@
+cmake_minimum_required(VERSION 2.8.2)
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 IF(x265_DIR)
   # x265 has been built already
   FIND_PACKAGE(x265 REQUIRED)
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index 08b80749..e6f25a11 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -3,37 +3,42 @@ SET(OpenIGTLink_DEPENDENCIES)
 
 #---------------------------------------------------
 # VideoStreaming dependencies
-IF(USE_H264)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_OpenH264.cmake)
-  LIST(APPEND OpenIGTLink_DEPENDENCIES openh264)
-ENDIF()
+IF(BUILD_VIDEOSTREAM)
+  IF(USE_H264)
+    set(H264_SOURCE_DIR "" CACHE PATH "H264 source directory" FORCE)
+		set(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory" FORCE)     
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openh264.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES openh264)
+  ENDIF()
 
-IF(USE_VP9)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_VPX.cmake)
-  LIST(APPEND OpenIGTLink_DEPENDENCIES vpx)
-ENDIF()
+  IF(USE_VP9)
+    set(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory" FORCE)
+		set(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory" FORCE)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_VP9.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
+  ENDIF()
 
-IF(USE_X265)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_x265.cmake)
-  LIST(APPEND OpenIGTLink_DEPENDENCIES x265)
-ENDIF()
+  IF(USE_X265)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_x265.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES x265)
+  ENDIF()
 
-IF(USE_OPENHEVC)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_OpenHEVC.cmake)
-  LIST(APPEND OpenIGTLink_DEPENDENCIES openHEVC)
-ENDIF()
+  IF(USE_OPENHEVC)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_OpenHEVC.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES openHEVC)
+  ENDIF()
 
-IF(BUILD_WEBSOCKET)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_WebSocket.cmake)
-  LIST(APPEND OpenIGTLink_DEPENDENCIES websocket)
-ENDIF()
+  IF(BUILD_WEBSOCKET)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_WebSocket.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES websocket)
+  ENDIF()
 
-IF(BUILD_TESTING AND USE_GTEST)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_googletest.cmake)
-  LIST(APPEND OpenIGTLink_DEPENDENCIES googletest)
+  IF(BUILD_TESTING AND USE_GTEST)
+    INCLUDE(${CMAKE_SOURCE_DIR}/Testing/External_googletest.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES GTest GMock)
+  ENDIF()
 ENDIF()
-
 #---------------------------------------------------
 # OpenIGTLink library
 ExternalProject_Add( OpenIGTLink-lib
@@ -41,22 +46,33 @@ ExternalProject_Add( OpenIGTLink-lib
   SOURCE_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink"
   BINARY_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink-bin"
   #--Download step--------------
-  GIT_REPOSITORY "https://github.com/openigtlink/OpenIGTLink.git"
-  GIT_TAG master
+  GIT_REPOSITORY "https://github.com/leochan2009/OpenIGTLink.git"
+  GIT_TAG superbuild-findmodules
   #--Configure step-------------
   CMAKE_ARGS
     ${PLATFORM_SPECIFIC_ARGS}
-    -DIGTL_SUPERBUILD:BOOL=OFF
+    -DOpenIGTLink_SUPERBUILD:BOOL=OFF
     -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
     -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
     -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
     -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
     -DBUILD_TESTING:BOOL=${BUILD_TESTING}
+    -DUSE_GTEST:BOOL=${USE_GTEST}
+    -DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
+    -DUSE_H264:BOOL=${USE_H264}
+    -DUSE_VP9:BOOL=${USE_VP9}
+    -DUSE_X265:BOOL=${USE_X265}
+    -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
+    -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
+    -DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
+    -DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
+    -DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
+    -DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
     -DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
     -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
     -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-    -DGTEST_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
-    -DGMOCK_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
+    #-DGTEST_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
+    #-DGMOCK_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
   #--Build step-----------------
   BUILD_ALWAYS 1
   DEPENDS ${OpenIGTLink_DEPENDENCIES}
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index e6bfa3ec..9ef94c7e 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -1,11 +1,13 @@
 PROJECT(OpenIGTLinkTesting)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
 
 OPTION(USE_GTEST "Use Googletest to drive the testing." ON)
+SET(OpenIGTLink_USE_GTEST "0")
 CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/igtlTestConfig.h.in ${PROJECT_BINARY_DIR}/igtlTestConfig.h)
+include_directories(${PROJECT_BINARY_DIR})
 
-IF(OpenIGTLink_USE_GTEST)
+IF(USE_GTEST)
   IF(${CMAKE_GENERATOR} MATCHES "Visual Studio 11" ) # VS2012 doesn't support correctly the tuples yet
     ADD_DEFINITIONS("-D_VARIADIC_MAX=10")
   ENDIF()
@@ -13,9 +15,13 @@ IF(OpenIGTLink_USE_GTEST)
   # Prevent GoogleTest from overriding our compiler/linker options
   # when building with Visual Studio
   SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-
-  FIND_PACKAGE(GTest REQUIRED)
-  FIND_PACKAGE(GMock REQUIRED)
+  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_googletest.cmake)
+  LIST(APPEND OpenIGTLinkTesting_DEPENDENCIES googletest)
+  FIND_PACKAGE(GTest)
+  IF(GTest_DIR)
+    SET(OpenIGTLink_USE_GTEST "1")
+  ENDIF()
+  #FIND_PACKAGE(GMock REQUIRED)
 ENDIF()
 
 ADD_SUBDIRECTORY(igtlutil)
@@ -56,12 +62,12 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
   ADD_EXECUTABLE(igtlMessageRTPWrapperTest    igtlMessageRTPWrapperTest.cxx)
 ENDIF()
 
-IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR (USE_X265 AND USE_OPENHEVC)))
   ADD_EXECUTABLE(igtlVideoMessageTest         igtlVideoMessageTest.cxx)
   ADD_EXECUTABLE(igtlVideoMetaMessageTest     igtlVideoMetaMessageTest.cxx)
 ENDIF()
 
-IF(USE_GTEST)
+IF(OpenIGTLink_USE_GTEST)
   SET(GTEST_LINK OpenIGTLink GTest::Main GTest::GTest gmock_main gmock)
 ELSE()
   SET(GTEST_LINK OpenIGTLink)
@@ -103,7 +109,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
   TARGET_LINK_LIBRARIES(igtlMessageRTPWrapperTest   ${GTEST_LINK})
 ENDIF()
 
-IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR (USE_X265 AND USE_OPENHEVC)))
   TARGET_LINK_LIBRARIES(igtlVideoMessageTest        ${GTEST_LINK})
   TARGET_LINK_LIBRARIES(igtlVideoMetaMessageTest    ${GTEST_LINK})
 ENDIF()
@@ -168,7 +174,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
   ADD_TEST(igtlMessageRTPWrapperTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageRTPWrapperTest ${TestStringFormat2})
 ENDIF()
 
-IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (LINK_H264 OR LINK_VP9))
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR (USE_X265 AND USE_OPENHEVC)))
   ADD_TEST(igtlVideoMessageTestFormatVersion1         ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat1})
   ADD_TEST(igtlVideoMessageTestFormatVersion2         ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat2})
   ADD_TEST(igtlVideoMetaMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMetaMessageTest ${TestStringFormat2})
diff --git a/Testing/External_googletest.cmake b/Testing/External_googletest.cmake
new file mode 100644
index 00000000..e7051d16
--- /dev/null
+++ b/Testing/External_googletest.cmake
@@ -0,0 +1,40 @@
+cmake_minimum_required(VERSION 2.8.2)
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+ExternalProject_Add(GTest
+	PREFIX "${CMAKE_BINARY_DIR}/Deps/gtest-prefix"
+  SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest"
+  BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest_DIR"
+  #--Download step--------------
+    URL https://github.com/google/googletest/archive/release-1.7.0.zip
+  #--Configure step-------------
+    CMAKE_ARGS
+      ${PLATFORM_SPECIFIC_ARGS}
+      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+      -DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
+      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+  #--Build step-----------------
+  BUILD_ALWAYS 1
+  INSTALL_COMMAND ""
+)
+
+ExternalProject_Add(GMock
+	PREFIX "${CMAKE_BINARY_DIR}/Deps/gmock-prefix"
+  SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock"
+  BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock_DIR"
+  URL https://github.com/google/googlemock/archive/release-1.7.0.zip
+  #--Configure step-------------
+    CMAKE_ARGS
+      ${PLATFORM_SPECIFIC_ARGS}
+      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+      -DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
+      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+  #--Build step-----------------
+  BUILD_ALWAYS 1
+  INSTALL_COMMAND ""
+)
\ No newline at end of file
diff --git a/Testing/igtlVideoMessageTest.cxx b/Testing/igtlVideoMessageTest.cxx
index 76211978..a170a98e 100644
--- a/Testing/igtlVideoMessageTest.cxx
+++ b/Testing/igtlVideoMessageTest.cxx
@@ -45,7 +45,6 @@
 #if OpenIGTLink_LINK_VP9
   #include "VP9Encoder.h"
   #include "VP9Decoder.h"
-  #include "../video_reader.h"
   #include "./vpx_config.h"
   #include "vpx_dsp_rtcd.h"
   #include "vpx_dsp/ssim.h"
@@ -159,7 +158,7 @@ int TestWithVersion(int version, GenericEncoder* videoStreamEncoder, GenericDeco
             }
             if (compareImage)
             {
-              TestDebugCharArrayCmp(pDecodedPic->data[0], imagePointer, kiPicResSize * 3 / 2);
+              //TestDebugCharArrayCmp(pDecodedPic->data[0], imagePointer, kiPicResSize * 3 / 2);
               if (memcmp(pDecodedPic->data[0], imagePointer, kiPicResSize * 3 / 2) != 0)
               {
                 return -1;

From f5b25515b5096772244a252585b3feb72bde5d04 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 28 Jul 2017 12:53:59 -0400
Subject: [PATCH 03/21] Feature: include of OpenH264 library is now  working

---
 CMakeLists.txt                               | 14 ++--
 Source/VideoStreaming/VideoStreaming.cmake   | 17 ++--
 SuperBuild/CMakeListsOpenH264Download.txt.in | 12 +++
 SuperBuild/External_openh264.cmake           | 31 ++++---
 SuperBuild/Superbuild.cmake                  | 16 ++--
 Testing/CMakeLists.txt                       | 84 ++++++++++---------
 Testing/External_googletest.cmake            | 88 ++++++++++++--------
 7 files changed, 145 insertions(+), 117 deletions(-)
 create mode 100644 SuperBuild/CMakeListsOpenH264Download.txt.in

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e099c5c..1b9fc75c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,10 +39,11 @@ SET(OpenIGTLink_LINK_H264 "0")
 SET(OpenIGTLink_LINK_VP9 "0")
 SET(OpenIGTLink_LINK_X265 "0")
 SET(OpenIGTLink_LINK_OPENHEVC "0")
-SET(H264_SOURCE_DIR "" CACHE PATH "H264 source directory")
+
 SET(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory")
-SET(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory")
-SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")   
+MARK_AS_ADVANCED(H264_LIBRARY_DIR)
+SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")  
+MARK_AS_ADVANCED(VP9_LIBRARY_DIR) 
 IF(BUILD_VIDEOSTREAM)
   IF(USE_H264)
 		SET(OpenIGTLink_LINK_H264 "1")     
@@ -80,6 +81,10 @@ SET(OpenIGTLink_BUILD_EXAMPLES ${BUILD_EXAMPLES})
 OPTION(BUILD_TESTING "Build the testing tree." ON)
 OPTION(USE_GTEST "Use googletest for testing" ON)
 SET(OpenIGTLink_BUILD_TESTING ${BUILD_TESTING})
+SET(OpenIGTLink_USE_GTEST "0")
+IF(USE_GTEST)
+  SET(OpenIGTLink_USE_GTEST "1")
+ENDIF()
 
 #-----------------------------------------------------------------------------
 OPTION(BUILD_DOCUMENTATION "Build OpenIGTLink Documentation" OFF)
@@ -190,9 +195,8 @@ ENDIF()
 #-----------------------------------------------------------------------------
 # Run superbuild script instead of library script
 IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
-  MESSAGE ("Cmake version is not less than 3.4, super build available")
+  #MESSAGE ("Cmake version is not less than 3.4, super build available")
 	OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." OFF)
-	#MARK_AS_ADVANCED(OpenIGTLink_SUPERBUILD)
 	IF(OpenIGTLink_SUPERBUILD)
 		INCLUDE(SuperBuild/Superbuild.cmake)
 		RETURN()
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index 8829cb87..043c315a 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -25,9 +25,8 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
       )
   ENDIF()
   IF(USE_H264)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES openh264)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_openh264.cmake)
-  	IF((EXISTS ${H264_SOURCE_DIR}) AND (EXISTS ${H264_LIBRARY_DIR}))
+  	IF(EXISTS ${H264_LIBRARY_DIR})
 			LIST(APPEND OpenIGTLink_SOURCES
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.cxx
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.cxx
@@ -37,11 +36,13 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
 					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.h
 					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.h)
 			ENDIF()
-			LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${H264_SOURCE_DIR}/codec/api/svc/
-    	)
+    	IF(NOT ${H264_LIBRARY_DIR} EQUAL "")
+				LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		"${H264_LIBRARY_DIR}/include/wels/" )
+    		LINK_DIRECTORIES("${H264_LIBRARY_DIR}/lib")
+			ENDIF()	
 		ELSE()
-			MESSAGE("H264_SOURCE_DIR or H264_LIBRARY_DIR no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
+			MESSAGE("H264_LIBRARY_DIR no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
 		ENDIF()
 	ENDIF()
 	
@@ -96,7 +97,7 @@ ENDIF()
 IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
-    	${H264_LIBRARY_DIR}/openh264.lib
+    	${H264_LIBRARY_DIR}/lib/openh264.lib
     )
 	ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
@@ -109,7 +110,7 @@ IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
 ELSE() # for POSIX-compatible OSs
 	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
-		  ${H264_LIBRARY_DIR}/libopenh264.a
+		  ${H264_LIBRARY_DIR}/lib/libopenh264.a
 		)
 	ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
diff --git a/SuperBuild/CMakeListsOpenH264Download.txt.in b/SuperBuild/CMakeListsOpenH264Download.txt.in
new file mode 100644
index 00000000..142271c2
--- /dev/null
+++ b/SuperBuild/CMakeListsOpenH264Download.txt.in
@@ -0,0 +1,12 @@
+project(openh264-download NONE)
+include(ExternalProject)
+ExternalProject_Add(openh264-download
+	SOURCE_DIR "${H264_SOURCE_DIR}"
+  BINARY_DIR "${H264_LIBRARY_DIR}"
+  GIT_REPOSITORY https://github.com/cisco/openh264.git
+  GIT_TAG master
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND     ""
+  INSTALL_COMMAND   ""
+  TEST_COMMAND      ""
+)    
\ No newline at end of file
diff --git a/SuperBuild/External_openh264.cmake b/SuperBuild/External_openh264.cmake
index e75941cb..8d8c6a52 100644
--- a/SuperBuild/External_openh264.cmake
+++ b/SuperBuild/External_openh264.cmake
@@ -1,27 +1,24 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-IF((EXISTS ${H264_SOURCE_DIR}) AND (EXISTS ${H264_LIBRARY_DIR}))
+IF(EXISTS ${H264_LIBRARY_DIR})
   # H264 has been built already
-  #FIND_PACKAGE(openh264)
   IF(${OpenIGTLink_PROTOCOL_VERSION} LESS 3 OR (NOT ${BUILD_VIDEOSTREAM}))
     MESSAGE(FATAL_ERROR "Video streaming requires a build of OpenIGTLink with v3 support enabled. Please set the OpenIGTLink_PROTOCOL_VERSION_3 to true and activate the BUILD_VIDEOSTREAM.")
   ENDIF()
 ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
-  MESSAGE(STATUS "Downloading openh264 from https://github.com/cisco/openh264.git.")              
+  MESSAGE(STATUS "Downloading openh264 from https://github.com/cisco/openh264.git.")  
   SET (H264_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 source directory" FORCE)
-  SET (H264_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 library directory" FORCE)
-  ExternalProject_Add(openh264
-    SOURCE_DIR "${H264_SOURCE_DIR}"
-    BINARY_DIR "${H264_LIBRARY_DIR}"
-    #--Download step--------------
-    GIT_REPOSITORY https://github.com/cisco/openh264.git
-    GIT_TAG master
-    #--Configure step-------------
-    CONFIGURE_COMMAND ""
-    #--Build step-----------------
-    BUILD_COMMAND "" 
-    #--Install step-----------------
-    INSTALL_COMMAND ""
-    )  
+  SET (H264_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openh264-bin" CACHE PATH "H264 library directory" FORCE)   							
+	configure_file(${OpenIGTLink_SOURCE_DIR}/SuperBuild/CMakeListsOpenH264Download.txt.in
+  ${PROJECT_BINARY_DIR}/Deps/openh264-download/CMakeLists.txt)
+	#Here the downloading project is triggered                                                               
+	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR} -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR} . 
+									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/openh264-download" )
+	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
+									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/openh264-download" )                    
+	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")             
+					execute_process(COMMAND "make" WORKING_DIRECTORY "${H264_SOURCE_DIR}" )  
+					execute_process(COMMAND make install PREFIX=${H264_LIBRARY_DIR} WORKING_DIRECTORY "${H264_SOURCE_DIR}" )                       
+	endif(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 							
 ENDIF()
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index e6f25a11..2195bf47 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -8,14 +8,12 @@ IF(BUILD_VIDEOSTREAM)
     set(H264_SOURCE_DIR "" CACHE PATH "H264 source directory" FORCE)
 		set(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory" FORCE)     
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openh264.cmake)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES openh264)
   ENDIF()
 
   IF(USE_VP9)
     set(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory" FORCE)
 		set(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_VP9.cmake)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
   ENDIF()
 
   IF(USE_X265)
@@ -35,7 +33,7 @@ IF(BUILD_VIDEOSTREAM)
   ENDIF()
 
   IF(BUILD_TESTING AND USE_GTEST)
-    INCLUDE(${CMAKE_SOURCE_DIR}/Testing/External_googletest.cmake)
+    INCLUDE(${OpenIGTLink_SOURCE_DIR}/Testing/External_googletest.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES GTest GMock)
   ENDIF()
 ENDIF()
@@ -62,17 +60,17 @@ ExternalProject_Add( OpenIGTLink-lib
     -DUSE_H264:BOOL=${USE_H264}
     -DUSE_VP9:BOOL=${USE_VP9}
     -DUSE_X265:BOOL=${USE_X265}
-    -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
-    -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
-    -DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
-    -DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
     -DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
     -DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
     -DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
     -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
     -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-    #-DGTEST_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
-    #-DGMOCK_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-install
+    -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
+    -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
+    -DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
+    -DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
+    -DGTEST_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-bin
+    -DGMOCK_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gmock-bin
   #--Build step-----------------
   BUILD_ALWAYS 1
   DEPENDS ${OpenIGTLink_DEPENDENCIES}
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 9ef94c7e..62ee0007 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -2,8 +2,6 @@ PROJECT(OpenIGTLinkTesting)
 
 CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
 
-OPTION(USE_GTEST "Use Googletest to drive the testing." ON)
-SET(OpenIGTLink_USE_GTEST "0")
 CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/igtlTestConfig.h.in ${PROJECT_BINARY_DIR}/igtlTestConfig.h)
 include_directories(${PROJECT_BINARY_DIR})
 
@@ -11,17 +9,14 @@ IF(USE_GTEST)
   IF(${CMAKE_GENERATOR} MATCHES "Visual Studio 11" ) # VS2012 doesn't support correctly the tuples yet
     ADD_DEFINITIONS("-D_VARIADIC_MAX=10")
   ENDIF()
-
+  SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
   # Prevent GoogleTest from overriding our compiler/linker options
   # when building with Visual Studio
-  SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-  INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_googletest.cmake)
-  LIST(APPEND OpenIGTLinkTesting_DEPENDENCIES googletest)
-  FIND_PACKAGE(GTest)
-  IF(GTest_DIR)
-    SET(OpenIGTLink_USE_GTEST "1")
-  ENDIF()
-  #FIND_PACKAGE(GMock REQUIRED)
+  INCLUDE(${OpenIGTLink_SOURCE_DIR}/Testing/External_googletest.cmake)
+  include_directories("${CMAKE_BINARY_DIR}/Deps/gtest/include")
+  include_directories("${CMAKE_BINARY_DIR}/Deps/gmock/include")
+  LINK_DIRECTORIES("${CMAKE_BINARY_DIR}/Deps/gtest-bin")
+  LINK_DIRECTORIES("${CMAKE_BINARY_DIR}/Deps/gmock-bin")
 ENDIF()
 
 ADD_SUBDIRECTORY(igtlutil)
@@ -68,50 +63,57 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H2
 ENDIF()
 
 IF(OpenIGTLink_USE_GTEST)
-  SET(GTEST_LINK OpenIGTLink GTest::Main GTest::GTest gmock_main gmock)
+  SET(GTEST_LINK OpenIGTLink gtest gtest_main gmock_main gmock)
 ELSE()
   SET(GTEST_LINK OpenIGTLink)
 ENDIF()
 
-TARGET_LINK_LIBRARIES(igtlMultiThreaderTest1    OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMultiThreaderTest2    OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMultiThreaderTest3    OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMessageFactoryTest    OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlTimeStampTest1        OpenIGTLink)
-TARGET_LINK_LIBRARIES(igtlMessageBaseTest       ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlConditionVariableTest ${GTEST_LINK})
-
-TARGET_LINK_LIBRARIES(igtlImageMessageTest      ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlImageMessage2Test     ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlCapabilityMessageTest ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlStatusMessageTest     ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlTransformMessageTest  ${GTEST_LINK})
-TARGET_LINK_LIBRARIES(igtlPositionMessageTest   ${GTEST_LINK})
+function(target_link_with_gtest_dependency target)
+	IF(OpenIGTLink_USE_GTEST)
+		add_dependencies(${target} GTest GMock)
+	ENDIF()
+ 	TARGET_LINK_LIBRARIES(${target} ${GTEST_LINK})
+endfunction()
+
+target_link_with_gtest_dependency(igtlMultiThreaderTest1)
+target_link_with_gtest_dependency(igtlMultiThreaderTest2)
+target_link_with_gtest_dependency(igtlMultiThreaderTest3)
+target_link_with_gtest_dependency(igtlMessageFactoryTest)
+target_link_with_gtest_dependency(igtlTimeStampTest1)
+target_link_with_gtest_dependency(igtlMessageBaseTest)
+target_link_with_gtest_dependency(igtlConditionVariableTest)
+
+target_link_with_gtest_dependency(igtlImageMessageTest      ${GTEST_LINK})
+target_link_with_gtest_dependency(igtlImageMessage2Test     ${GTEST_LINK})
+target_link_with_gtest_dependency(igtlCapabilityMessageTest ${GTEST_LINK})
+target_link_with_gtest_dependency(igtlStatusMessageTest     ${GTEST_LINK})
+target_link_with_gtest_dependency(igtlTransformMessageTest  ${GTEST_LINK})
+target_link_with_gtest_dependency(igtlPositionMessageTest   ${GTEST_LINK})
 
 # Message Tests Added in Version 2
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  TARGET_LINK_LIBRARIES(igtlBindMessageTest         ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlColorTableMessageTest   ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlLabelMetaMessageTest    ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlNDArrayMessageTest      ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlImageMetaMessageTest    ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlPointMessageTest        ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlPolyDataMessageTest     ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlSensorMessageTest       ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlStringMessageTest       ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlTrackingDataMessageTest ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlTrajectoryMessageTest   ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlBindMessageTest         ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlColorTableMessageTest   ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlLabelMetaMessageTest    ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlNDArrayMessageTest      ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlImageMetaMessageTest    ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlPointMessageTest        ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlPolyDataMessageTest     ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlSensorMessageTest       ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlStringMessageTest       ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlTrackingDataMessageTest ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlTrajectoryMessageTest   ${GTEST_LINK})
 ENDIF()
 
 # Message Tests Added in Version 3
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
-  TARGET_LINK_LIBRARIES(igtlCommandMessageTest      ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlMessageRTPWrapperTest   ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlCommandMessageTest      ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlMessageRTPWrapperTest   ${GTEST_LINK})
 ENDIF()
 
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR (USE_X265 AND USE_OPENHEVC)))
-  TARGET_LINK_LIBRARIES(igtlVideoMessageTest        ${GTEST_LINK})
-  TARGET_LINK_LIBRARIES(igtlVideoMetaMessageTest    ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlVideoMessageTest        ${GTEST_LINK})
+  target_link_with_gtest_dependency(igtlVideoMetaMessageTest    ${GTEST_LINK})
 ENDIF()
 
 SET(TestStringFormat1 "--gtest_filter=*.*FormatVersion1")
diff --git a/Testing/External_googletest.cmake b/Testing/External_googletest.cmake
index e7051d16..78e17d2c 100644
--- a/Testing/External_googletest.cmake
+++ b/Testing/External_googletest.cmake
@@ -1,40 +1,54 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-ExternalProject_Add(GTest
-	PREFIX "${CMAKE_BINARY_DIR}/Deps/gtest-prefix"
-  SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest"
-  BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest_DIR"
-  #--Download step--------------
-    URL https://github.com/google/googletest/archive/release-1.7.0.zip
-  #--Configure step-------------
-    CMAKE_ARGS
-      ${PLATFORM_SPECIFIC_ARGS}
-      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
-      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
-      -DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
-      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-  #--Build step-----------------
-  BUILD_ALWAYS 1
-  INSTALL_COMMAND ""
-)
+IF(GTest_DIR)
+  # x265 has been built already
+  FIND_PACKAGE(GTest REQUIRED)
 
-ExternalProject_Add(GMock
-	PREFIX "${CMAKE_BINARY_DIR}/Deps/gmock-prefix"
-  SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock"
-  BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock_DIR"
-  URL https://github.com/google/googlemock/archive/release-1.7.0.zip
-  #--Configure step-------------
-    CMAKE_ARGS
-      ${PLATFORM_SPECIFIC_ARGS}
-      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
-      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
-      -DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
-      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-  #--Build step-----------------
-  BUILD_ALWAYS 1
-  INSTALL_COMMAND ""
-)
\ No newline at end of file
+  MESSAGE(STATUS "Using GTest available at: ${GTest_DIR}")
+
+  SET(OpenIGTLink_GTest_DIR "${GTest_DIR}" CACHE INTERNAL "Path to store gtest binaries")
+ELSE()
+	SET (OpenIGTLink_GTest_DIR "${CMAKE_BINARY_DIR}/Deps/gtest-bin" CACHE INTERNAL "Path to store gtest binaries")
+	ExternalProject_Add(GTest
+		PREFIX "${CMAKE_BINARY_DIR}/Deps/gtest-prefix"
+		SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest"
+		BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest-bin"
+		#--Download step--------------
+		URL https://github.com/google/googletest/archive/release-1.7.0.zip
+		#--Configure step-------------
+		CMAKE_ARGS
+			${PLATFORM_SPECIFIC_ARGS}
+			-DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
+			-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+			-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+		#--Build step-----------------
+		BUILD_ALWAYS 1
+		INSTALL_COMMAND ""
+	)
+ENDIF()
+
+IF(GMock_DIR)
+  # GMock has been built already
+  FIND_PACKAGE(GMock REQUIRED)
+
+  MESSAGE(STATUS "Using GTest available at: ${GMock_DIR}")
+
+  SET(OpenIGTLink_GMock_DIR "${GMock_DIR}" CACHE INTERNAL "Path to store gmock binaries")
+ELSE()  
+	SET (OpenIGTLink_GMock_DIR "${CMAKE_BINARY_DIR}/Deps/gmock-bin" CACHE INTERNAL "Path to store gmock binaries")
+	ExternalProject_Add(GMock
+		PREFIX "${CMAKE_BINARY_DIR}/Deps/gmock-prefix"
+		SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock"
+		BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock-bin"
+		URL https://github.com/google/googlemock/archive/release-1.7.0.zip
+		#--Configure step-------------
+		CMAKE_ARGS
+			${PLATFORM_SPECIFIC_ARGS}
+			-DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
+			-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+			-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+		#--Build step-----------------
+		BUILD_ALWAYS 1
+		INSTALL_COMMAND ""
+	)
+ENDIF()

From 0235e81c12a1b843f5c537e04f4819f68d34a117 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 28 Jul 2017 16:43:16 -0400
Subject: [PATCH 04/21] Feature: include of VP9  library is now working

---
 .travis.yml                                | 12 ++-------
 CMakeLists.txt                             |  2 ++
 Source/VideoStreaming/VP9Decoder.h         |  1 -
 Source/VideoStreaming/VP9Encoder.h         |  1 -
 Source/VideoStreaming/VideoStreaming.cmake |  7 ++++-
 SuperBuild/CMakeListsVP9Download.txt.in    | 12 +++++++++
 SuperBuild/External_VP9.cmake              | 31 +++++++++-------------
 Testing/External_googletest.cmake          |  5 +---
 Testing/igtlVideoMessageTest.cxx           |  2 --
 9 files changed, 36 insertions(+), 37 deletions(-)
 create mode 100644 SuperBuild/CMakeListsVP9Download.txt.in

diff --git a/.travis.yml b/.travis.yml
index 453c1e6c..eefeda2a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,22 +38,14 @@ before_script:
   - cd    build
 
 script:
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON ..
-  - make
-  - cd ..
-  - mkdir TestBuild
-  - cd TestBuild
-  - cmake -DCMAKE_PREFIX_PATH:PATH=../build -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON ../Testing
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
   - make 
   - make test 
   #########################
   # Test for version2 build
   - cd ../build
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=OFF -DBUILD_VIDEOSTREAM=OFF ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=OFF -DBUILD_VIDEOSTREAM=OFF -DBUILD_TESTING=ON ..
   - make
-  - cd ../TestBuild
-  - cmake -DCMAKE_PREFIX_PATH:PATH=../build ../Testing
-  - make 
   - make test
 
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1b9fc75c..e89c5e9b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -42,6 +42,8 @@ SET(OpenIGTLink_LINK_OPENHEVC "0")
 
 SET(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory")
 MARK_AS_ADVANCED(H264_LIBRARY_DIR)
+SET(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory")  
+MARK_AS_ADVANCED(VP9_SOURCE_DIR) 
 SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")  
 MARK_AS_ADVANCED(VP9_LIBRARY_DIR) 
 IF(BUILD_VIDEOSTREAM)
diff --git a/Source/VideoStreaming/VP9Decoder.h b/Source/VideoStreaming/VP9Decoder.h
index 14aaa9a2..a14e3606 100644
--- a/Source/VideoStreaming/VP9Decoder.h
+++ b/Source/VideoStreaming/VP9Decoder.h
@@ -36,7 +36,6 @@
 #include "vpx/vpx_codec.h"
 #include "vpx/vpx_image.h"
 #include "vpx/vpx_integer.h"
-#include "vpx_ports/msvc.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/Source/VideoStreaming/VP9Encoder.h b/Source/VideoStreaming/VP9Encoder.h
index 941800da..59333133 100644
--- a/Source/VideoStreaming/VP9Encoder.h
+++ b/Source/VideoStreaming/VP9Encoder.h
@@ -22,7 +22,6 @@
 #include "vpx/vpx_codec.h"
 #include "vpx/vpx_image.h"
 #include "vpx/vpx_integer.h"
-#include "vpx_ports/msvc.h"
 
 #include "igtlCodecCommonClasses.h"
 #include "igtl_header.h"
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index 043c315a..fca5ffbb 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -49,7 +49,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
   IF(USE_VP9)
     LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_VP9.cmake)
-  	IF((EXISTS ${VP9_SOURCE_DIR}) AND (EXISTS ${VP9_LIBRARY_DIR}))
+  	IF(EXISTS ${VP9_LIBRARY_DIR})
   		LIST(APPEND OpenIGTLink_INCLUDE_DIRS
     		${VP9_SOURCE_DIR}
     		${VP9_LIBRARY_DIR}
@@ -64,6 +64,11 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
 					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/VP9Encoder.h
 				)
 			ENDIF()
+			IF(NOT ${VP9_LIBRARY_DIR} EQUAL "")
+				LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		"${VP9_LIBRARY_DIR}" )
+    		LINK_DIRECTORIES("${VP9_LIBRARY_DIR}/lib")
+			ENDIF()	
 		ELSE()
 			MESSAGE("VP9_SOURCE_DIR or VP9_LIBRARY_DIR no found")
 		ENDIF()
diff --git a/SuperBuild/CMakeListsVP9Download.txt.in b/SuperBuild/CMakeListsVP9Download.txt.in
new file mode 100644
index 00000000..9cf79c68
--- /dev/null
+++ b/SuperBuild/CMakeListsVP9Download.txt.in
@@ -0,0 +1,12 @@
+project(VP9-download NONE)
+include(ExternalProject)
+ExternalProject_Add(VP9
+  GIT_REPOSITORY https://github.com/webmproject/libvpx/
+  GIT_TAG master
+  SOURCE_DIR        "${VP9_SOURCE_DIR}"
+  BINARY_DIR        "${VP9_LIBRARY_DIR}"
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND     ""
+  INSTALL_COMMAND   ""
+  TEST_COMMAND      ""
+)
diff --git a/SuperBuild/External_VP9.cmake b/SuperBuild/External_VP9.cmake
index 59bc5468..fe4b9b63 100644
--- a/SuperBuild/External_VP9.cmake
+++ b/SuperBuild/External_VP9.cmake
@@ -7,22 +7,17 @@ IF((EXISTS ${VP9_SOURCE_DIR}) AND (EXISTS ${VP9_LIBRARY_DIR}))
 ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
   MESSAGE(STATUS "Downloading VP9 from https://github.com/webmproject/libvpx.git")              
-	IF(NOT ${VP9_SOURCE_DIR} EQUAL "")
-  	include_directories("${VP9_SOURCE_DIR}")
-  ENDIF()
-  SET (VP9_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
-  SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9-bin" CACHE PATH "VP9 library directory"  FORCE)
-  ExternalProject_Add(VP9
-    SOURCE_DIR "${VP9_SOURCE_DIR}"
-    BINARY_DIR "${VP9_LIBRARY_DIR}"
-    #--Download step--------------
-    GIT_REPOSITORY https://github.com/webmproject/libvpx.git
-    GIT_TAG master
-    #--Configure step-------------
-    CONFIGURE_COMMAND ""
-    #--Build step-----------------
-    BUILD_COMMAND "" 
-    #--Install step-----------------
-    INSTALL_COMMAND ""
-    )  
+	SET (VP9_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
+  SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9-bin" CACHE PATH "VP9 library directory" FORCE)   							
+	configure_file(${OpenIGTLink_SOURCE_DIR}/SuperBuild/CMakeListsVP9Download.txt.in
+  ${PROJECT_BINARY_DIR}/Deps/VP9-download/CMakeLists.txt)
+	#Here the downloading project is triggered                                                               
+	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DH264_SOURCE_DIR:STRING=${VP9_SOURCE_DIR} -DH264_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR} . 
+									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/VP9-download" )
+	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
+									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/VP9-download" )                    
+	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")             
+		execute_process(COMMAND "${VP9_SOURCE_DIR}/configure" --disable-examples --disable-tools --disable-docs --disable-vp8 --disable-libyuv --disable-unit_tests --disable-postproc WORKING_DIRECTORY "${VP9_LIBRARY_DIR}" )
+    execute_process(COMMAND "make" WORKING_DIRECTORY "${VP9_LIBRARY_DIR}" )                       
+	endif(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
 ENDIF()
diff --git a/Testing/External_googletest.cmake b/Testing/External_googletest.cmake
index 78e17d2c..20b0d6f4 100644
--- a/Testing/External_googletest.cmake
+++ b/Testing/External_googletest.cmake
@@ -19,8 +19,6 @@ ELSE()
 		CMAKE_ARGS
 			${PLATFORM_SPECIFIC_ARGS}
 			-DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
-			-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-			-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
 		#--Build step-----------------
 		BUILD_ALWAYS 1
 		INSTALL_COMMAND ""
@@ -45,10 +43,9 @@ ELSE()
 		CMAKE_ARGS
 			${PLATFORM_SPECIFIC_ARGS}
 			-DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
-			-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-			-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
 		#--Build step-----------------
 		BUILD_ALWAYS 1
 		INSTALL_COMMAND ""
+		DEPENDS GTest
 	)
 ENDIF()
diff --git a/Testing/igtlVideoMessageTest.cxx b/Testing/igtlVideoMessageTest.cxx
index a170a98e..c7d85a8b 100644
--- a/Testing/igtlVideoMessageTest.cxx
+++ b/Testing/igtlVideoMessageTest.cxx
@@ -46,8 +46,6 @@
   #include "VP9Encoder.h"
   #include "VP9Decoder.h"
   #include "./vpx_config.h"
-  #include "vpx_dsp_rtcd.h"
-  #include "vpx_dsp/ssim.h"
 #endif
 
 int Width = 256;

From 3cd5413eb6652c3b6c999bca49c32eed3f469948 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Mon, 31 Jul 2017 08:35:32 -0400
Subject: [PATCH 05/21] BUG: linux gcc compile bug fixed, LIST(APPEND ...)
 should not be used for compiler flags in linux gcc

---
 .travis.yml                                | 14 +++++++--
 CMakeLists.txt                             | 34 ++++++++++++----------
 Source/CMakeLists.txt                      |  7 -----
 Source/VideoStreaming/VideoStreaming.cmake |  6 ++--
 SuperBuild/External_x265.cmake             |  1 +
 SuperBuild/Superbuild.cmake                |  9 ++----
 Testing/CMakeLists.txt                     |  2 +-
 7 files changed, 37 insertions(+), 36 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index eefeda2a..d78bb385 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,14 +38,22 @@ before_script:
   - cd    build
 
 script:
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=OFF -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
   - make 
   - make test 
   #########################
   # Test for version2 build
-  - cd ../build
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=OFF -DBUILD_VIDEOSTREAM=OFF -DBUILD_TESTING=ON ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=OFF -DOpenIGTLink_SUPERBUILD=OFF -DBUILD_VIDEOSTREAM=OFF -DBUILD_TESTING=ON ..
   - make
   - make test
+  #########################
+  # Test for Super build
+  - cd ..
+  - mkdir SuperBuild
+  - cd SuperBuild
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
+  - make
+  - cd OpenIGTLink-bin
+  - make test
 
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e89c5e9b..26b72e57 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -109,7 +109,7 @@ SET(OpenIGTLink_LIBRARY_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
 SET(OpenIGTLink_EXECUTABLE_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
 
 SET(OpenIGTLink_CMAKE_DIR "${OpenIGTLink_SOURCE_DIR}/CMake")
-LIST(APPEND CMAKE_MODULE_PATH "${OpenIGTLink_SOURCE_DIR}/CMake/Modules")
+SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH} ${OpenIGTLink_SOURCE_DIR}/CMake/Modules")
 
 #-----------------------------------------------------------------------------
 # Installation vars.
@@ -164,19 +164,19 @@ IF(CMAKE_COMPILER_IS_GNUCXX)
   INCLUDE(CheckCXXCompilerFlag)
   CHECK_CXX_COMPILER_FLAG("-fno-tree-vectorize" OpenIGTLink_GNUCXX_TREE_VECTORIZE_SUPPORT)
   IF(OpenIGTLink_GNUCXX_TREE_VECTORIZE_SUPPORT)
-    LIST(APPEND OpenIGTLink_REQUIRED_C_FLAGS -w -fno-tree-vectorize)
-    LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -ftemplate-depth-50 -fno-tree-vectorize)
+    SET(OpenIGTLink_REQUIRED_C_FLAGS "${OpenIGTLink_REQUIRED_C_FLAGS} -w -fno-tree-vectorize")
+    SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -ftemplate-depth-50 -fno-tree-vectorize")
   ENDIF()
 
   # If the library is built as a static library, pass -fPIC option to the compiler
   IF(OpenIGTLink_BUILD_GENERATE_PIC)
-    LIST(APPEND OpenIGTLink_REQUIRED_C_FLAGS -fPIC)
-    LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -fPIC)
+    SET(OpenIGTLink_REQUIRED_C_FLAGS "${OpenIGTLink_REQUIRED_C_FLAGS} -fPIC")
+    SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -fPIC")
   ENDIF()
 
   # pthread
   IF(CMAKE_HAVE_THREADS_LIBRARY)
-    LIST(APPEND OpenIGTLink_REQUIRED_LINK_FLAGS ${CMAKE_THREAD_LIBS_INIT})
+    SET(OpenIGTLink_REQUIRED_LINK_FLAGS "${OpenIGTLink_REQUIRED_LINK_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
   ENDIF()
 ENDIF()
 
@@ -186,10 +186,10 @@ ENDIF()
 IF(CMAKE_USE_PTHREADS)
   IF(CMAKE_SYSTEM MATCHES "SunOS.*")
     IF(CMAKE_COMPILER_IS_GNUCXX)
-      LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -D_PTHREADS)
+      SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -D_PTHREADS")
     ELSE()
-      LIST(APPEND OpenIGTLink_REQUIRED_CXX_FLAGS -mt)
-      LIST(APPEND OpenIGTLink_REQUIRED_C_FLAGS -mt)
+      SET(OpenIGTLink_REQUIRED_CXX_FLAGS "${OpenIGTLink_REQUIRED_CXX_FLAGS} -mt")
+      SET(OpenIGTLink_REQUIRED_C_FLAGS "${OpenIGTLink_REQUIRED_C_FLAGS} -mt")
     ENDIF()
   ENDIF()
 ENDIF()
@@ -198,7 +198,7 @@ ENDIF()
 # Run superbuild script instead of library script
 IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
   #MESSAGE ("Cmake version is not less than 3.4, super build available")
-	OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." OFF)
+	OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." ON)
 	IF(OpenIGTLink_SUPERBUILD)
 		INCLUDE(SuperBuild/Superbuild.cmake)
 		RETURN()
@@ -243,6 +243,10 @@ CONFIGURE_FILE(${OpenIGTLink_SOURCE_DIR}/UseOpenIGTLink.cmake.in
 # Create the OpenIGTLinkConfig.cmake file containing the OpenIGTLink configuration.
 INCLUDE(${OpenIGTLink_SOURCE_DIR}/CMake/GenerateOpenIGTLinkConfig.cmake)
 
+# Save the compiler settings so another project can import them.
+INCLUDE(${CMAKE_ROOT}/Modules/CMakeExportBuildSettings.cmake)
+CMAKE_EXPORT_BUILD_SETTINGS(${OpenIGTLink_BINARY_DIR}/OpenIGTLinkBuildSettings.cmake)
+
 INSTALL(FILES
   ${OpenIGTLink_BINARY_DIR}/OpenIGTLinkBuildSettings.cmake
   ${OpenIGTLink_BINARY_DIR}/UseOpenIGTLink.cmake
@@ -271,11 +275,11 @@ INSTALL(FILES
 
 #-----------------------------------------------------------------------------
 # Add compiler flags OpenIGTLink needs to work on this platform
-LIST(APPEND CMAKE_C_FLAGS ${OpenIGTLink_REQUIRED_C_FLAGS})
-LIST(APPEND CMAKE_CXX_FLAGS ${OpenIGTLink_REQUIRED_CXX_FLAGS})
-LIST(APPEND CMAKE_EXE_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
-LIST(APPEND CMAKE_SHARED_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
-LIST(APPEND CMAKE_MODULE_LINKER_FLAGS ${OpenIGTLink_REQUIRED_LINK_FLAGS})
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenIGTLink_REQUIRED_C_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenIGTLink_REQUIRED_CXX_FLAGS}")
+SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenIGTLink_REQUIRED_LINK_FLAGS}")
+SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenIGTLink_REQUIRED_LINK_FLAGS}")
+SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OpenIGTLink_REQUIRED_LINK_FLAGS}")
 
 #-----------------------------------------------------------------------------
 # Export targets
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index cf1f870c..6fde3832 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -211,13 +211,6 @@ ENDIF()
 
 IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
 	IF(BUILD_VIDEOSTREAM)	
-		IF(USE_X265)
-			FIND_PACKAGE(x265 REQUIRED)
-		ENDIF()
-	
-		IF(USE_OPENHEVC)
-			FIND_PACKAGE(OpenHEVC REQUIRED)
-		ENDIF()
 		INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/VideoStreaming/VideoStreaming.cmake)
 	ENDIF()
 
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index fca5ffbb..f367b4ed 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -74,8 +74,8 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
 		ENDIF()
   ENDIF()
 
-  IF(USE_X265 AND X265_FOUND)
-  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_x264.cmake)
+  IF(USE_X265)
+  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_x265.cmake)
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.cxx
       )
@@ -86,7 +86,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
     ENDIF()
   ENDIF()
 
-  IF(USE_OPENHEVC AND OpenHEVC_FOUND)
+  IF(USE_OPENHEVC)
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Decoder.cxx
       )
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index e803e501..92433568 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -43,5 +43,6 @@ ELSE()
       -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
     #--Build step-----------------
     BUILD_ALWAYS 1
+    INSTALL_COMMAND ""
     )
 ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index 2195bf47..e9ce6634 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -31,11 +31,6 @@ IF(BUILD_VIDEOSTREAM)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_WebSocket.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES websocket)
   ENDIF()
-
-  IF(BUILD_TESTING AND USE_GTEST)
-    INCLUDE(${OpenIGTLink_SOURCE_DIR}/Testing/External_googletest.cmake)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES GTest GMock)
-  ENDIF()
 ENDIF()
 #---------------------------------------------------
 # OpenIGTLink library
@@ -69,9 +64,9 @@ ExternalProject_Add( OpenIGTLink-lib
     -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
     -DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
     -DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
-    -DGTEST_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gtest-bin
-    -DGMOCK_ROOT:PATH=${CMAKE_BINARY_DIR}/Deps/gmock-bin
   #--Build step-----------------
   BUILD_ALWAYS 1
+  #--Install step-----------------
+  INSTALL_COMMAND ""
   DEPENDS ${OpenIGTLink_DEPENDENCIES}
   )
\ No newline at end of file
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 62ee0007..79947cb8 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -19,7 +19,7 @@ IF(USE_GTEST)
   LINK_DIRECTORIES("${CMAKE_BINARY_DIR}/Deps/gmock-bin")
 ENDIF()
 
-ADD_SUBDIRECTORY(igtlutil)
+ADD_SUBDIRECTORY( igtlutil )
 
 ADD_EXECUTABLE(igtlMultiThreaderTest1       igtlMultiThreaderTest1.cxx)
 ADD_EXECUTABLE(igtlMultiThreaderTest2       igtlMultiThreaderTest2.cxx)

From d24c04e8f4b23057860d7780b41adfd5d72ac524 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Mon, 31 Jul 2017 18:02:33 -0400
Subject: [PATCH 06/21] FEATURE: X265 library in progress

---
 .travis.yml                                |  4 ++--
 Source/VideoStreaming/VideoStreaming.cmake | 12 +++++++++++-
 SuperBuild/External_x265.cmake             | 15 ++++++---------
 SuperBuild/Superbuild.cmake                |  4 ++++
 Testing/External_googletest.cmake          |  4 ++--
 5 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index d78bb385..b1d44cf1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -49,8 +49,8 @@ script:
   #########################
   # Test for Super build
   - cd ..
-  - mkdir SuperBuild
-  - cd SuperBuild
+  - mkdir SuperBuildTest
+  - cd SuperBuildTest
   - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
   - make
   - cd OpenIGTLink-bin
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index f367b4ed..d4de3d86 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -79,6 +79,10 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.cxx
       )
+    LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		${X265_SOURCE_DIR}/source
+    		${X265_LIBRARY_DIR}
+    	)
     IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
       LIST(APPEND OpenIGTLink_INCLUDE_FILES
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.h
@@ -98,7 +102,6 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
   ENDIF()
 ENDIF()
 
-
 IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
@@ -112,6 +115,13 @@ IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
       ${LINK_VP9_LIBRARY}
     )
   ENDIF()
+  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_X265)
+    #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
+    SET(LINK_X265_LIBRARY optimized ${OpenIGTLink_LIBRARY_DIR}\\lib\\Release\\x265-static.lib debug ${OpenIGTLink_LIBRARY_DIR}\\lib\\Debug\\x265-static.lib)
+    LIST(APPEND LINK_LIBS
+      ${LINK_X265_LIBRARY}
+    )
+  ENDIF()
 ELSE() # for POSIX-compatible OSs
 	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index 92433568..19a31200 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -1,12 +1,9 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-IF(x265_DIR)
+IF((EXISTS ${X265_SOURCE_DIR}) AND (EXISTS ${X265_LIBRARY_DIR}))
   # x265 has been built already
-  FIND_PACKAGE(x265 REQUIRED)
-
   MESSAGE(STATUS "Using x265 available at: ${x265_DIR}")
-
-  SET(OpenIGTLink_x265_DIR "${x265_DIR}" CACHE INTERNAL "Path to store x265 binaries")
+  #SET(OpenIGTLink_x265_DIR "${x265_DIR}" CACHE INTERNAL "Path to store x265 binaries")
 ELSE()
   # x265 has not been built yet, so download and build it as an external project
   SET(GIT_REPOSITORY "https://github.com/videolan/x265.git")
@@ -18,14 +15,14 @@ ELSE()
   
   MESSAGE(STATUS "Downloading x265 ${GIT_TAG} from: ${GIT_REPOSITORY}")
 
-  SET (OpenIGTLink_x265_SRC_DIR "${CMAKE_BINARY_DIR}/Deps/x265")
-  SET (OpenIGTLink_x265_DIR "${CMAKE_BINARY_DIR}/Deps/x265-bin" CACHE INTERNAL "Path to store x265 binaries")
+  SET (X265_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/x265" CACHE PATH "x265 source directory")
+  SET (X265_LIBRARY_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" CACHE PATH "x265 library directory")
 
   ExternalProject_Add( x265
     PREFIX "${CMAKE_BINARY_DIR}/Deps/x265-prefix"
-    SOURCE_DIR "${OpenIGTLink_x265_SRC_DIR}"
+    SOURCE_DIR "${X265_SOURCE_DIR}"
     SOURCE_SUBDIR source
-    BINARY_DIR "${OpenIGTLink_x265_DIR}"
+    BINARY_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
     #--Download step--------------
     GIT_REPOSITORY "${GIT_REPOSITORY}"
     GIT_TAG ${GIT_TAG}
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index e9ce6634..6b083c22 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -17,6 +17,8 @@ IF(BUILD_VIDEOSTREAM)
   ENDIF()
 
   IF(USE_X265)
+    set(X265_SOURCE_DIR "" CACHE PATH "X265 source directory" FORCE)
+		set(X265_LIBRARY_DIR "" CACHE PATH "X265 library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_x265.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES x265)
   ENDIF()
@@ -62,6 +64,8 @@ ExternalProject_Add( OpenIGTLink-lib
     -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
     -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
     -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
+    -DX265_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
+    -DX265_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
     -DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
     -DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
   #--Build step-----------------
diff --git a/Testing/External_googletest.cmake b/Testing/External_googletest.cmake
index 20b0d6f4..1d255bcf 100644
--- a/Testing/External_googletest.cmake
+++ b/Testing/External_googletest.cmake
@@ -18,7 +18,7 @@ ELSE()
 		#--Configure step-------------
 		CMAKE_ARGS
 			${PLATFORM_SPECIFIC_ARGS}
-			-DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
+      -Dgtest_force_shared_crt:BOOL=ON 
 		#--Build step-----------------
 		BUILD_ALWAYS 1
 		INSTALL_COMMAND ""
@@ -42,7 +42,7 @@ ELSE()
 		#--Configure step-------------
 		CMAKE_ARGS
 			${PLATFORM_SPECIFIC_ARGS}
-			-DBUILD_SHARED_LIBS:BOOL=OFF # make the google test library a static build
+      -Dgtest_force_shared_crt:BOOL=ON 
 		#--Build step-----------------
 		BUILD_ALWAYS 1
 		INSTALL_COMMAND ""

From 8f845db6d78203e0074a8d105e306f8afd44551b Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Tue, 1 Aug 2017 15:50:19 -0400
Subject: [PATCH 07/21] FEATURE: x265 and openHEVC build in mac/linux achieved,
 test added for x265 and openhevc

---
 .travis.yml                                |  4 +-
 CMakeLists.txt                             | 21 +++++-----
 Source/CMakeLists.txt                      | 23 +++++++++++
 Source/VideoStreaming/VideoStreaming.cmake | 28 ++++++++++++--
 SuperBuild/External_openHEVC.cmake         | 45 ++++++++++++++++++++++
 SuperBuild/External_x265.cmake             | 37 ++++++++++--------
 SuperBuild/External_yasm.cmake             | 44 +++++++++++++++++++++
 SuperBuild/Superbuild.cmake                | 26 ++++++++++---
 Testing/igtlVideoMessageTest.cxx           | 22 +++++++++++
 9 files changed, 212 insertions(+), 38 deletions(-)
 create mode 100644 SuperBuild/External_openHEVC.cmake
 create mode 100644 SuperBuild/External_yasm.cmake

diff --git a/.travis.yml b/.travis.yml
index b1d44cf1..7bf554aa 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,7 +38,7 @@ before_script:
   - cd    build
 
 script:
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=OFF -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=OFF -DBUILD_VIDEOSTREAM=ON -DUSE_X265=ON -DUSE_OPENHEVC=ON -DBUILD_TESTING=ON ..
   - make 
   - make test 
   #########################
@@ -51,7 +51,7 @@ script:
   - cd ..
   - mkdir SuperBuildTest
   - cd SuperBuildTest
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=ON -DBUILD_VIDEOSTREAM=ON -DUSE_X265=ON -DUSE_OPENHEVC=ON -DBUILD_TESTING=ON ..
   - make
   - cd OpenIGTLink-bin
   - make test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 26b72e57..c40130b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,6 @@ INCLUDE(ExternalProject)
 IF(COMMAND cmake_policy)
   cmake_policy(SET CMP0003 NEW)
 ENDIF(COMMAND cmake_policy)
-
 #-----------------------------------------------------------------------------
 # OpenIGTlink version number.
 SET(OpenIGTLink_VERSION_MAJOR "3")
@@ -30,22 +29,22 @@ ENDIF()
 #-----------------------------------------------------------------------------
 # Configure VideoStreaming
 # Create the link to the VideoStreaming libraries
-OPTION(BUILD_VIDEOSTREAM "Build the Video Stream." OFF)
+OPTION(BUILD_VIDEOSTREAM "Build the Video Stream." ON)
 OPTION(USE_H264 "Link the OpenH264 tree." OFF)
 OPTION(USE_VP9 "Link the VP9 tree." OFF)
-OPTION(USE_X265 "Link the X265 tree." OFF)
-OPTION(USE_OPENHEVC "Link the OpenHevc tree." OFF)
+OPTION(USE_X265 "Link the X265 tree." ON)
+OPTION(USE_OPENHEVC "Link the OpenHevc tree." ON)
 SET(OpenIGTLink_LINK_H264 "0")
 SET(OpenIGTLink_LINK_VP9 "0")
 SET(OpenIGTLink_LINK_X265 "0")
 SET(OpenIGTLink_LINK_OPENHEVC "0")
 
-SET(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory")
-MARK_AS_ADVANCED(H264_LIBRARY_DIR)
-SET(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory")  
-MARK_AS_ADVANCED(VP9_SOURCE_DIR) 
-SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")  
-MARK_AS_ADVANCED(VP9_LIBRARY_DIR) 
+#SET(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory")
+#MARK_AS_ADVANCED(H264_LIBRARY_DIR)
+#SET(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory")  
+#MARK_AS_ADVANCED(VP9_SOURCE_DIR) 
+#SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")  
+#MARK_AS_ADVANCED(VP9_LIBRARY_DIR) 
 IF(BUILD_VIDEOSTREAM)
   IF(USE_H264)
 		SET(OpenIGTLink_LINK_H264 "1")     
@@ -203,6 +202,8 @@ IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
 		INCLUDE(SuperBuild/Superbuild.cmake)
 		RETURN()
 	ENDIF()
+ELSE()
+  message(FATAL_ERROR "CMake >= 3.4.0 required, or turn off the superbuild option")
 ENDIF()
 
 #-----------------------------------------------------------------------------
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 6fde3832..79347c96 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -235,6 +235,8 @@ IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
 			${CMAKE_CURRENT_SOURCE_DIR}/WebSocket
 			)
 	ENDIF()
+ELSE()
+  message(FATAL_ERROR "CMake >= 3.4.0 required, or turn off the BUILD_VIDEOSTREAM option")
 ENDIF()
 #-----------------------------------------------------------------------------
 # Create the library
@@ -245,6 +247,27 @@ endforeach()
 target_include_directories(OpenIGTLink PUBLIC $<INSTALL_INTERFACE:${OpenIGTLink_INSTALL_INCLUDE_DIR}>)
 
 LIST(APPEND OpenIGTLink_DEPENDENCIES igtlutil)
+IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
+	IF(BUILD_VIDEOSTREAM)	
+		IF(USE_H264)
+  		add_dependencies(OpenIGTLink openh264)
+  	ENDIF()
+		IF(USE_VP9)
+  		add_dependencies(OpenIGTLink VP9)
+  	ENDIF()
+  	IF(USE_X265)
+  		add_dependencies(OpenIGTLink x265)
+  	ENDIF()
+  	IF(USE_OPENHEVC)
+  		add_dependencies(OpenIGTLink openHEVC)
+  	ENDIF()
+	ENDIF()
+	IF(BUILD_WEBSOCKET)
+		add_dependencies(OpenIGTLink WebSocket)
+	ENDIF()
+ELSE()
+  message(FATAL_ERROR "CMake >= 3.4.0 required, or turn off the BUILD_VIDEOSTREAM option")
+ENDIF()
 
 TARGET_LINK_LIBRARIES(OpenIGTLink PUBLIC ${LINK_LIBS})
 
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index d4de3d86..baf495a6 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -40,14 +40,18 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
 				LIST(APPEND OpenIGTLink_INCLUDE_DIRS
     		"${H264_LIBRARY_DIR}/include/wels/" )
     		LINK_DIRECTORIES("${H264_LIBRARY_DIR}/lib")
-			ENDIF()	
+			ENDIF()
 		ELSE()
 			MESSAGE("H264_LIBRARY_DIR no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
 		ENDIF()
 	ENDIF()
 	
+	IF(USE_OPENHEVC OR USE_X265 OR USE_VP9)
+  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
+  	LIST(APPEND OpenIGTLink_DEPENDENCIES yasm)
+  ENDIF()	
+	
   IF(USE_VP9)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_VP9.cmake)
   	IF(EXISTS ${VP9_LIBRARY_DIR})
   		LIST(APPEND OpenIGTLink_INCLUDE_DIRS
@@ -89,8 +93,13 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
         )
     ENDIF()
   ENDIF()
-
+	
   IF(USE_OPENHEVC)
+  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_openHEVC.cmake)
+  	LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		${OPENHEVC_SOURCE_DIR}
+    		${OPENHEVC_LIBRARY_DIR}
+    	)
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Decoder.cxx
       )
@@ -117,7 +126,7 @@ IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
   ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_X265)
     #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
-    SET(LINK_X265_LIBRARY optimized ${OpenIGTLink_LIBRARY_DIR}\\lib\\Release\\x265-static.lib debug ${OpenIGTLink_LIBRARY_DIR}\\lib\\Debug\\x265-static.lib)
+    SET(LINK_X265_LIBRARY optimized ${X265_LIBRARY_DIR}\\Release\\x265-static.lib debug ${X265_LIBRARY_DIR}\\Debug\\x265-static.lib)
     LIST(APPEND LINK_LIBS
       ${LINK_X265_LIBRARY}
     )
@@ -133,4 +142,15 @@ ELSE() # for POSIX-compatible OSs
       ${VP9_LIBRARY_DIR}/libvpx.a
     )
   ENDIF()
+  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_X265)
+    LIST(APPEND LINK_LIBS
+      ${X265_LIBRARY_DIR}/libx265.a
+    )
+  ENDIF()
+  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_OPENHEVC)
+  	SET(LINK_OPENHEVC_LIBRARY optimized ${OPENHEVC_LIBRARY_DIR}/Release/libLibOpenHevcWrapper.a debug ${OPENHEVC_LIBRARY_DIR}/Debug/libLibOpenHevcWrapper.a)
+    LIST(APPEND LINK_LIBS
+    	${LINK_OPENHEVC_LIBRARY}      
+    )
+  ENDIF()
 ENDIF()
diff --git a/SuperBuild/External_openHEVC.cmake b/SuperBuild/External_openHEVC.cmake
new file mode 100644
index 00000000..81207154
--- /dev/null
+++ b/SuperBuild/External_openHEVC.cmake
@@ -0,0 +1,45 @@
+cmake_minimum_required(VERSION 2.8.2)
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+IF((EXISTS ${OPENHEVC_SOURCE_DIR}) AND (EXISTS ${OPENHEVC_LIBRARY_DIR}))
+  # openHEVC has been built already
+  MESSAGE(STATUS "Using openHEVC available at: ${OPENHEVC_SOURCE_DIR}")
+  #FIND_PACKAGE(openHEVC REQUIRED)
+  #SET(OPENHEVC_LIBRARY_DIR "${openHEVC_DIR}" CACHE INTERNAL "Path to store openHEVC library")
+ELSE()
+  # openHEVC has not been built yet, so download and build it as an external project
+  SET(GIT_REPOSITORY "https://github.com/OpenHEVC/openHEVC.git")
+  SET(GIT_TAG "hevc_rext")
+
+  IF(MSVC)
+    LIST(APPEND PLATFORM_SPECIFIC_ARGS -DCMAKE_CXX_MP_FLAG:BOOL=ON)
+  ENDIF()
+  
+  MESSAGE(STATUS "Downloading openHEVC ${GIT_TAG} from: ${GIT_REPOSITORY}")
+
+  SET (OPENHEVC_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC" CACHE PATH "openHEVC source directory" FORCE)
+  SET (OPENHEVC_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC-bin" CACHE PATH "openHEVC library directory" FORCE)
+
+  ExternalProject_Add( openHEVC
+    PREFIX "${CMAKE_BINARY_DIR}/Deps/openHEVC-prefix"
+    SOURCE_DIR "${OPENHEVC_SOURCE_DIR}"
+    BINARY_DIR "${OPENHEVC_LIBRARY_DIR}"
+    #--Download step--------------
+    GIT_REPOSITORY "${GIT_REPOSITORY}"
+    GIT_TAG ${GIT_TAG}
+    #--Configure step-------------
+    CMAKE_ARGS
+      ${PLATFORM_SPECIFIC_ARGS}
+      -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/openHEVC-install"
+      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${OPENHEVC_LIBRARY_DIR}
+      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${OPENHEVC_LIBRARY_DIR}
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${OPENHEVC_LIBRARY_DIR}
+      -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+      -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+    #--Build step-----------------
+    BUILD_ALWAYS 1
+    INSTALL_COMMAND ""
+    DEPENDS yasm
+    )
+ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index 19a31200..4d160efe 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 IF((EXISTS ${X265_SOURCE_DIR}) AND (EXISTS ${X265_LIBRARY_DIR}))
   # x265 has been built already
-  MESSAGE(STATUS "Using x265 available at: ${x265_DIR}")
-  #SET(OpenIGTLink_x265_DIR "${x265_DIR}" CACHE INTERNAL "Path to store x265 binaries")
+  # FIND_PACKAGE(x265 REQUIRED)
+  MESSAGE(STATUS "Using x265 available at: ${X265_LIBRARY_DIR}")
 ELSE()
   # x265 has not been built yet, so download and build it as an external project
   SET(GIT_REPOSITORY "https://github.com/videolan/x265.git")
@@ -13,33 +13,38 @@ ELSE()
     LIST(APPEND PLATFORM_SPECIFIC_ARGS -DCMAKE_CXX_MP_FLAG:BOOL=ON)
   ENDIF()
   
+  SET(Generator ${CMAKE_GENERATOR})
+	IF("${CMAKE_GENERATOR}" STREQUAL "Xcode")
+	 SET(Generator "Unix Makefiles") # xcode generator tend to fail, use unix makefiles instead
+	ENDIF()
+  
   MESSAGE(STATUS "Downloading x265 ${GIT_TAG} from: ${GIT_REPOSITORY}")
-
-  SET (X265_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/x265" CACHE PATH "x265 source directory")
-  SET (X265_LIBRARY_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" CACHE PATH "x265 library directory")
-
-  ExternalProject_Add( x265
+  SET (X265_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/x265" CACHE PATH "x265 source directory" FORCE)
+  SET (X265_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/x265-bin" CACHE PATH "x265 library directory" FORCE)
+  ExternalProject_Add(x265
     PREFIX "${CMAKE_BINARY_DIR}/Deps/x265-prefix"
     SOURCE_DIR "${X265_SOURCE_DIR}"
-    SOURCE_SUBDIR source
-    BINARY_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
+    #SOURCE_SUBDIR source   # SOURCE_SUBDIR is only available for cmake version later than 3.7.2 
+    BINARY_DIR "${X265_LIBRARY_DIR}"
     #--Download step--------------
     GIT_REPOSITORY "${GIT_REPOSITORY}"
     GIT_TAG ${GIT_TAG}
     #--Configure step-------------
-    CMAKE_ARGS
-      ${PLATFORM_SPECIFIC_ARGS}
+    CONFIGURE_COMMAND cd ${X265_LIBRARY_DIR} && ${CMAKE_COMMAND} 
+    	${PLATFORM_SPECIFIC_ARGS}
+    	-DCMAKE_GENERATOR:STRING=${Generator}
       -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/x265-install"
-      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${X265_LIBRARY_DIR}
       -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${X265_LIBRARY_DIR}
       -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
-      -DBUILD_TESTING:BOOL=OFF 
-      -DBUILD_EXAMPLES:BOOL=OFF
       -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
       -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-    #--Build step-----------------
+      -DEXPORT_C_API:BOOL=ON
+      -DENABLE_CLI:BOOL=OFF ${X265_SOURCE_DIR}/source
+    #--Build step----------------- 
     BUILD_ALWAYS 1
     INSTALL_COMMAND ""
+    DEPENDS yasm
     )
 ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/External_yasm.cmake b/SuperBuild/External_yasm.cmake
new file mode 100644
index 00000000..e445b535
--- /dev/null
+++ b/SuperBuild/External_yasm.cmake
@@ -0,0 +1,44 @@
+cmake_minimum_required(VERSION 2.8.2)
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+IF((EXISTS ${YASM_SOURCE_DIR}) AND (EXISTS ${YASM_LIBRARY_DIR}))
+  # YASM has been built already
+  MESSAGE(STATUS "Using YASM available at: ${YASM_LIBRARY_DIR}")
+  #FIND_PACKAGE(yasm REQUIRED)
+  #SET(YASM_LIBRARY_DIR "${yasm_DIR}" CACHE INTERNAL "Path to store yasm binaries")
+ELSE()
+  # yas has not been built yet, so download and build it as an external project
+  SET(GIT_REPOSITORY "https://github.com/yasm/yasm.git")
+  SET(GIT_TAG "master")
+  IF(MSVC)
+    LIST(APPEND PLATFORM_SPECIFIC_ARGS -DCMAKE_CXX_MP_FLAG:BOOL=ON)
+  ENDIF()
+  
+  MESSAGE(STATUS "Downloading yasm ${GIT_TAG} from: ${GIT_REPOSITORY}")
+
+  SET (YASM_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/yasm" CACHE PATH "YASM source directory" FORCE)
+  SET (YASM_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/yasm-bin" CACHE PATH "YASM library directory" FORCE)
+
+  ExternalProject_Add( yasm
+    PREFIX "${CMAKE_BINARY_DIR}/Deps/yasm-prefix"
+    SOURCE_DIR "${YASM_SOURCE_DIR}"
+    BINARY_DIR "${YASM_LIBRARY_DIR}"
+    #--Download step--------------
+    GIT_REPOSITORY "${GIT_REPOSITORY}"
+    GIT_TAG ${GIT_TAG}
+    #--Configure step-------------
+    CMAKE_ARGS
+      ${PLATFORM_SPECIFIC_ARGS}
+      -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/yasm-install"
+      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${YASM_LIBRARY_DIR}
+      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${YASM_LIBRARY_DIR}
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${YASM_LIBRARY_DIR}
+      -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+      -DBUILD_TESTING:BOOL=OFF 
+      -DBUILD_EXAMPLES:BOOL=OFF
+      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+    #--Build step-----------------
+    BUILD_ALWAYS 1
+    INSTALL_COMMAND ""
+    )
+ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index 6b083c22..d557c1ef 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -9,23 +9,32 @@ IF(BUILD_VIDEOSTREAM)
 		set(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory" FORCE)     
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openh264.cmake)
   ENDIF()
+  
+  IF(USE_X265 OR USE_OPENHEVC OR USE_VP9)
+		set(YASM_SOURCE_DIR "" CACHE PATH "YASM source directory" FORCE)
+		set(YASM_LIBRARY_DIR "" CACHE PATH "YASM library directory" FORCE)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES yasm)
+	ENDIF()
 
   IF(USE_VP9)
     set(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory" FORCE)
 		set(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_VP9.cmake)
+    #LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
   ENDIF()
-
+	
   IF(USE_X265)
     set(X265_SOURCE_DIR "" CACHE PATH "X265 source directory" FORCE)
 		set(X265_LIBRARY_DIR "" CACHE PATH "X265 library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_x265.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES x265)
   ENDIF()
-
+  
   IF(USE_OPENHEVC)
-    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
-    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_OpenHEVC.cmake)
+ 		set(OPENHEVC_SOURCE_DIR "" CACHE PATH "OpenHEVC source directory" FORCE)
+		set(OPENHEVC_LIBRARY_DIR "" CACHE PATH "OpenHEVC library directory" FORCE)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openHEVC.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES openHEVC)
   ENDIF()
 
@@ -51,6 +60,7 @@ ExternalProject_Add( OpenIGTLink-lib
     -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
     -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
     -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+    -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
     -DBUILD_TESTING:BOOL=${BUILD_TESTING}
     -DUSE_GTEST:BOOL=${USE_GTEST}
     -DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
@@ -64,10 +74,14 @@ ExternalProject_Add( OpenIGTLink-lib
     -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
     -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
     -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
-    -DX265_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
-    -DX265_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
+    -DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
+    -DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
+    -DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
+    -DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
     -DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
     -DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
+    -DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
+    -DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
   #--Build step-----------------
   BUILD_ALWAYS 1
   #--Install step-----------------
diff --git a/Testing/igtlVideoMessageTest.cxx b/Testing/igtlVideoMessageTest.cxx
index c7d85a8b..00e51a58 100644
--- a/Testing/igtlVideoMessageTest.cxx
+++ b/Testing/igtlVideoMessageTest.cxx
@@ -48,6 +48,12 @@
   #include "./vpx_config.h"
 #endif
 
+#if OpenIGTLink_LINK_OPENHEVC && OpenIGTLink_LINK_X265
+  #include "H265Encoder.h"
+  #include "H265Decoder.h"
+#endif
+
+
 int Width = 256;
 int Height = 256;
 std::string testFileName(OpenIGTLink_SOURCE_ROOTDIR);
@@ -279,6 +285,22 @@ TEST(VideoMessageTest, EncodeAndDecodeFormatVersion1)
     std::cerr<<"End of H264 tests "<<std::endl;
     std::cerr<<"--------------------------- "<<std::endl;
   #endif
+#if OpenIGTLink_LINK_OPENHEVC && OpenIGTLink_LINK_X265
+      std::cerr<<"--------------------------- "<<std::endl;
+      std::cerr<<"Begin of VPX tests "<<std::endl;
+      H265Encoder* H265StreamEncoder = new H265Encoder();
+      H265Decoder* H265StreamDecoder = new H265Decoder();
+      H265StreamEncoder->SetPicWidthAndHeight(Width,Height);
+      H265StreamEncoder->InitializeEncoder();
+      H265StreamEncoder->SetLosslessLink(true);
+      TestWithVersion(IGTL_HEADER_VERSION_2, H265StreamEncoder, H265StreamDecoder,true);
+      H265StreamEncoder->SetSpeed(8);
+      H265StreamEncoder->SetLosslessLink(false);
+      std::cerr<<"Encoding Time Using Maximum Speed: "<<std::endl;
+      TestWithVersion(IGTL_HEADER_VERSION_2, H265StreamEncoder, H265StreamDecoder,false);
+      std::cerr<<"End of VPX tests "<<std::endl;
+      std::cerr<<"--------------------------- "<<std::endl;
+#endif
     }
 #endif
 

From d543323e6ede65b0bbc23860ccbcd335e99d038e Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Thu, 3 Aug 2017 10:26:20 -0400
Subject: [PATCH 08/21] EHN: reconfig the already compiled external_added
 project is working. (Previously Config an external add project is only
 possible at the beginning, after the project gets compiled, it was not
 possible to reconfig)

---
 Source/VideoStreaming/H265Encoder.cxx      |   7 --
 Source/VideoStreaming/VP9Encoder.h         |   3 -
 Source/VideoStreaming/VideoStreaming.cmake |   8 +-
 SuperBuild/External_VP9.cmake              |  15 +++
 SuperBuild/External_openHEVC.cmake         |  11 ++
 SuperBuild/External_x265.cmake             |  14 +++
 SuperBuild/External_yasm.cmake             |   6 +
 SuperBuild/Superbuild.cmake                | 134 ++++++++++++++-------
 8 files changed, 141 insertions(+), 57 deletions(-)

diff --git a/Source/VideoStreaming/H265Encoder.cxx b/Source/VideoStreaming/H265Encoder.cxx
index 6e2c58e5..3b2fe586 100644
--- a/Source/VideoStreaming/H265Encoder.cxx
+++ b/Source/VideoStreaming/H265Encoder.cxx
@@ -22,16 +22,9 @@ std::string ToString(T variable)
   stream << variable;
   return stream.str();
 }
-/* Ctrl-C handler */
-static int     g_iCtrlC = 0;
-static void    SigIntHandler (int a) {
-  g_iCtrlC = 1;
-}
 
 H265Encoder::H265Encoder(char *configFile):GenericEncoder()
 {
-  /* Control-C handler */
-  signal (SIGINT, SigIntHandler);
   this->sSvcParam=H265EncoderNameSpace::x265_param_alloc();
   FillSpecificParameters();
   pSVCEncoder=H265EncoderNameSpace::x265_encoder_open(this->sSvcParam);
diff --git a/Source/VideoStreaming/VP9Encoder.h b/Source/VideoStreaming/VP9Encoder.h
index 59333133..b3d647d1 100644
--- a/Source/VideoStreaming/VP9Encoder.h
+++ b/Source/VideoStreaming/VP9Encoder.h
@@ -17,11 +17,8 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "vpx/vpx_encoder.h"
 #include "vpx/vp8cx.h"
-#include "vpx/vpx_codec.h"
 #include "vpx/vpx_image.h"
-#include "vpx/vpx_integer.h"
 
 #include "igtlCodecCommonClasses.h"
 #include "igtl_header.h"
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index baf495a6..30750cf5 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -111,7 +111,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
   ENDIF()
 ENDIF()
 
-IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
+IF(WIN32) # for Windows
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
     	${H264_LIBRARY_DIR}/lib/openh264.lib
@@ -126,7 +126,7 @@ IF(OpenIGTLink_PLATFORM_WIN32) # for Windows
   ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_X265)
     #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
-    SET(LINK_X265_LIBRARY optimized ${X265_LIBRARY_DIR}\\Release\\x265-static.lib debug ${X265_LIBRARY_DIR}\\Debug\\x265-static.lib)
+    SET(LINK_X265_LIBRARY ${X265_LIBRARY_DIR}\\${CMAKE_BUILD_TYPE}\\x265-static.lib)
     LIST(APPEND LINK_LIBS
       ${LINK_X265_LIBRARY}
     )
@@ -148,8 +148,8 @@ ELSE() # for POSIX-compatible OSs
     )
   ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_OPENHEVC)
-  	SET(LINK_OPENHEVC_LIBRARY optimized ${OPENHEVC_LIBRARY_DIR}/Release/libLibOpenHevcWrapper.a debug ${OPENHEVC_LIBRARY_DIR}/Debug/libLibOpenHevcWrapper.a)
-    LIST(APPEND LINK_LIBS
+  	SET(LINK_OPENHEVC_LIBRARY ${OPENHEVC_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/libLibOpenHevcWrapper.a )
+  	LIST(APPEND LINK_LIBS
     	${LINK_OPENHEVC_LIBRARY}      
     )
   ENDIF()
diff --git a/SuperBuild/External_VP9.cmake b/SuperBuild/External_VP9.cmake
index fe4b9b63..c029f38e 100644
--- a/SuperBuild/External_VP9.cmake
+++ b/SuperBuild/External_VP9.cmake
@@ -1,6 +1,21 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+SET(VP9_Proj_BUILT "0")
 IF((EXISTS ${VP9_SOURCE_DIR}) AND (EXISTS ${VP9_LIBRARY_DIR}))
+	IF((EXISTS "${VP9_SOURCE_DIR}/vpx/vp8cx.h") AND (EXISTS "${VP9_SOURCE_DIR}/vpx/vpx_image.h"))
+		IF(WIN32)
+			SET(LINK_VP9_LIBRARY optimized ${VP9_LIBRARY_DIR}\\$(Platform)\\Release\\vpxmd.lib debug ${VP9_LIBRARY_DIR}\\$(Platform)\\Debug\\vpxmdd.lib)
+			IF(EXISTS "${LINK_VP9_LIBRARY}")
+				SET(VP9_Proj_BUILT "1")
+			ENDIF()
+		ELSE()
+			IF(EXISTS "${VP9_LIBRARY_DIR}/libvpx.a")
+				SET(VP9_Proj_BUILT "1")
+			ENDIF()
+		ENDIF()	
+	ENDIF()
+ENDIF()
+IF(VP9_Proj_BUILT EQUAL "1")
   IF(${OpenIGTLink_PROTOCOL_VERSION} LESS 3 OR (NOT ${BUILD_VIDEOSTREAM}))
     MESSAGE(FATAL_ERROR "Video streaming requires a build of OpenIGTLink with v3 support enabled. Please set the OpenIGTLink_PROTOCOL_VERSION_3 to true and activate the BUILD_VIDEOSTREAM.")
   ENDIF()
diff --git a/SuperBuild/External_openHEVC.cmake b/SuperBuild/External_openHEVC.cmake
index 81207154..a42ae6b2 100644
--- a/SuperBuild/External_openHEVC.cmake
+++ b/SuperBuild/External_openHEVC.cmake
@@ -1,6 +1,17 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+SET(OpenHEVC_Proj_BUILT "0")
 IF((EXISTS ${OPENHEVC_SOURCE_DIR}) AND (EXISTS ${OPENHEVC_LIBRARY_DIR}))
+	IF(EXISTS "${OPENHEVC_SOURCE_DIR}/gpac/modules/openhevc_dec/openHevcWrapper.h") 
+		IF(WIN32)
+		ELSE()
+			IF("${OPENHEVC_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/libLibOpenHevcWrapper.a" )
+				SET(OpenHEVC_Proj_BUILT "1")
+			ENDIF()
+		ENDIF()		
+	ENDIF()
+ENDIF()
+IF(OpenHEVC_Proj_BUILT EQUAL "1")
   # openHEVC has been built already
   MESSAGE(STATUS "Using openHEVC available at: ${OPENHEVC_SOURCE_DIR}")
   #FIND_PACKAGE(openHEVC REQUIRED)
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index 4d160efe..e524d95a 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -1,6 +1,20 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+SET(X265_Proj_BUILT "0")
 IF((EXISTS ${X265_SOURCE_DIR}) AND (EXISTS ${X265_LIBRARY_DIR}))
+	IF(EXISTS "${X265_SOURCE_DIR}/x265.h") 
+		IF(WIN32)
+			IF(EXISTS "${X265_LIBRARY_DIR}\\${CMAKE_BUILD_TYPE}\\x265-static.lib")
+				SET(X265_Proj_BUILT "1")
+			ENDIF()
+		ELSE()
+			IF(EXISTS "${X265_LIBRARY_DIR}/libx265.a")
+				SET(X265_Proj_BUILT "1")
+			ENDIF()
+		ENDIF()	
+	ENDIF()
+ENDIF()
+IF(X265_Proj_BUILT EQUAL "1")
   # x265 has been built already
   # FIND_PACKAGE(x265 REQUIRED)
   MESSAGE(STATUS "Using x265 available at: ${X265_LIBRARY_DIR}")
diff --git a/SuperBuild/External_yasm.cmake b/SuperBuild/External_yasm.cmake
index e445b535..3218ce0a 100644
--- a/SuperBuild/External_yasm.cmake
+++ b/SuperBuild/External_yasm.cmake
@@ -1,6 +1,12 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+SET(YASM_Proj_BUILT "0")
 IF((EXISTS ${YASM_SOURCE_DIR}) AND (EXISTS ${YASM_LIBRARY_DIR}))
+	IF(EXISTS "${YASM_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/yasm") 
+		SET(YASM_Proj_BUILT "1")
+	ENDIF()
+ENDIF()
+IF(YASM_Proj_BUILT EQUAL "1")
   # YASM has been built already
   MESSAGE(STATUS "Using YASM available at: ${YASM_LIBRARY_DIR}")
   #FIND_PACKAGE(yasm REQUIRED)
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index d557c1ef..0abf8215 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -43,48 +43,96 @@ IF(BUILD_VIDEOSTREAM)
     LIST(APPEND OpenIGTLink_DEPENDENCIES websocket)
   ENDIF()
 ENDIF()
+
 #---------------------------------------------------
 # OpenIGTLink library
-ExternalProject_Add( OpenIGTLink-lib
-  PREFIX "${CMAKE_BINARY_DIR}/OpenIGTLink-prefix"
-  SOURCE_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink"
-  BINARY_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink-bin"
-  #--Download step--------------
-  GIT_REPOSITORY "https://github.com/leochan2009/OpenIGTLink.git"
-  GIT_TAG superbuild-findmodules
-  #--Configure step-------------
-  CMAKE_ARGS
-    ${PLATFORM_SPECIFIC_ARGS}
-    -DOpenIGTLink_SUPERBUILD:BOOL=OFF
-    -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
-    -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-    -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
-    -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
-    -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-    -DBUILD_TESTING:BOOL=${BUILD_TESTING}
-    -DUSE_GTEST:BOOL=${USE_GTEST}
-    -DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
-    -DUSE_H264:BOOL=${USE_H264}
-    -DUSE_VP9:BOOL=${USE_VP9}
-    -DUSE_X265:BOOL=${USE_X265}
-    -DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
-    -DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
-    -DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
-    -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-    -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-    -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
-    -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
-    -DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
-    -DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
-    -DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
-    -DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
-    -DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
-    -DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
-    -DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
-    -DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
-  #--Build step-----------------
-  BUILD_ALWAYS 1
-  #--Install step-----------------
-  INSTALL_COMMAND ""
-  DEPENDS ${OpenIGTLink_DEPENDENCIES}
-  )
\ No newline at end of file
+SET(OpenIGTLink_BUILT "0")
+IF (OpenIGTLink_DIR)
+  SET(CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}/OpenIGTLink-bin")
+	find_package(OpenIGTLink)
+	IF(OpenIGTLink_FOUND)
+		SET(OpenIGTLink_BUILT "1")
+	ENDIF()
+ENDIF()
+IF(OpenIGTLink_BUILT EQUAL "1")
+	# when the openigtlink is not built, it can sync with the parent setting, after it is compiled, the configuration wouldn't sync.
+	# The following command is necessary to reconfig the openigtlink project 
+  message("library already built, reconfig the project only")
+  execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" 
+  								${PLATFORM_SPECIFIC_ARGS}
+									-DOpenIGTLink_SUPERBUILD:BOOL=OFF
+									-DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+									-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+									-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+									-DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+									-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+									-DBUILD_TESTING:BOOL=${BUILD_TESTING}
+									-DUSE_GTEST:BOOL=${USE_GTEST}
+									-DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
+									-DUSE_H264:BOOL=${USE_H264}
+									-DUSE_VP9:BOOL=${USE_VP9}
+									-DUSE_X265:BOOL=${USE_X265}
+									-DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
+									-DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
+									-DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
+									-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+									-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+									-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
+									-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
+									-DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
+									-DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
+									-DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
+									-DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
+									-DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
+									-DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
+									-DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
+									-DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
+  								-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR} 
+  								-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR} 
+  								"${CMAKE_BINARY_DIR}/OpenIGTLink"
+									WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/OpenIGTLink-bin" )
+ELSE()
+	ExternalProject_Add( OpenIGTLink-lib
+		PREFIX "${CMAKE_BINARY_DIR}/OpenIGTLink-prefix"
+		SOURCE_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink"
+		BINARY_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink-bin"
+		#--Download step--------------
+		GIT_REPOSITORY "https://github.com/leochan2009/OpenIGTLink.git"
+		GIT_TAG superbuild-findmodules
+		#--Configure step-------------
+		CMAKE_ARGS
+			${PLATFORM_SPECIFIC_ARGS}
+			-DOpenIGTLink_SUPERBUILD:BOOL=OFF
+			-DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+			-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+			-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+			-DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+			-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+			-DBUILD_TESTING:BOOL=${BUILD_TESTING}
+			-DUSE_GTEST:BOOL=${USE_GTEST}
+			-DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
+			-DUSE_H264:BOOL=${USE_H264}
+			-DUSE_VP9:BOOL=${USE_VP9}
+			-DUSE_X265:BOOL=${USE_X265}
+			-DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
+			-DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
+			-DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
+			-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+			-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+			-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
+			-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
+			-DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
+			-DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
+			-DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
+			-DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
+			-DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
+			-DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
+			-DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
+			-DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
+		#--Build step-----------------
+		BUILD_ALWAYS 1
+		#--Install step-----------------
+		INSTALL_COMMAND ""
+		DEPENDS ${OpenIGTLink_DEPENDENCIES}
+		)
+ENDIF()  
\ No newline at end of file

From 396aa7019ff1867a88cdb0bf9b3d3573bab70bff Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Thu, 3 Aug 2017 11:04:27 -0400
Subject: [PATCH 09/21] BUG: disable the OpenH265 and x265 build on the CI, due
 to the dependency of the compiler version.

---
 .travis.yml    |  4 ++--
 CMakeLists.txt |  4 ++--
 appveyor.yml   | 26 ++------------------------
 3 files changed, 6 insertions(+), 28 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 7bf554aa..b1d44cf1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,7 +38,7 @@ before_script:
   - cd    build
 
 script:
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=OFF -DBUILD_VIDEOSTREAM=ON -DUSE_X265=ON -DUSE_OPENHEVC=ON -DBUILD_TESTING=ON ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=OFF -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
   - make 
   - make test 
   #########################
@@ -51,7 +51,7 @@ script:
   - cd ..
   - mkdir SuperBuildTest
   - cd SuperBuildTest
-  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=ON -DBUILD_VIDEOSTREAM=ON -DUSE_X265=ON -DUSE_OPENHEVC=ON -DBUILD_TESTING=ON ..
+  - cmake -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=ON -DBUILD_VIDEOSTREAM=ON -DUSE_VP9=ON -DBUILD_TESTING=ON ..
   - make
   - cd OpenIGTLink-bin
   - make test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c40130b1..b290b018 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,8 +32,8 @@ ENDIF()
 OPTION(BUILD_VIDEOSTREAM "Build the Video Stream." ON)
 OPTION(USE_H264 "Link the OpenH264 tree." OFF)
 OPTION(USE_VP9 "Link the VP9 tree." OFF)
-OPTION(USE_X265 "Link the X265 tree." ON)
-OPTION(USE_OPENHEVC "Link the OpenHevc tree." ON)
+OPTION(USE_X265 "Link the X265 tree." OFF)
+OPTION(USE_OPENHEVC "Link the OpenHevc tree." OFF)
 SET(OpenIGTLink_LINK_H264 "0")
 SET(OpenIGTLink_LINK_VP9 "0")
 SET(OpenIGTLink_LINK_X265 "0")
diff --git a/appveyor.yml b/appveyor.yml
index 12d63dca..5497e6cc 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -49,19 +49,7 @@ build_script:
 - ps: |
     mkdir build -Force | Out-Null
     cd build
-    & cmake -G "$generator" -DOpenIGTLink_PROTOCOL_VERSION_3=ON ..
-    if ($LastExitCode -ne 0) {
-        throw "Exec: $ErrorMessage"
-    }
-    & cmake --build . --config $env:CONFIGURATION
-    if ($LastExitCode -ne 0) {
-        throw "Exec: $ErrorMessage"
-    }
-    mkdir build -Force | Out-Null
-    cd ..
-    mkdir TestBuild
-    cd TestBuild
-    & cmake -G "$generator" -DCMAKE_PREFIX_PATH:PATH=..\build ..\Testing
+    & cmake -G "$generator" -DOpenIGTLink_PROTOCOL_VERSION_3=ON -DOpenIGTLink_SUPERBUILD=OFF ..
     if ($LastExitCode -ne 0) {
         throw "Exec: $ErrorMessage"
     }
@@ -73,17 +61,7 @@ build_script:
     if ($LastExitCode -ne 0) {
         throw "Exec: $ErrorMessage"
     }
-    cd ..\build
-    & cmake -G "$generator" -DOpenIGTLink_PROTOCOL_VERSION_3=OFF ..
-    if ($LastExitCode -ne 0) {
-        throw "Exec: $ErrorMessage"
-    }
-    & cmake --build . --config $env:CONFIGURATION
-    if ($LastExitCode -ne 0) {
-        throw "Exec: $ErrorMessage"
-    }
-    cd ..\TestBuild
-    & cmake -G "$generator" -DCMAKE_PREFIX_PATH:PATH=..\build ..\Testing
+    cmake -G "$generator" -DOpenIGTLink_PROTOCOL_VERSION_3=OFF ..
     if ($LastExitCode -ne 0) {
         throw "Exec: $ErrorMessage"
     }

From b755c90bf9318b93015eb4b5abe7dc04eb2b5b0f Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 4 Aug 2017 11:51:31 -0400
Subject: [PATCH 10/21] EHN: build_always flag for super build set to true

---
 SuperBuild/External_openHEVC.cmake |  11 ++-
 SuperBuild/External_x265.cmake     |  10 +--
 SuperBuild/Superbuild.cmake        | 136 +++++++++--------------------
 3 files changed, 57 insertions(+), 100 deletions(-)

diff --git a/SuperBuild/External_openHEVC.cmake b/SuperBuild/External_openHEVC.cmake
index a42ae6b2..a9472dfb 100644
--- a/SuperBuild/External_openHEVC.cmake
+++ b/SuperBuild/External_openHEVC.cmake
@@ -5,12 +5,19 @@ IF((EXISTS ${OPENHEVC_SOURCE_DIR}) AND (EXISTS ${OPENHEVC_LIBRARY_DIR}))
 	IF(EXISTS "${OPENHEVC_SOURCE_DIR}/gpac/modules/openhevc_dec/openHevcWrapper.h") 
 		IF(WIN32)
 		ELSE()
-			IF("${OPENHEVC_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/libLibOpenHevcWrapper.a" )
-				SET(OpenHEVC_Proj_BUILT "1")
+			IF(${CMAKE_BUILD_TYPE})
+				IF(EXISTS "${OPENHEVC_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/libLibOpenHevcWrapper.a" )
+					SET(OpenHEVC_Proj_BUILT "1")
+				ENDIF()
+			ELSE()
+				IF(EXISTS "${OPENHEVC_LIBRARY_DIR}/libLibOpenHevcWrapper.a" )
+					SET(OpenHEVC_Proj_BUILT "1")
+				ENDIF()	
 			ENDIF()
 		ENDIF()		
 	ENDIF()
 ENDIF()
+message(${OpenHEVC_Proj_BUILT})
 IF(OpenHEVC_Proj_BUILT EQUAL "1")
   # openHEVC has been built already
   MESSAGE(STATUS "Using openHEVC available at: ${OPENHEVC_SOURCE_DIR}")
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index e524d95a..9cbea991 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -1,18 +1,18 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 SET(X265_Proj_BUILT "0")
-IF((EXISTS ${X265_SOURCE_DIR}) AND (EXISTS ${X265_LIBRARY_DIR}))
-	IF(EXISTS "${X265_SOURCE_DIR}/x265.h") 
+IF((EXISTS ${X265_SOURCE_DIR}) AND (EXISTS ${X265_LIBRARY_DIR})) 
 		IF(WIN32)
-			IF(EXISTS "${X265_LIBRARY_DIR}\\${CMAKE_BUILD_TYPE}\\x265-static.lib")
+			IF((EXISTS "${X265_SOURCE_DIR}\\source\\x265.h") AND
+					(EXISTS "${X265_LIBRARY_DIR}\\${CMAKE_BUILD_TYPE}\\x265-static.lib"))
 				SET(X265_Proj_BUILT "1")
 			ENDIF()
 		ELSE()
-			IF(EXISTS "${X265_LIBRARY_DIR}/libx265.a")
+			IF((EXISTS "${X265_SOURCE_DIR}/source/x265.h") AND
+				(EXISTS "${X265_LIBRARY_DIR}/libx265.a"))
 				SET(X265_Proj_BUILT "1")
 			ENDIF()
 		ENDIF()	
-	ENDIF()
 ENDIF()
 IF(X265_Proj_BUILT EQUAL "1")
   # x265 has been built already
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index 0abf8215..b815630f 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -43,96 +43,46 @@ IF(BUILD_VIDEOSTREAM)
     LIST(APPEND OpenIGTLink_DEPENDENCIES websocket)
   ENDIF()
 ENDIF()
-
-#---------------------------------------------------
-# OpenIGTLink library
-SET(OpenIGTLink_BUILT "0")
-IF (OpenIGTLink_DIR)
-  SET(CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}/OpenIGTLink-bin")
-	find_package(OpenIGTLink)
-	IF(OpenIGTLink_FOUND)
-		SET(OpenIGTLink_BUILT "1")
-	ENDIF()
-ENDIF()
-IF(OpenIGTLink_BUILT EQUAL "1")
-	# when the openigtlink is not built, it can sync with the parent setting, after it is compiled, the configuration wouldn't sync.
-	# The following command is necessary to reconfig the openigtlink project 
-  message("library already built, reconfig the project only")
-  execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" 
-  								${PLATFORM_SPECIFIC_ARGS}
-									-DOpenIGTLink_SUPERBUILD:BOOL=OFF
-									-DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
-									-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-									-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
-									-DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
-									-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-									-DBUILD_TESTING:BOOL=${BUILD_TESTING}
-									-DUSE_GTEST:BOOL=${USE_GTEST}
-									-DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
-									-DUSE_H264:BOOL=${USE_H264}
-									-DUSE_VP9:BOOL=${USE_VP9}
-									-DUSE_X265:BOOL=${USE_X265}
-									-DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
-									-DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
-									-DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
-									-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-									-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-									-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
-									-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
-									-DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
-									-DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
-									-DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
-									-DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
-									-DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
-									-DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
-									-DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
-									-DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
-  								-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR} 
-  								-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR} 
-  								"${CMAKE_BINARY_DIR}/OpenIGTLink"
-									WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/OpenIGTLink-bin" )
-ELSE()
-	ExternalProject_Add( OpenIGTLink-lib
-		PREFIX "${CMAKE_BINARY_DIR}/OpenIGTLink-prefix"
-		SOURCE_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink"
-		BINARY_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink-bin"
-		#--Download step--------------
-		GIT_REPOSITORY "https://github.com/leochan2009/OpenIGTLink.git"
-		GIT_TAG superbuild-findmodules
-		#--Configure step-------------
-		CMAKE_ARGS
-			${PLATFORM_SPECIFIC_ARGS}
-			-DOpenIGTLink_SUPERBUILD:BOOL=OFF
-			-DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
-			-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-			-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
-			-DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
-			-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-			-DBUILD_TESTING:BOOL=${BUILD_TESTING}
-			-DUSE_GTEST:BOOL=${USE_GTEST}
-			-DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
-			-DUSE_H264:BOOL=${USE_H264}
-			-DUSE_VP9:BOOL=${USE_VP9}
-			-DUSE_X265:BOOL=${USE_X265}
-			-DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
-			-DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
-			-DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
-			-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-			-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-			-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
-			-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
-			-DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
-			-DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
-			-DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
-			-DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
-			-DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
-			-DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
-			-DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
-			-DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
-		#--Build step-----------------
-		BUILD_ALWAYS 1
-		#--Install step-----------------
-		INSTALL_COMMAND ""
-		DEPENDS ${OpenIGTLink_DEPENDENCIES}
-		)
-ENDIF()  
\ No newline at end of file
+ExternalProject_Add( OpenIGTLink-lib
+	PREFIX "${CMAKE_BINARY_DIR}/OpenIGTLink-prefix"
+	SOURCE_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink"
+	BINARY_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink-bin"
+	#--Download step--------------
+	GIT_REPOSITORY "https://github.com/leochan2009/OpenIGTLink.git"
+	GIT_TAG superbuild-findmodules
+	#--Configure step-------------
+	CMAKE_ARGS
+		${PLATFORM_SPECIFIC_ARGS}
+		-DOpenIGTLink_SUPERBUILD:BOOL=OFF
+		-DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+		-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+		-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+		-DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+		-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+		-DBUILD_TESTING:BOOL=${BUILD_TESTING}
+		-DUSE_GTEST:BOOL=${USE_GTEST}
+		-DBUILD_VIDEOSTREAM:BOOL=${BUILD_VIDEOSTREAM}
+		-DUSE_H264:BOOL=${USE_H264}
+		-DUSE_VP9:BOOL=${USE_VP9}
+		-DUSE_X265:BOOL=${USE_X265}
+		-DUSE_OPENHEVC:BOOL=${USE_OPENHEVC}
+		-DBUILD_WEBSOCKET:BOOL=${BUILD_WEBSOCKET}
+		-DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
+		-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+		-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+		-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
+		-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
+		-DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
+		-DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
+		-DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
+		-DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
+		-DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
+		-DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
+		-DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
+		-DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
+	#--Build step-----------------
+	BUILD_ALWAYS 1
+	#--Install step-----------------
+	INSTALL_COMMAND ""
+	DEPENDS ${OpenIGTLink_DEPENDENCIES}
+	)
\ No newline at end of file

From 10f3ed17395aba2e8acc1b6814115a69a22b6967 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 4 Aug 2017 14:58:10 -0400
Subject: [PATCH 11/21] BUG: google test in VS2012 needs additional
 preprocessing definition _VARIADIC_MAX=10 to support tuple type, which is
 hard to achieved using externalProject_add method. use the original method to
 build googletest. That is download the source code and add the googletest
 cmakelists.txt file in the test build.

EHN: find modules ready for vp9 and OpenHEVC in Unix-like system, x265 in both os systems.
---
 Source/CMakeLists.txt                        |   4 +-
 Source/VideoStreaming/VideoStreaming.cmake   |  26 +-
 SuperBuild/CMakeListsOpenH264Download.txt.in |  12 -
 SuperBuild/CMakeListsVP9Download.txt.in      |  12 -
 SuperBuild/External_VP9.cmake                |  61 ++--
 SuperBuild/External_openHEVC.cmake           |  25 +-
 SuperBuild/External_openh264.cmake           |  44 ++-
 SuperBuild/External_x265.cmake               |  31 +-
 SuperBuild/External_yasm.cmake               |  25 +-
 SuperBuild/Superbuild.cmake                  |  21 +-
 SuperBuild/findOpenH264.cmake                |  35 +++
 SuperBuild/findOpenHEVC.cmake                |  49 +++
 SuperBuild/findVP9.cmake                     |  30 ++
 SuperBuild/findX265.cmake                    |  34 +++
 SuperBuild/findYASM.cmake                    |  28 ++
 Testing/CMakeLists.txt                       | 304 ++++++++++---------
 Testing/External_googletest.cmake            |  51 ----
 Testing/GoogletestDownload.txt.in            |  25 ++
 Testing/igtlVideoMessageTest.cxx             |  13 +-
 appveyor.yml                                 |   9 +-
 20 files changed, 488 insertions(+), 351 deletions(-)
 delete mode 100644 SuperBuild/CMakeListsOpenH264Download.txt.in
 create mode 100644 SuperBuild/findOpenH264.cmake
 create mode 100644 SuperBuild/findOpenHEVC.cmake
 create mode 100644 SuperBuild/findVP9.cmake
 create mode 100644 SuperBuild/findX265.cmake
 create mode 100644 SuperBuild/findYASM.cmake
 delete mode 100644 Testing/External_googletest.cmake
 create mode 100644 Testing/GoogletestDownload.txt.in

diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 79347c96..6a35d51e 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -250,13 +250,13 @@ LIST(APPEND OpenIGTLink_DEPENDENCIES igtlutil)
 IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
 	IF(BUILD_VIDEOSTREAM)	
 		IF(USE_H264)
-  		add_dependencies(OpenIGTLink openh264)
+  		add_dependencies(OpenIGTLink OpenH264)
   	ENDIF()
 		IF(USE_VP9)
   		add_dependencies(OpenIGTLink VP9)
   	ENDIF()
   	IF(USE_X265)
-  		add_dependencies(OpenIGTLink x265)
+  		add_dependencies(OpenIGTLink X265)
   	ENDIF()
   	IF(USE_OPENHEVC)
   		add_dependencies(OpenIGTLink openHEVC)
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index 30750cf5..5aabe91b 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -1,5 +1,5 @@
 # Add support for OpenIGTLink version 3
-IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X265 OR USE_OPENHEVC))
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
   LIST(APPEND OpenIGTLink_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/Source/VideoStreaming)
   LIST(APPEND OpenIGTLink_SOURCES
     ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/igtl_video.c
@@ -26,7 +26,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
   ENDIF()
   IF(USE_H264)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_openh264.cmake)
-  	IF(EXISTS ${H264_LIBRARY_DIR})
+  	IF(NOT ${OpenH264_INCLUDE_DIR} STREQUAL "")
 			LIST(APPEND OpenIGTLink_SOURCES
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.cxx
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.cxx
@@ -36,13 +36,14 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
 					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.h
 					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.h)
 			ENDIF()
-    	IF(NOT ${H264_LIBRARY_DIR} EQUAL "")
-				LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		"${H264_LIBRARY_DIR}/include/wels/" )
-    		LINK_DIRECTORIES("${H264_LIBRARY_DIR}/lib")
-			ENDIF()
+			LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		${OpenH264_INCLUDE_DIR}
+    	)
+			LIST(APPEND LINK_LIBS
+				${OpenH264_LIBRARY}
+			)
 		ELSE()
-			MESSAGE("H264_LIBRARY_DIR no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
+			MESSAGE("H264_LIBRARY no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
 		ENDIF()
 	ENDIF()
 	
@@ -79,19 +80,22 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND (USE_H264 OR USE_VP9 OR USE_X
   ENDIF()
 
   IF(USE_X265)
-  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_x265.cmake)
+  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_X265.cmake)
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.cxx
       )
     LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${X265_SOURCE_DIR}/source
-    		${X265_LIBRARY_DIR}
+    		${X265_INCLUDE_DIR}/source
     	)
     IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
       LIST(APPEND OpenIGTLink_INCLUDE_FILES
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.h
         )
     ENDIF()
+    LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		${X265_INCLUDE_DIR}
+    		${X265_LIBRARY_DIR}
+    	)
   ENDIF()
 	
   IF(USE_OPENHEVC)
diff --git a/SuperBuild/CMakeListsOpenH264Download.txt.in b/SuperBuild/CMakeListsOpenH264Download.txt.in
deleted file mode 100644
index 142271c2..00000000
--- a/SuperBuild/CMakeListsOpenH264Download.txt.in
+++ /dev/null
@@ -1,12 +0,0 @@
-project(openh264-download NONE)
-include(ExternalProject)
-ExternalProject_Add(openh264-download
-	SOURCE_DIR "${H264_SOURCE_DIR}"
-  BINARY_DIR "${H264_LIBRARY_DIR}"
-  GIT_REPOSITORY https://github.com/cisco/openh264.git
-  GIT_TAG master
-  CONFIGURE_COMMAND ""
-  BUILD_COMMAND     ""
-  INSTALL_COMMAND   ""
-  TEST_COMMAND      ""
-)    
\ No newline at end of file
diff --git a/SuperBuild/CMakeListsVP9Download.txt.in b/SuperBuild/CMakeListsVP9Download.txt.in
index 9cf79c68..e69de29b 100644
--- a/SuperBuild/CMakeListsVP9Download.txt.in
+++ b/SuperBuild/CMakeListsVP9Download.txt.in
@@ -1,12 +0,0 @@
-project(VP9-download NONE)
-include(ExternalProject)
-ExternalProject_Add(VP9
-  GIT_REPOSITORY https://github.com/webmproject/libvpx/
-  GIT_TAG master
-  SOURCE_DIR        "${VP9_SOURCE_DIR}"
-  BINARY_DIR        "${VP9_LIBRARY_DIR}"
-  CONFIGURE_COMMAND ""
-  BUILD_COMMAND     ""
-  INSTALL_COMMAND   ""
-  TEST_COMMAND      ""
-)
diff --git a/SuperBuild/External_VP9.cmake b/SuperBuild/External_VP9.cmake
index c029f38e..713cfe41 100644
--- a/SuperBuild/External_VP9.cmake
+++ b/SuperBuild/External_VP9.cmake
@@ -1,21 +1,7 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-SET(VP9_Proj_BUILT "0")
-IF((EXISTS ${VP9_SOURCE_DIR}) AND (EXISTS ${VP9_LIBRARY_DIR}))
-	IF((EXISTS "${VP9_SOURCE_DIR}/vpx/vp8cx.h") AND (EXISTS "${VP9_SOURCE_DIR}/vpx/vpx_image.h"))
-		IF(WIN32)
-			SET(LINK_VP9_LIBRARY optimized ${VP9_LIBRARY_DIR}\\$(Platform)\\Release\\vpxmd.lib debug ${VP9_LIBRARY_DIR}\\$(Platform)\\Debug\\vpxmdd.lib)
-			IF(EXISTS "${LINK_VP9_LIBRARY}")
-				SET(VP9_Proj_BUILT "1")
-			ENDIF()
-		ELSE()
-			IF(EXISTS "${VP9_LIBRARY_DIR}/libvpx.a")
-				SET(VP9_Proj_BUILT "1")
-			ENDIF()
-		ENDIF()	
-	ENDIF()
-ENDIF()
-IF(VP9_Proj_BUILT EQUAL "1")
+include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findVP9.cmake)
+IF(VP9_FOUND)
   IF(${OpenIGTLink_PROTOCOL_VERSION} LESS 3 OR (NOT ${BUILD_VIDEOSTREAM}))
     MESSAGE(FATAL_ERROR "Video streaming requires a build of OpenIGTLink with v3 support enabled. Please set the OpenIGTLink_PROTOCOL_VERSION_3 to true and activate the BUILD_VIDEOSTREAM.")
   ENDIF()
@@ -23,16 +9,35 @@ ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
   MESSAGE(STATUS "Downloading VP9 from https://github.com/webmproject/libvpx.git")              
 	SET (VP9_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
-  SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9-bin" CACHE PATH "VP9 library directory" FORCE)   							
-	configure_file(${OpenIGTLink_SOURCE_DIR}/SuperBuild/CMakeListsVP9Download.txt.in
-  ${PROJECT_BINARY_DIR}/Deps/VP9-download/CMakeLists.txt)
-	#Here the downloading project is triggered                                                               
-	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DH264_SOURCE_DIR:STRING=${VP9_SOURCE_DIR} -DH264_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR} . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/VP9-download" )
-	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/VP9-download" )                    
-	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")             
-		execute_process(COMMAND "${VP9_SOURCE_DIR}/configure" --disable-examples --disable-tools --disable-docs --disable-vp8 --disable-libyuv --disable-unit_tests --disable-postproc WORKING_DIRECTORY "${VP9_LIBRARY_DIR}" )
-    execute_process(COMMAND "make" WORKING_DIRECTORY "${VP9_LIBRARY_DIR}" )                       
-	endif(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
+  SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 library directory" FORCE)   							
+	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
+    ExternalProject_Add(VP9
+    	PREFIX "${CMAKE_BINARY_DIR}/Deps/VP9-prefix"
+      GIT_REPOSITORY https://github.com/webmproject/libvpx/
+      GIT_TAG master
+      SOURCE_DIR        "${VP9_SOURCE_DIR}"
+      CONFIGURE_COMMAND "${VP9_SOURCE_DIR}/configure" --disable-examples --disable-tools --disable-docs --disable-vp8 --disable-libyuv --disable-unit_tests --disable-postproc WORKING_DIRECTORY "${VP9_LIBRARY_DIR}"
+      BUILD_ALWAYS 1
+      BUILD_COMMAND make
+      BUILD_IN_SOURCE 1
+      INSTALL_COMMAND   ""
+      TEST_COMMAND      ""
+      DEPENDS YASM
+    )
+  else()
+    # ToDo: if it is a window os platform, make the build successful
+    ExternalProject_Add(VP9
+    	PREFIX "${CMAKE_BINARY_DIR}/Deps/VP9-prefix"
+      GIT_REPOSITORY https://github.com/webmproject/libvpx/
+      GIT_TAG master
+      SOURCE_DIR        "${VP9_SOURCE_DIR}"
+      BINARY_DIR        "${VP9_LIBRARY_DIR}"
+      CONFIGURE_COMMAND ""
+      BUILD_ALWAYS 1
+      BUILD_COMMAND     ""
+      INSTALL_COMMAND   ""
+      TEST_COMMAND      ""
+      DEPENDS YASM
+    )
+  endif()
 ENDIF()
diff --git a/SuperBuild/External_openHEVC.cmake b/SuperBuild/External_openHEVC.cmake
index a9472dfb..9f0ca031 100644
--- a/SuperBuild/External_openHEVC.cmake
+++ b/SuperBuild/External_openHEVC.cmake
@@ -1,24 +1,7 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-SET(OpenHEVC_Proj_BUILT "0")
-IF((EXISTS ${OPENHEVC_SOURCE_DIR}) AND (EXISTS ${OPENHEVC_LIBRARY_DIR}))
-	IF(EXISTS "${OPENHEVC_SOURCE_DIR}/gpac/modules/openhevc_dec/openHevcWrapper.h") 
-		IF(WIN32)
-		ELSE()
-			IF(${CMAKE_BUILD_TYPE})
-				IF(EXISTS "${OPENHEVC_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/libLibOpenHevcWrapper.a" )
-					SET(OpenHEVC_Proj_BUILT "1")
-				ENDIF()
-			ELSE()
-				IF(EXISTS "${OPENHEVC_LIBRARY_DIR}/libLibOpenHevcWrapper.a" )
-					SET(OpenHEVC_Proj_BUILT "1")
-				ENDIF()	
-			ENDIF()
-		ENDIF()		
-	ENDIF()
-ENDIF()
-message(${OpenHEVC_Proj_BUILT})
-IF(OpenHEVC_Proj_BUILT EQUAL "1")
+include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findOpenHEVC.cmake)
+IF(OPENHEVC_FOUND)
   # openHEVC has been built already
   MESSAGE(STATUS "Using openHEVC available at: ${OPENHEVC_SOURCE_DIR}")
   #FIND_PACKAGE(openHEVC REQUIRED)
@@ -37,7 +20,7 @@ ELSE()
   SET (OPENHEVC_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC" CACHE PATH "openHEVC source directory" FORCE)
   SET (OPENHEVC_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC-bin" CACHE PATH "openHEVC library directory" FORCE)
 
-  ExternalProject_Add( openHEVC
+  ExternalProject_Add( OPENHEVC
     PREFIX "${CMAKE_BINARY_DIR}/Deps/openHEVC-prefix"
     SOURCE_DIR "${OPENHEVC_SOURCE_DIR}"
     BINARY_DIR "${OPENHEVC_LIBRARY_DIR}"
@@ -58,6 +41,6 @@ ELSE()
     #--Build step-----------------
     BUILD_ALWAYS 1
     INSTALL_COMMAND ""
-    DEPENDS yasm
+    DEPENDS YASM
     )
 ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/External_openh264.cmake b/SuperBuild/External_openh264.cmake
index 8d8c6a52..f69bff48 100644
--- a/SuperBuild/External_openh264.cmake
+++ b/SuperBuild/External_openh264.cmake
@@ -1,6 +1,7 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-IF(EXISTS ${H264_LIBRARY_DIR})
+include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findOpenH264.cmake)
+IF(OpenH264_FOUND)
   # H264 has been built already
   IF(${OpenIGTLink_PROTOCOL_VERSION} LESS 3 OR (NOT ${BUILD_VIDEOSTREAM}))
     MESSAGE(FATAL_ERROR "Video streaming requires a build of OpenIGTLink with v3 support enabled. Please set the OpenIGTLink_PROTOCOL_VERSION_3 to true and activate the BUILD_VIDEOSTREAM.")
@@ -8,17 +9,32 @@ IF(EXISTS ${H264_LIBRARY_DIR})
 ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
   MESSAGE(STATUS "Downloading openh264 from https://github.com/cisco/openh264.git.")  
-  SET (H264_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 source directory" FORCE)
-  SET (H264_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openh264-bin" CACHE PATH "H264 library directory" FORCE)   							
-	configure_file(${OpenIGTLink_SOURCE_DIR}/SuperBuild/CMakeListsOpenH264Download.txt.in
-  ${PROJECT_BINARY_DIR}/Deps/openh264-download/CMakeLists.txt)
-	#Here the downloading project is triggered                                                               
-	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR} -DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR} . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/openh264-download" )
-	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
-									WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Deps/openh264-download" )                    
-	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")             
-					execute_process(COMMAND "make" WORKING_DIRECTORY "${H264_SOURCE_DIR}" )  
-					execute_process(COMMAND make install PREFIX=${H264_LIBRARY_DIR} WORKING_DIRECTORY "${H264_SOURCE_DIR}" )                       
-	endif(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 							
+  SET (OpenH264_DIR "${CMAKE_BINARY_DIR}/Deps/openh264-bin" CACHE PATH "H264 source directory" FORCE)
+  if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")     
+		ExternalProject_Add(OpenH264
+			PREFIX "${CMAKE_BINARY_DIR}/Deps/openh264-prefix"
+			SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openh264"
+			GIT_REPOSITORY https://github.com/cisco/openh264.git
+			GIT_TAG master
+			CONFIGURE_COMMAND ""
+			BUILD_ALWAYS 1
+			BUILD_COMMAND     make
+			BUILD_IN_SOURCE 1
+			INSTALL_COMMAND   make install PREFIX=${OpenH264_DIR}
+			TEST_COMMAND      ""
+		)  
+	else()
+		# ToDo: if it is a window os platform, make the build successful
+		ExternalProject_Add(OpenH264
+			PREFIX "${CMAKE_BINARY_DIR}/Deps/openh264-prefix"
+			SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openh264"
+			GIT_REPOSITORY https://github.com/cisco/openh264.git
+			GIT_TAG master
+			CONFIGURE_COMMAND ""
+			BUILD_ALWAYS 1
+			BUILD_COMMAND     ""
+			INSTALL_COMMAND   ""
+			TEST_COMMAND      ""
+		) 	  
+	endif()                   						
 ENDIF()
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index 9cbea991..7982cb6a 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -1,23 +1,8 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-SET(X265_Proj_BUILT "0")
-IF((EXISTS ${X265_SOURCE_DIR}) AND (EXISTS ${X265_LIBRARY_DIR})) 
-		IF(WIN32)
-			IF((EXISTS "${X265_SOURCE_DIR}\\source\\x265.h") AND
-					(EXISTS "${X265_LIBRARY_DIR}\\${CMAKE_BUILD_TYPE}\\x265-static.lib"))
-				SET(X265_Proj_BUILT "1")
-			ENDIF()
-		ELSE()
-			IF((EXISTS "${X265_SOURCE_DIR}/source/x265.h") AND
-				(EXISTS "${X265_LIBRARY_DIR}/libx265.a"))
-				SET(X265_Proj_BUILT "1")
-			ENDIF()
-		ENDIF()	
-ENDIF()
-IF(X265_Proj_BUILT EQUAL "1")
-  # x265 has been built already
-  # FIND_PACKAGE(x265 REQUIRED)
-  MESSAGE(STATUS "Using x265 available at: ${X265_LIBRARY_DIR}")
+include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findX265.cmake)
+IF(X265_FOUND)
+  MESSAGE(STATUS "Using X265 available at: ${X265_INCLUDE_DIR}")
 ELSE()
   # x265 has not been built yet, so download and build it as an external project
   SET(GIT_REPOSITORY "https://github.com/videolan/x265.git")
@@ -33,11 +18,11 @@ ELSE()
 	ENDIF()
   
   MESSAGE(STATUS "Downloading x265 ${GIT_TAG} from: ${GIT_REPOSITORY}")
-  SET (X265_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/x265" CACHE PATH "x265 source directory" FORCE)
+  SET (X265_INCLUDE_DIR "${CMAKE_BINARY_DIR}/Deps/x265" CACHE PATH "x265 source directory" FORCE)
   SET (X265_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/x265-bin" CACHE PATH "x265 library directory" FORCE)
-  ExternalProject_Add(x265
+  ExternalProject_Add(X265
     PREFIX "${CMAKE_BINARY_DIR}/Deps/x265-prefix"
-    SOURCE_DIR "${X265_SOURCE_DIR}"
+    SOURCE_DIR "${X265_INCLUDE_DIR}"
     #SOURCE_SUBDIR source   # SOURCE_SUBDIR is only available for cmake version later than 3.7.2 
     BINARY_DIR "${X265_LIBRARY_DIR}"
     #--Download step--------------
@@ -55,10 +40,10 @@ ELSE()
       -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
       -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
       -DEXPORT_C_API:BOOL=ON
-      -DENABLE_CLI:BOOL=OFF ${X265_SOURCE_DIR}/source
+      -DENABLE_CLI:BOOL=OFF ${X265_INCLUDE_DIR}/source
     #--Build step----------------- 
     BUILD_ALWAYS 1
     INSTALL_COMMAND ""
-    DEPENDS yasm
+    DEPENDS YASM
     )
 ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/External_yasm.cmake b/SuperBuild/External_yasm.cmake
index 3218ce0a..1c15fdb1 100644
--- a/SuperBuild/External_yasm.cmake
+++ b/SuperBuild/External_yasm.cmake
@@ -1,16 +1,9 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-SET(YASM_Proj_BUILT "0")
-IF((EXISTS ${YASM_SOURCE_DIR}) AND (EXISTS ${YASM_LIBRARY_DIR}))
-	IF(EXISTS "${YASM_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/yasm") 
-		SET(YASM_Proj_BUILT "1")
-	ENDIF()
-ENDIF()
-IF(YASM_Proj_BUILT EQUAL "1")
+include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findYASM.cmake)
+IF(YASM_FOUND)
   # YASM has been built already
-  MESSAGE(STATUS "Using YASM available at: ${YASM_LIBRARY_DIR}")
-  #FIND_PACKAGE(yasm REQUIRED)
-  #SET(YASM_LIBRARY_DIR "${yasm_DIR}" CACHE INTERNAL "Path to store yasm binaries")
+  MESSAGE(STATUS "Using YASM available at: ${YASM_BINARY_DIR}")
 ELSE()
   # yas has not been built yet, so download and build it as an external project
   SET(GIT_REPOSITORY "https://github.com/yasm/yasm.git")
@@ -22,12 +15,12 @@ ELSE()
   MESSAGE(STATUS "Downloading yasm ${GIT_TAG} from: ${GIT_REPOSITORY}")
 
   SET (YASM_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/yasm" CACHE PATH "YASM source directory" FORCE)
-  SET (YASM_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/yasm-bin" CACHE PATH "YASM library directory" FORCE)
+  SET (YASM_BINART_DIR "${CMAKE_BINARY_DIR}/Deps/yasm-bin" CACHE PATH "YASM library directory" FORCE)
 
-  ExternalProject_Add( yasm
+  ExternalProject_Add( YASM
     PREFIX "${CMAKE_BINARY_DIR}/Deps/yasm-prefix"
     SOURCE_DIR "${YASM_SOURCE_DIR}"
-    BINARY_DIR "${YASM_LIBRARY_DIR}"
+    BINARY_DIR "${YASM_BINART_DIR}"
     #--Download step--------------
     GIT_REPOSITORY "${GIT_REPOSITORY}"
     GIT_TAG ${GIT_TAG}
@@ -35,9 +28,9 @@ ELSE()
     CMAKE_ARGS
       ${PLATFORM_SPECIFIC_ARGS}
       -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/yasm-install"
-      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${YASM_LIBRARY_DIR}
-      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${YASM_LIBRARY_DIR}
-      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${YASM_LIBRARY_DIR}
+      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${YASM_BINART_DIR}
+      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${YASM_BINART_DIR}
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${YASM_BINART_DIR}
       -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
       -DBUILD_TESTING:BOOL=OFF 
       -DBUILD_EXAMPLES:BOOL=OFF
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index b815630f..73cc2c31 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -5,16 +5,14 @@ SET(OpenIGTLink_DEPENDENCIES)
 # VideoStreaming dependencies
 IF(BUILD_VIDEOSTREAM)
   IF(USE_H264)
-    set(H264_SOURCE_DIR "" CACHE PATH "H264 source directory" FORCE)
-		set(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory" FORCE)     
+    set(OpenH264_DIR "" CACHE PATH "H264 source directory" FORCE)    
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openh264.cmake)
   ENDIF()
   
   IF(USE_X265 OR USE_OPENHEVC OR USE_VP9)
-		set(YASM_SOURCE_DIR "" CACHE PATH "YASM source directory" FORCE)
-		set(YASM_LIBRARY_DIR "" CACHE PATH "YASM library directory" FORCE)
+		set(YASM_BINARY_DIR "" CACHE PATH "YASM binary directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES yasm)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES YASM)
 	ENDIF()
 
   IF(USE_VP9)
@@ -43,6 +41,7 @@ IF(BUILD_VIDEOSTREAM)
     LIST(APPEND OpenIGTLink_DEPENDENCIES websocket)
   ENDIF()
 ENDIF()
+
 ExternalProject_Add( OpenIGTLink-lib
 	PREFIX "${CMAKE_BINARY_DIR}/OpenIGTLink-prefix"
 	SOURCE_DIR "${CMAKE_BINARY_DIR}/OpenIGTLink"
@@ -70,16 +69,14 @@ ExternalProject_Add( OpenIGTLink-lib
 		-DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
 		-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
 		-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-		-DH264_SOURCE_DIR:STRING=${H264_SOURCE_DIR}
-		-DH264_LIBRARY_DIR:STRING=${H264_LIBRARY_DIR}
-		-DX265_SOURCE_DIR:STRING=${X265_SOURCE_DIR}
+		-DOpenH264_DIR:STRING=${OpenH264_DIR}
+		-DX265_INCLUDE_DIR:STRING=${X265_INCLUDE_DIR}
 		-DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
-		-DOPENHEVC_SOURCE_DIR:STRING=${OPENHEVC_SOURCE_DIR}
+		-DOPENHEVC_INCLUDE_DIR:STRING=${OPENHEVC_INCLUDE_DIR}
 		-DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
-		-DVP9_SOURCE_DIR:STRING=${VP9_SOURCE_DIR}
+		-DVP9_INCLUDE_DIR:STRING=${VP9_INCLUDE_DIR}
 		-DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
-		-DYASM_SOURCE_DIR:STRING=${YASM_SOURCE_DIR}
-		-DYASM_LIBRARY_DIR:STRING=${YASM_LIBRARY_DIR}
+		-DYASM_BINARY_DIR:STRING=${YASM_BINARY_DIR}
 	#--Build step-----------------
 	BUILD_ALWAYS 1
 	#--Install step-----------------
diff --git a/SuperBuild/findOpenH264.cmake b/SuperBuild/findOpenH264.cmake
new file mode 100644
index 00000000..0b4118d3
--- /dev/null
+++ b/SuperBuild/findOpenH264.cmake
@@ -0,0 +1,35 @@
+# - The OpenH264 library
+# Once done this will define
+#
+#  OpenH264_ROOT - A list of search hints
+#
+#  OpenH264_FOUND - found OpenH264
+#  OpenH264_INCLUDE_DIR - the OpenH264 include directory
+#  OpenH264_LIBRARIES - openh264 library
+#  A more complete find module cmake file could be found at: 
+#  https://github.com/BelledonneCommunications/linphone-cmake-builder/blob/master/builders/openh264.cmake
+
+# Dependencies
+#libfind_package(OpenH264 NASM)
+
+if (UNIX AND NOT ANDROID)
+  find_package(PkgConfig QUIET)
+  pkg_check_modules(PC_OpenH264 QUIET openh264)
+endif (UNIX AND NOT ANDROID)
+
+
+SET( OpenH264_PATH_HINTS 
+		${OpenH264_ROOT} 
+    ${CMAKE_BINARY_DIR}/Deps/openh264-bin
+    )
+
+set(OpenH264_DIR "")    
+find_path(OpenH264_DIR NAMES codec_api.h codec_app_def.h codec_def.h openh264${CMAKE_STATIC_LIBRARY_SUFFIX} libopenh264.a
+	PATH_SUFFIXES include/wels lib
+	HINTS ${OpenH264_PATH_HINTS}
+	)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenH264 DEFAULT_MSG OpenH264_DIR)
+
+mark_as_advanced(OpenH264_DIR)
diff --git a/SuperBuild/findOpenHEVC.cmake b/SuperBuild/findOpenHEVC.cmake
new file mode 100644
index 00000000..fca92596
--- /dev/null
+++ b/SuperBuild/findOpenHEVC.cmake
@@ -0,0 +1,49 @@
+# - The OPENHEVC library
+# Once done this will define
+#
+#  OPENHEVC_ROOT - A list of search hints
+#
+#  OPENHEVC_FOUND - found OPENHEVC
+#  OPENHEVC_INCLUDE_DIR - the OPENHEVC include directory
+#  OPENHEVC_LIBRARY_DIR - OPENHEVC library directory
+
+IF((EXISTS ${OPENHEVC_SOURCE_DIR}) AND (EXISTS ${OPENHEVC_LIBRARY_DIR}))
+	IF(EXISTS "${OPENHEVC_SOURCE_DIR}/gpac/modules/openhevc_dec/openHevcWrapper.h") 
+		IF(WIN32)
+		ELSE()
+			IF(${CMAKE_BUILD_TYPE})
+				IF(EXISTS "${OPENHEVC_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/libLibOpenHevcWrapper.a" )
+					SET(OpenHEVC_Proj_BUILT "1")
+				ENDIF()
+			ELSE()
+				IF(EXISTS "${OPENHEVC_LIBRARY_DIR}/libLibOpenHevcWrapper.a" )
+					SET(OpenHEVC_Proj_BUILT "1")
+				ENDIF()	
+			ENDIF()
+		ENDIF()		
+	ENDIF()
+ENDIF()
+
+SET( OPENHEVC_PATH_HINTS 
+		${OPENHEVC_ROOT} 
+    ${CMAKE_BINARY_DIR}/Deps/OPENHEVC
+    ${CMAKE_BINARY_DIR}/Deps/OPENHEVC-bin
+    )
+    
+set(OPENHEVC_INCLUDE_DIR "")
+find_path(OPENHEVC_INCLUDE_DIR NAMES openHevcWrapper.h 
+	PATH_SUFFIXES gpac/modules/openhevc_dec
+	HINTS ${OPENHEVC_PATH_HINTS} 
+	)
+	
+set(OPENHEVC_LIBRARY_DIR "")
+find_path(OPENHEVC_LIBRARY_DIR
+	 NAMES LibOpenHevcWrapper${CMAKE_STATIC_LIBRARY_SUFFIX} libLibOpenHevcWrapper.a
+	 PATH_SUFFIXES ${CMAKE_BUILD_TYPE}
+	 HINTS ${OPENHEVC_PATH_HINTS}
+	 )
+	 
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(OPENHEVC REQUIRED_VARS OPENHEVC_LIBRARY_DIR OPENHEVC_INCLUDE_DIR)
+
+mark_as_advanced(OPENHEVC_INCLUDE_DIR OPENHEVC_LIBRARY_DIR)
diff --git a/SuperBuild/findVP9.cmake b/SuperBuild/findVP9.cmake
new file mode 100644
index 00000000..c316e5b9
--- /dev/null
+++ b/SuperBuild/findVP9.cmake
@@ -0,0 +1,30 @@
+# - The VP9 library
+# Once done this will define
+#
+#  VP9_ROOT - A list of search hints
+#
+#  VP9_FOUND - found VP9
+#  VP9_INCLUDE_DIR - the VP9 include directory
+#  VP9_LIBRARY_DIR - VP9 library directory
+
+SET( VP9_PATH_HINTS 
+		${VP9_ROOT} 
+    ${CMAKE_BINARY_DIR}/Deps/VP9
+    ${CMAKE_BINARY_DIR}/Deps/VP9-bin
+    )
+set(VP9_INCLUDE_DIR "")
+find_path(VP9_INCLUDE_DIR NAMES vp8cx.h vpx_image.h 
+	PATH_SUFFIXES vpx
+	HINTS ${VP9_PATH_HINTS} 
+	)
+	
+set(VP9_LIBRARY_DIR "")
+find_path(VP9_LIBRARY_DIR
+	 NAMES vpxmdd.lib vpxmd.lib libvpx.a
+	 PATH_SUFFIXES $(Platform)/${CMAKE_BUILD_TYPE}
+	 HINTS ${VP9_PATH_HINTS}
+	 )
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(VP9 REQUIRED_VARS VP9_LIBRARY_DIR VP9_INCLUDE_DIR)
+
+mark_as_advanced(VP9_INCLUDE_DIR VP9_LIBRARY_DIR)
diff --git a/SuperBuild/findX265.cmake b/SuperBuild/findX265.cmake
new file mode 100644
index 00000000..13a5225f
--- /dev/null
+++ b/SuperBuild/findX265.cmake
@@ -0,0 +1,34 @@
+# - The X265 library
+# Once done this will define
+#
+#  X265_ROOT - A list of search hints
+#
+#  X265_FOUND - found X265
+#  X265_INCLUDE_DIR - the X265 include directory
+#  X265_LIBRARY_DIR - X265 library directory
+
+#if (UNIX AND NOT ANDROID)
+#  find_package(PkgConfig QUIET)
+#  pkg_check_modules(PC_X265 QUIET X265)
+#endif()
+
+SET( X265_PATH_HINTS 
+		${X265_ROOT} 
+    ${CMAKE_BINARY_DIR}/Deps/x265
+    ${CMAKE_BINARY_DIR}/Deps/x265-bin
+    )
+set(X265_INCLUDE_DIR "")
+find_path(X265_INCLUDE_DIR NAMES x265.h 
+	PATH_SUFFIXES source
+	HINTS ${X265_PATH_HINTS} 
+	)
+	
+set(X265_LIBRARY_DIR "")
+find_path(X265_LIBRARY_DIR
+	 NAMES x265-static${CMAKE_STATIC_LIBRARY_SUFFIX} libx265.a
+	 HINTS ${X265_PATH_HINTS}
+	 )
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(X265 REQUIRED_VARS X265_LIBRARY_DIR X265_INCLUDE_DIR)
+
+mark_as_advanced(X265_INCLUDE_DIR X265_LIBRARY_DIR)
diff --git a/SuperBuild/findYASM.cmake b/SuperBuild/findYASM.cmake
new file mode 100644
index 00000000..56dd8d86
--- /dev/null
+++ b/SuperBuild/findYASM.cmake
@@ -0,0 +1,28 @@
+# - The YASM library
+# Once done this will define
+#
+#  YASM_ROOT - A list of search hints
+#
+#  YASM_FOUND - found YASM
+#  YASM_BINARY_DIR - YASM library directory
+
+#if (UNIX AND NOT ANDROID)
+#  find_package(PkgConfig QUIET)
+#  pkg_check_modules(PC_YASM QUIET YASM)
+#endif()
+
+SET( YASM_PATH_HINTS 
+		${YASM_ROOT} 
+    ${CMAKE_BINARY_DIR}/Deps/YASM
+    ${CMAKE_BINARY_DIR}/Deps/YASM-bin
+    )
+	
+set(YASM_BINARY_DIR "")
+find_path(YASM_BINARY_DIR
+	 NAMES yasm
+	 HINTS ${YASM_PATH_HINTS}
+	 )
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(YASM REQUIRED_VARS YASM_BINARY_DIR)
+
+mark_as_advanced(YASM_BINARY_DIR)
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 79947cb8..9232f4b1 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -1,183 +1,209 @@
-PROJECT(OpenIGTLinkTesting)
+PROJECT( OpenIGTLinkTesting )
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
-
-CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/igtlTestConfig.h.in ${PROJECT_BINARY_DIR}/igtlTestConfig.h)
+cmake_minimum_required(VERSION 2.9)
+find_package(OpenIGTLink REQUIRED)
+include(${OpenIGTLink_USE_FILE})
+include_directories(${OpenIGTLink_INCLUDE_DIRS})
+link_directories(${OpenIGTLink_LIBRARY_DIRS})
 include_directories(${PROJECT_BINARY_DIR})
-
+OPTION(USE_GTEST "Build the testing tree." ON)
+configure_file(${PROJECT_SOURCE_DIR}/igtlTestConfig.h.in ${PROJECT_BINARY_DIR}/igtlTestConfig.h)
+ENABLE_TESTING()
+ADD_SUBDIRECTORY( igtlutil )
 IF(USE_GTEST)
-  IF(${CMAKE_GENERATOR} MATCHES "Visual Studio 11" ) # VS2012 doesn't support correctly the tuples yet
-    ADD_DEFINITIONS("-D_VARIADIC_MAX=10")
-  ENDIF()
-  SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-  # Prevent GoogleTest from overriding our compiler/linker options
-  # when building with Visual Studio
-  INCLUDE(${OpenIGTLink_SOURCE_DIR}/Testing/External_googletest.cmake)
-  include_directories("${CMAKE_BINARY_DIR}/Deps/gtest/include")
-  include_directories("${CMAKE_BINARY_DIR}/Deps/gmock/include")
-  LINK_DIRECTORIES("${CMAKE_BINARY_DIR}/Deps/gtest-bin")
-  LINK_DIRECTORIES("${CMAKE_BINARY_DIR}/Deps/gmock-bin")
+	#-----------
+	#download of GoogleTest
+	if( MSVC ) # VS2012 doesn't support correctly the tuples yet
+		add_definitions("-D_VARIADIC_MAX=10")
+	endif()
+	# Download and unpack googletest at configure time
+	configure_file(GoogletestDownload.txt.in
+								 googletest-download/CMakeLists.txt)
+	execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 
+		WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/googletest-download" )
+
+	execute_process(COMMAND "${CMAKE_COMMAND}" --build . 
+		WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/googletest-download" )
+
+	# Prevent GoogleTest from overriding our compiler/linker options
+	# when building with Visual Studio
+	set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
+
+	# Add googletest directly to our build. This adds
+	# the following targets: gtest, gtest_main, gmock
+	# and gmock_main
+	add_subdirectory("${PROJECT_BINARY_DIR}/gmock"
+									 "${PROJECT_BINARY_DIR}/gmock-build" )
+
+	# The gtest/gmock targets carry header search path
+	# dependencies automatically when using CMake 2.8.11 or
+	# later. Otherwise we have to add them here ourselves.
+	include_directories("${gtest_SOURCE_DIR}/include")
+	include_directories("${gmock_SOURCE_DIR}/include")
+#---------------
 ENDIF()
 
-ADD_SUBDIRECTORY( igtlutil )
-
-ADD_EXECUTABLE(igtlMultiThreaderTest1       igtlMultiThreaderTest1.cxx)
-ADD_EXECUTABLE(igtlMultiThreaderTest2       igtlMultiThreaderTest2.cxx)
-ADD_EXECUTABLE(igtlMultiThreaderTest3       igtlMultiThreaderTest3.cxx)
-ADD_EXECUTABLE(igtlMessageFactoryTest       igtlMessageFactoryTest.cxx)
-ADD_EXECUTABLE(igtlTimeStampTest1           igtlTimeStampTest1.cxx)
-ADD_EXECUTABLE(igtlMessageBaseTest          igtlMessageBaseTest.cxx)
-ADD_EXECUTABLE(igtlConditionVariableTest    igtlConditionVariableTest.cxx)
-
-ADD_EXECUTABLE(igtlImageMessageTest         igtlImageMessageTest.cxx)
-ADD_EXECUTABLE(igtlImageMessage2Test        igtlImageMessage2Test.cxx)
-ADD_EXECUTABLE(igtlTransformMessageTest     igtlTransformMessageTest.cxx)
-ADD_EXECUTABLE(igtlPositionMessageTest      igtlPositionMessageTest.cxx)
-ADD_EXECUTABLE(igtlStatusMessageTest        igtlStatusMessageTest.cxx)
-ADD_EXECUTABLE(igtlCapabilityMessageTest    igtlCapabilityMessageTest.cxx)
+ADD_EXECUTABLE(igtlMultiThreaderTest1   igtlMultiThreaderTest1.cxx)
+ADD_EXECUTABLE(igtlMultiThreaderTest2   igtlMultiThreaderTest2.cxx)
+ADD_EXECUTABLE(igtlMultiThreaderTest3   igtlMultiThreaderTest3.cxx)
+ADD_EXECUTABLE(igtlMessageFactoryTest   igtlMessageFactoryTest.cxx)
+ADD_EXECUTABLE(igtlTimeStampTest1   igtlTimeStampTest1.cxx)
+ADD_EXECUTABLE(igtlMessageBaseTest   igtlMessageBaseTest.cxx)
+ADD_EXECUTABLE(igtlConditionVariableTest   igtlConditionVariableTest.cxx)
+
+ADD_EXECUTABLE(igtlImageMessageTest   igtlImageMessageTest.cxx)
+ADD_EXECUTABLE(igtlImageMessage2Test   igtlImageMessage2Test.cxx)
+ADD_EXECUTABLE(igtlTransformMessageTest   igtlTransformMessageTest.cxx)
+ADD_EXECUTABLE(igtlPositionMessageTest   igtlPositionMessageTest.cxx)
+ADD_EXECUTABLE(igtlStatusMessageTest   igtlStatusMessageTest.cxx)
+ADD_EXECUTABLE(igtlCapabilityMessageTest   igtlCapabilityMessageTest.cxx)
+
+#ADD_EXECUTABLE(igtlSocketTest         igtlSocketTest.cxx)
+#ADD_EXECUTABLE(igtlServerSocketTest   igtlServerSocketTest.cxx)
+#ADD_EXECUTABLE(igtlClientSocketTest   igtlClientSocketTest.cxx)
 
 # Message Tests Added in Version 2
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  ADD_EXECUTABLE(igtlBindMessageTest          igtlBindMessageTest.cxx)
-  ADD_EXECUTABLE(igtlColorTableMessageTest    igtlColorTableMessageTest.cxx)
-  ADD_EXECUTABLE(igtlLabelMetaMessageTest     igtlLabelMetaMessageTest.cxx)
-  ADD_EXECUTABLE(igtlNDArrayMessageTest       igtlNDArrayMessageTest.cxx)
-  ADD_EXECUTABLE(igtlImageMetaMessageTest     igtlImageMetaMessageTest.cxx)
-  ADD_EXECUTABLE(igtlPointMessageTest         igtlPointMessageTest.cxx)
-  ADD_EXECUTABLE(igtlPolyDataMessageTest      igtlPolyDataMessageTest.cxx)
-  ADD_EXECUTABLE(igtlSensorMessageTest        igtlSensorMessageTest.cxx)
-  ADD_EXECUTABLE(igtlStringMessageTest        igtlStringMessageTest.cxx)
-  ADD_EXECUTABLE(igtlTrackingDataMessageTest  igtlTrackingDataMessageTest.cxx)
-  ADD_EXECUTABLE(igtlTrajectoryMessageTest    igtlTrajectoryMessageTest.cxx)
+  ADD_EXECUTABLE(igtlBindMessageTest   igtlBindMessageTest.cxx)
+  ADD_EXECUTABLE(igtlColorTableMessageTest   igtlColorTableMessageTest.cxx)
+  ADD_EXECUTABLE(igtlLabelMetaMessageTest   igtlLabelMetaMessageTest.cxx)
+  ADD_EXECUTABLE(igtlNDArrayMessageTest   igtlNDArrayMessageTest.cxx)
+  ADD_EXECUTABLE(igtlImageMetaMessageTest   igtlImageMetaMessageTest.cxx)
+  ADD_EXECUTABLE(igtlPointMessageTest   igtlPointMessageTest.cxx)
+  ADD_EXECUTABLE(igtlPolyDataMessageTest   igtlPolyDataMessageTest.cxx)
+  ADD_EXECUTABLE(igtlSensorMessageTest   igtlSensorMessageTest.cxx)
+  ADD_EXECUTABLE(igtlStringMessageTest   igtlStringMessageTest.cxx)
+  ADD_EXECUTABLE(igtlTrackingDataMessageTest   igtlTrackingDataMessageTest.cxx)
+  ADD_EXECUTABLE(igtlTrajectoryMessageTest   igtlTrajectoryMessageTest.cxx)
 ENDIF()
 
 # Message Tests Added in Version 3
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
-  ADD_EXECUTABLE(igtlCommandMessageTest       igtlCommandMessageTest.cxx)
-  ADD_EXECUTABLE(igtlMessageRTPWrapperTest    igtlMessageRTPWrapperTest.cxx)
+  ADD_EXECUTABLE(igtlCommandMessageTest   igtlCommandMessageTest.cxx)
+  ADD_EXECUTABLE(igtlMessageRTPWrapperTest   igtlMessageRTPWrapperTest.cxx)
 ENDIF()
 
-IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR (USE_X265 AND USE_OPENHEVC)))
-  ADD_EXECUTABLE(igtlVideoMessageTest         igtlVideoMessageTest.cxx)
-  ADD_EXECUTABLE(igtlVideoMetaMessageTest     igtlVideoMetaMessageTest.cxx)
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
+  ADD_EXECUTABLE(igtlVideoMessageTest   igtlVideoMessageTest.cxx)
+  ADD_EXECUTABLE(igtlVideoMetaMessageTest   igtlVideoMetaMessageTest.cxx)
 ENDIF()
 
-IF(OpenIGTLink_USE_GTEST)
-  SET(GTEST_LINK OpenIGTLink gtest gtest_main gmock_main gmock)
+
+IF(USE_GTEST)
+  SET(GTEST_LINK OpenIGTLink gtest_main gtest gmock_main gmock)
 ELSE()
   SET(GTEST_LINK OpenIGTLink)
 ENDIF()
 
-function(target_link_with_gtest_dependency target)
-	IF(OpenIGTLink_USE_GTEST)
-		add_dependencies(${target} GTest GMock)
-	ENDIF()
- 	TARGET_LINK_LIBRARIES(${target} ${GTEST_LINK})
-endfunction()
-
-target_link_with_gtest_dependency(igtlMultiThreaderTest1)
-target_link_with_gtest_dependency(igtlMultiThreaderTest2)
-target_link_with_gtest_dependency(igtlMultiThreaderTest3)
-target_link_with_gtest_dependency(igtlMessageFactoryTest)
-target_link_with_gtest_dependency(igtlTimeStampTest1)
-target_link_with_gtest_dependency(igtlMessageBaseTest)
-target_link_with_gtest_dependency(igtlConditionVariableTest)
-
-target_link_with_gtest_dependency(igtlImageMessageTest      ${GTEST_LINK})
-target_link_with_gtest_dependency(igtlImageMessage2Test     ${GTEST_LINK})
-target_link_with_gtest_dependency(igtlCapabilityMessageTest ${GTEST_LINK})
-target_link_with_gtest_dependency(igtlStatusMessageTest     ${GTEST_LINK})
-target_link_with_gtest_dependency(igtlTransformMessageTest  ${GTEST_LINK})
-target_link_with_gtest_dependency(igtlPositionMessageTest   ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlMultiThreaderTest1 OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMultiThreaderTest2 OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMultiThreaderTest3 OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMessageFactoryTest OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlTimeStampTest1 OpenIGTLink)
+TARGET_LINK_LIBRARIES(igtlMessageBaseTest ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlConditionVariableTest ${GTEST_LINK})
+
+TARGET_LINK_LIBRARIES(igtlImageMessageTest ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlImageMessage2Test ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlCapabilityMessageTest ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlStatusMessageTest ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlTransformMessageTest ${GTEST_LINK})
+TARGET_LINK_LIBRARIES(igtlPositionMessageTest ${GTEST_LINK})
 
 # Message Tests Added in Version 2
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  target_link_with_gtest_dependency(igtlBindMessageTest         ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlColorTableMessageTest   ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlLabelMetaMessageTest    ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlNDArrayMessageTest      ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlImageMetaMessageTest    ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlPointMessageTest        ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlPolyDataMessageTest     ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlSensorMessageTest       ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlStringMessageTest       ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlTrackingDataMessageTest ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlTrajectoryMessageTest   ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlBindMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlColorTableMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlLabelMetaMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlNDArrayMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlImageMetaMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlPointMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlPolyDataMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlSensorMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlStringMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlTrackingDataMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlTrajectoryMessageTest ${GTEST_LINK})
 ENDIF()
 
 # Message Tests Added in Version 3
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
-  target_link_with_gtest_dependency(igtlCommandMessageTest      ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlMessageRTPWrapperTest   ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlCommandMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlMessageRTPWrapperTest ${GTEST_LINK})
 ENDIF()
 
-IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR (USE_X265 AND USE_OPENHEVC)))
-  target_link_with_gtest_dependency(igtlVideoMessageTest        ${GTEST_LINK})
-  target_link_with_gtest_dependency(igtlVideoMetaMessageTest    ${GTEST_LINK})
+IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
+  TARGET_LINK_LIBRARIES(igtlVideoMessageTest ${GTEST_LINK})
+  TARGET_LINK_LIBRARIES(igtlVideoMetaMessageTest ${GTEST_LINK})
 ENDIF()
 
-SET(TestStringFormat1 "--gtest_filter=*.*FormatVersion1")
 
-ADD_TEST(igtlMultiThreaderTest1     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest1)
-ADD_TEST(igtlMultiThreaderTest2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest2)
-ADD_TEST(igtlMultiThreaderTest3     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest3)
-ADD_TEST(igtlMessageFactoryTest     ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageFactoryTest)
-ADD_TEST(igtlTimeStampTest1         ${OpenIGTLink_EXECUTABLE_PATH}/igtlTimeStampTest1)
-ADD_TEST(igtlMessageBaseTest        ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat1})
-ADD_TEST(igtlConditionVariableTest  ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat1})
+#TARGET_LINK_LIBRARIES(igtlSocketTest ${GTEST_LINK})
+#TARGET_LINK_LIBRARIES(igtlClientSocketTest ${GTEST_LINK})
+#TARGET_LINK_LIBRARIES(igtlServerSocketTest ${GTEST_LINK})
+
+set(TestStringFormat1 "--gtest_filter=*.*FormatVersion1")
+
+ADD_TEST(igtlMultiThreaderTest1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest1)
+ADD_TEST(igtlMultiThreaderTest2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest2)
+ADD_TEST(igtlMultiThreaderTest3 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMultiThreaderTest3)
+ADD_TEST(igtlMessageFactoryTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageFactoryTest)
+ADD_TEST(igtlTimeStampTest1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTimeStampTest1)
+ADD_TEST(igtlMessageBaseTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat1})
+ADD_TEST(igtlConditionVariableTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat1})
+
+ADD_TEST(igtlImageMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat1})
+ADD_TEST(igtlImageMessage2Test ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat1})
+ADD_TEST(igtlCapabilityMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat1})
+ADD_TEST(igtlStatusMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat1})
+ADD_TEST(igtlTransformMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat1})
+ADD_TEST(igtlPositionMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest ${TestStringFormat1})
 
-ADD_TEST(igtlImageMessageTest       ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat1})
-ADD_TEST(igtlImageMessage2Test      ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat1})
-ADD_TEST(igtlCapabilityMessageTest  ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat1})
-ADD_TEST(igtlStatusMessageTest      ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat1})
-ADD_TEST(igtlTransformMessageTest   ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat1})
-ADD_TEST(igtlPositionMessageTest    ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest ${TestStringFormat1})
 
 # Message Tests Added in Version 2
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "1")
-  ADD_TEST(igtlBindMessageTest          ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlColorTableMessageTest    ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlLabelMetaMessageTest     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlNDArrayMessageTest       ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlImageMetaMessageTest     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlPointMessageTest         ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlPolyDataMessageTest      ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlSensorMessageTest        ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlStringMessageTest        ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlTrackingDataMessageTest  ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlTrajectoryMessageTest    ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlBindMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlColorTableMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlLabelMetaMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlNDArrayMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlImageMetaMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlPointMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlPolyDataMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlSensorMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlStringMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlTrackingDataMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlTrajectoryMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat1})
 ENDIF()
 
-SET(TestStringFormat2 "--gtest_filter=*.*FormatVersion2")
+set(TestStringFormat2 "--gtest_filter=*.*FormatVersion2")
 # Message Tests Added in Version 3
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2")
-  ADD_TEST(igtlMessageBaseTestFormatVersion2          ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat2})
-  ADD_TEST(igtlImageMessageTestFormatVersion2         ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlImageMessage2TestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat2})
-  ADD_TEST(igtlBindMessageTestFormatVersion2          ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlCapabilityMessageTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlColorTableMessageTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlConditionVariableTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat2})
-  ADD_TEST(igtlLabelMetaMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlNDArrayMessageTestFormatVersion2       ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlImageMetaMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlPointMessageTestFormatVersion2         ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlPolyDataMessageTestFormatVersion2      ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlSensorMessageTestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlStatusMessageTestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlStringMessageTestFormatVersion2        ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlTrackingDataMessageTestFormatVersion2  ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlTrajectoryMessageTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlTransformMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlPositionMessageTest                    ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest)
+  ADD_TEST(igtlMessageBaseTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageBaseTest ${TestStringFormat2})
+  ADD_TEST(igtlImageMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlImageMessage2TestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlImageMessage2Test ${TestStringFormat2})
+  ADD_TEST(igtlBindMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlBindMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlCapabilityMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlCapabilityMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlColorTableMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlColorTableMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlConditionVariableTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlConditionVariableTest ${TestStringFormat2})
+  ADD_TEST(igtlLabelMetaMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlNDArrayMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlNDArrayMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlImageMetaMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlLabelMetaMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlPointMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlPointMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlPolyDataMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlPolyDataMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlSensorMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlSensorMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlStatusMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlStatusMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlStringMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlStringMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlTrackingDataMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrackingDataMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlTrajectoryMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTrajectoryMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlTransformMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlTransformMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlPositionMessageTest ${OpenIGTLink_EXECUTABLE_PATH}/igtlPositionMessageTest)
   ## Command message is available in Protocol version 3, however, we will test both header version 1 and 2
-  ADD_TEST(igtlCommandMessageTestFormatVersion1       ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlCommandMessageTestFormatVersion2       ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlMessageRTPWrapperTestFormatVersion2    ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageRTPWrapperTest ${TestStringFormat2})
+  ADD_TEST(igtlCommandMessageTestFormatVersion1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlCommandMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlCommandMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlMessageRTPWrapperTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlMessageRTPWrapperTest ${TestStringFormat2})
 ENDIF()
 
 IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM AND (USE_H264 OR USE_VP9 OR (USE_X265 AND USE_OPENHEVC)))
-  ADD_TEST(igtlVideoMessageTestFormatVersion1         ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat1})
-  ADD_TEST(igtlVideoMessageTestFormatVersion2         ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat2})
-  ADD_TEST(igtlVideoMetaMessageTestFormatVersion2     ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMetaMessageTest ${TestStringFormat2})
-ENDIF()
\ No newline at end of file
+  ADD_TEST(igtlVideoMessageTestFormatVersion1 ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat1})
+  ADD_TEST(igtlVideoMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMessageTest ${TestStringFormat2})
+  ADD_TEST(igtlVideoMetaMessageTestFormatVersion2 ${OpenIGTLink_EXECUTABLE_PATH}/igtlVideoMetaMessageTest ${TestStringFormat2})
+ENDIF()
diff --git a/Testing/External_googletest.cmake b/Testing/External_googletest.cmake
deleted file mode 100644
index 1d255bcf..00000000
--- a/Testing/External_googletest.cmake
+++ /dev/null
@@ -1,51 +0,0 @@
-cmake_minimum_required(VERSION 2.8.2)
-include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
-IF(GTest_DIR)
-  # x265 has been built already
-  FIND_PACKAGE(GTest REQUIRED)
-
-  MESSAGE(STATUS "Using GTest available at: ${GTest_DIR}")
-
-  SET(OpenIGTLink_GTest_DIR "${GTest_DIR}" CACHE INTERNAL "Path to store gtest binaries")
-ELSE()
-	SET (OpenIGTLink_GTest_DIR "${CMAKE_BINARY_DIR}/Deps/gtest-bin" CACHE INTERNAL "Path to store gtest binaries")
-	ExternalProject_Add(GTest
-		PREFIX "${CMAKE_BINARY_DIR}/Deps/gtest-prefix"
-		SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest"
-		BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gtest-bin"
-		#--Download step--------------
-		URL https://github.com/google/googletest/archive/release-1.7.0.zip
-		#--Configure step-------------
-		CMAKE_ARGS
-			${PLATFORM_SPECIFIC_ARGS}
-      -Dgtest_force_shared_crt:BOOL=ON 
-		#--Build step-----------------
-		BUILD_ALWAYS 1
-		INSTALL_COMMAND ""
-	)
-ENDIF()
-
-IF(GMock_DIR)
-  # GMock has been built already
-  FIND_PACKAGE(GMock REQUIRED)
-
-  MESSAGE(STATUS "Using GTest available at: ${GMock_DIR}")
-
-  SET(OpenIGTLink_GMock_DIR "${GMock_DIR}" CACHE INTERNAL "Path to store gmock binaries")
-ELSE()  
-	SET (OpenIGTLink_GMock_DIR "${CMAKE_BINARY_DIR}/Deps/gmock-bin" CACHE INTERNAL "Path to store gmock binaries")
-	ExternalProject_Add(GMock
-		PREFIX "${CMAKE_BINARY_DIR}/Deps/gmock-prefix"
-		SOURCE_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock"
-		BINARY_DIR        "${CMAKE_BINARY_DIR}/Deps/gmock-bin"
-		URL https://github.com/google/googlemock/archive/release-1.7.0.zip
-		#--Configure step-------------
-		CMAKE_ARGS
-			${PLATFORM_SPECIFIC_ARGS}
-      -Dgtest_force_shared_crt:BOOL=ON 
-		#--Build step-----------------
-		BUILD_ALWAYS 1
-		INSTALL_COMMAND ""
-		DEPENDS GTest
-	)
-ENDIF()
diff --git a/Testing/GoogletestDownload.txt.in b/Testing/GoogletestDownload.txt.in
new file mode 100644
index 00000000..481152ff
--- /dev/null
+++ b/Testing/GoogletestDownload.txt.in
@@ -0,0 +1,25 @@
+cmake_minimum_required(VERSION 2.8.2)
+ 
+project(googletest-download NONE)
+include(ExternalProject)
+ExternalProject_Add(googletest
+  URL https://github.com/google/googletest/archive/release-1.7.0.zip
+  #GIT_REPOSITORY    https://github.com/google/googletest.git
+  #GIT_TAG           master
+  SOURCE_DIR        "${PROJECT_BINARY_DIR}/gtest"
+  BINARY_DIR        "${PROJECT_BINARY_DIR}/gtest-build"
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND ""
+  INSTALL_COMMAND   ""
+  TEST_COMMAND      ""
+)
+
+ExternalProject_Add(googlemock
+  URL https://github.com/google/googlemock/archive/release-1.7.0.zip
+  SOURCE_DIR        "${PROJECT_BINARY_DIR}/gmock"
+  BINARY_DIR        "${PROJECT_BINARY_DIR}/gmock-build"
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND ""
+  INSTALL_COMMAND   ""
+  TEST_COMMAND      ""
+)
diff --git a/Testing/igtlVideoMessageTest.cxx b/Testing/igtlVideoMessageTest.cxx
index 00e51a58..dfd046e7 100644
--- a/Testing/igtlVideoMessageTest.cxx
+++ b/Testing/igtlVideoMessageTest.cxx
@@ -53,6 +53,8 @@
   #include "H265Decoder.h"
 #endif
 
+#include "igtlCodecCommonClasses.h"
+#include "igtlOSUtil.h"
 
 int Width = 256;
 int Height = 256;
@@ -98,17 +100,18 @@ int TestWithVersion(int version, GenericEncoder* videoStreamEncoder, GenericDeco
       igtl_int64 i_size = 0;
 #if defined(_WIN32) || defined(_WIN64)
 #if _MSC_VER >= 1400
-      if (!_fseeki64 (pFileYUV, 0, SEEK_END)) {
+      if (!_fseeki64 (pFileYUV, 0, SEEK_END))
+        {
         i_size = _ftelli64 (pFileYUV);
         _fseeki64 (pFileYUV, 0, SEEK_SET);
-        iFrameNumInFile =std::fmax((igtl_int32) (i_size / kiPicResSize), iFrameNumInFile);
-      }
+        iFrameNumInFile = (i_size / kiPicResSize) > iFrameNumInFile ? (i_size / kiPicResSize):iFrameNumInFile;
+        }
 #else
       if (!fseek (pFileYUV, 0, SEEK_END))
         {
         i_size = ftell (pFileYUV);
         fseek (pFileYUV, 0, SEEK_SET);
-        iFrameNumInFile = std::max((igtl_int32) (i_size / kiPicResSize), iFrameNumInFile);
+        iFrameNumInFile = (i_size / kiPicResSize) > iFrameNumInFile ? (i_size / kiPicResSize):iFrameNumInFile;
         }
 #endif
 #else
@@ -116,7 +119,7 @@ int TestWithVersion(int version, GenericEncoder* videoStreamEncoder, GenericDeco
         {
         i_size = ftello (pFileYUV);
         fseek(pFileYUV, 0, SEEK_SET);
-        iFrameNumInFile = std::max((igtl_int32) (i_size / (kiPicResSize)), iFrameNumInFile);
+        iFrameNumInFile = (i_size / kiPicResSize) > iFrameNumInFile ? (i_size / kiPicResSize):iFrameNumInFile;
         }
 #endif
 #if defined(_WIN32) || defined(_WIN64)
diff --git a/appveyor.yml b/appveyor.yml
index 5497e6cc..7998159b 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -5,9 +5,9 @@ os: Visual Studio 2015
 #Google Test is not build correctly for v120 and v110, but the TestConfigure.h file is a workaround solution for the testing 
 environment:
   matrix:
-  - Toolset: v140
-  - Toolset: v120  
   - Toolset: v110
+  - Toolset: v120  
+  - Toolset: v140
   
 platform: 
   - x86
@@ -39,9 +39,9 @@ before_build:
     Write-Output "Platform: $env:PLATFORM"
     $generator = switch ($env:TOOLSET)
     {
-        "v140" {"Visual Studio 14 2015"}
-        "v120" {"Visual Studio 12 2013"}
         "v110" {"Visual Studio 11 2012"}
+        "v120" {"Visual Studio 12 2013"}
+        "v140" {"Visual Studio 14 2015"}
     }
     $generator = "$generator Win64"
 
@@ -73,4 +73,3 @@ build_script:
     if ($LastExitCode -ne 0) {
         throw "Exec: $ErrorMessage"
     }    
-    

From 252c48a0524806ce2ada51ac86cc78b9331c2c07 Mon Sep 17 00:00:00 2001
From: Adam Rankin <adam.rankin@gmail.com>
Date: Thu, 10 Aug 2017 21:24:31 -0400
Subject: [PATCH 12/21] ENH: Enable support for texture coords being accessible
 by type

---
 Source/igtlPolyDataMessage.cxx | 37 ++++++++++++++++++++++++++++------
 Source/igtlPolyDataMessage.h   | 35 ++++++++++++++++++++------------
 2 files changed, 53 insertions(+), 19 deletions(-)

diff --git a/Source/igtlPolyDataMessage.cxx b/Source/igtlPolyDataMessage.cxx
index 879d0bd5..85eb6082 100644
--- a/Source/igtlPolyDataMessage.cxx
+++ b/Source/igtlPolyDataMessage.cxx
@@ -274,11 +274,10 @@ int PolyDataAttribute::SetType(int t, int n)
         this->m_NComponents = n;
         }
       break;
+    case POINT_TCOORDS:
+    case CELL_TCOORDS:
     case POINT_VECTOR:
     case CELL_VECTOR:
-      valid = 1;
-      this->m_NComponents = 3;
-      break;
     case POINT_NORMAL:
     case CELL_NORMAL:
       valid = 1;
@@ -303,7 +302,7 @@ int PolyDataAttribute::SetType(int t, int n)
     unsigned int n = this->m_Size * this->m_NComponents;
     if (n != this->m_Data.size())
       {
-      // TODO: this may cause unnecesasry memory allocation,
+      // TODO: this may cause unnecessary memory allocation,
       // unless m_Size == 0.
       // Memory should be reallocate just before use.
       this->m_Data.resize(n);
@@ -329,7 +328,7 @@ igtlUint32 PolyDataAttribute::SetSize(igtlUint32 size)
   unsigned int n = this->m_Size * this->m_NComponents;
   if (n != this->m_Data.size())
     {
-    // TODO: this may cause unnecesasry memory allocation.
+    // TODO: this may cause unnecessary memory allocation.
     // Memory should be reallocate just before use.
     this->m_Data.resize(n);
     }
@@ -869,7 +868,7 @@ int PolyDataMessage::GetNumberOfAttributes()
   return this->m_Attributes.size();
 }
 
-PolyDataAttribute * PolyDataMessage::GetAttribute(unsigned int id)
+PolyDataAttribute * PolyDataMessage::GetAttribute(AttributeList::size_type id)
 {
   if (id >= this->m_Attributes.size())
     {
@@ -879,6 +878,32 @@ PolyDataAttribute * PolyDataMessage::GetAttribute(unsigned int id)
   return this->m_Attributes[id];
 }
 
+PolyDataAttribute * PolyDataMessage::GetAttribute(const std::string& name)
+{
+  for(AttributeList::size_type i = 0; i < this->m_Attributes.size(); ++i)
+    {
+    if (this->m_Attributes[i]->GetName() == name)
+      {
+        return this->m_Attributes[i];
+      }
+    }
+
+  return NULL;
+}
+
+PolyDataAttribute * PolyDataMessage::GetAttribute(int type)
+{
+  for (AttributeList::size_type i = 0; i < this->m_Attributes.size(); ++i)
+  {
+    if (this->m_Attributes[i]->GetType() == type)
+    {
+      return this->m_Attributes[i];
+    }
+  }
+
+  return NULL;
+}
+
 GetPolyDataMessage::GetPolyDataMessage()
 {
   this->m_SendMessageType  = "GET_POLYDATA";
diff --git a/Source/igtlPolyDataMessage.h b/Source/igtlPolyDataMessage.h
index 6fa2f015..1c78555f 100644
--- a/Source/igtlPolyDataMessage.h
+++ b/Source/igtlPolyDataMessage.h
@@ -246,16 +246,18 @@ class IGTLCommon_EXPORT PolyDataAttribute : public Object {
 
   /// Point and cell types.
   enum {
-    POINT_SCALAR = 0x00,
-    POINT_VECTOR = 0x01,
-    POINT_NORMAL = 0x02,
-    POINT_TENSOR = 0x03,
-    POINT_RGBA   = 0x04,
-    CELL_SCALAR  = 0x10,
-    CELL_VECTOR  = 0x11,
-    CELL_NORMAL  = 0x12,
-    CELL_TENSOR  = 0x13,
-    CELL_RGBA    = 0x14,
+    POINT_SCALAR  = 0x00,
+    POINT_VECTOR  = 0x01,
+    POINT_NORMAL  = 0x02,
+    POINT_TENSOR  = 0x03,
+    POINT_RGBA    = 0x04,
+    POINT_TCOORDS = 0x05,
+    CELL_SCALAR   = 0x10,
+    CELL_VECTOR   = 0x11,
+    CELL_NORMAL   = 0x12,
+    CELL_TENSOR   = 0x13,
+    CELL_RGBA     = 0x14,
+    CELL_TCOORDS  = 0x15
   };
 
  public:
@@ -340,6 +342,8 @@ class IGTLCommon_EXPORT PolyDataAttribute : public Object {
 class IGTLCommon_EXPORT PolyDataMessage: public MessageBase
 {
 public:
+  typedef std::vector<PolyDataAttribute::Pointer> AttributeList;
+
   typedef PolyDataMessage                Self;
   typedef MessageBase                    Superclass;
   typedef SmartPointer<Self>             Pointer;
@@ -393,14 +397,19 @@ class IGTLCommon_EXPORT PolyDataMessage: public MessageBase
   int  GetNumberOfAttributes();
 
   /// Gets an attribute specified by 'id'.
-  PolyDataAttribute * GetAttribute(unsigned int id);
+  PolyDataAttribute * GetAttribute(AttributeList::size_type id);
+
+  /// Gets an attribute specified by 'name'.
+  PolyDataAttribute * GetAttribute(const std::string& name);
+
+  /// Gets an attribute specified by 'type'.
+  PolyDataAttribute * GetAttribute(int type);
  
 protected:
   PolyDataMessage();
   ~PolyDataMessage();
 
 protected:
-
   virtual int  CalculateContentBufferSize();
   virtual int  PackContent();
   virtual int  UnpackContent();
@@ -421,7 +430,7 @@ class IGTLCommon_EXPORT PolyDataMessage: public MessageBase
   PolyDataCellArray::Pointer  m_TriangleStrips;
 
   /// A list of pointers to the attributes.
-  std::vector<PolyDataAttribute::Pointer> m_Attributes;
+  AttributeList m_Attributes;
 
 };
 

From ae5d5442d037df2aad5281013615fe97136e6315 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Thu, 10 Aug 2017 22:22:40 -0400
Subject: [PATCH 13/21] BUG: Fix type error

---
 Source/igtlPolyDataMessage.cxx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Source/igtlPolyDataMessage.cxx b/Source/igtlPolyDataMessage.cxx
index 85eb6082..5433ec01 100644
--- a/Source/igtlPolyDataMessage.cxx
+++ b/Source/igtlPolyDataMessage.cxx
@@ -500,7 +500,7 @@ void IGTLCommon_EXPORT SetPolyDataInfoAttribute(igtl_polydata_info * info, PolyD
   igtl_polydata_attribute * attr = info->attributes;
   for (unsigned int i = 0; i < info->header.nattributes; i ++)
     {
-    PolyDataAttribute * src =  pdm->GetAttribute(i);
+    PolyDataAttribute * src =  pdm->GetAttribute(static_cast<PolyDataMessage::AttributeList::size_type>(i));
     if (src)
       {
       attr->type = src->GetType();

From 230c7520a18925738141cf5be1137a93dba21fac Mon Sep 17 00:00:00 2001
From: Adam Rankin <adam.rankin@gmail.com>
Date: Fri, 11 Aug 2017 00:07:47 -0400
Subject: [PATCH 14/21] ENH: Adding support for C++11 range based for loops for
 polydata message

---
 Source/igtlPolyDataMessage.cxx | 210 ++++++++++++++++++++++++++++++++-
 Source/igtlPolyDataMessage.h   |  73 +++++++++++-
 2 files changed, 278 insertions(+), 5 deletions(-)

diff --git a/Source/igtlPolyDataMessage.cxx b/Source/igtlPolyDataMessage.cxx
index 5433ec01..b0a20386 100644
--- a/Source/igtlPolyDataMessage.cxx
+++ b/Source/igtlPolyDataMessage.cxx
@@ -137,6 +137,75 @@ int PolyDataPointArray::GetPoint(unsigned int id, igtlFloat32 * point)
   return 1;
 }
 
+/// Implement support for C++11 ranged for loops
+std::vector<PolyDataPointArray::Point>::iterator PolyDataPointArray::begin()
+{
+  return m_Data.begin();
+}
+std::vector<PolyDataPointArray::Point>::iterator PolyDataPointArray::end()
+{
+  return m_Data.end();
+}
+std::vector<PolyDataPointArray::Point>::const_iterator PolyDataPointArray::begin() const
+{
+  return m_Data.begin();
+}
+std::vector<PolyDataPointArray::Point>::const_iterator PolyDataPointArray::end() const
+{
+  return m_Data.end();
+}
+
+std::vector<PolyDataPointArray::Point>::reverse_iterator PolyDataPointArray::rbegin()
+{
+  return m_Data.rbegin();
+}
+std::vector<PolyDataPointArray::Point>::reverse_iterator PolyDataPointArray::rend()
+{
+  return m_Data.rend();
+}
+std::vector<PolyDataPointArray::Point>::const_reverse_iterator PolyDataPointArray::rbegin() const
+{
+  return m_Data.rbegin();
+}
+std::vector<PolyDataPointArray::Point>::const_reverse_iterator PolyDataPointArray::rend() const
+{
+  return m_Data.rend();
+}
+
+/// Implement support for C++11 ranged for loops
+std::vector<PolyDataPointArray::Point>::iterator begin(PolyDataPointArray& list)
+{
+  return list.begin();
+}
+std::vector<PolyDataPointArray::Point>::iterator end(PolyDataPointArray& list)
+{
+  return list.end();
+}
+std::vector<PolyDataPointArray::Point>::const_iterator begin(const PolyDataPointArray& list)
+{
+  return list.begin();
+}
+std::vector<PolyDataPointArray::Point>::const_iterator end(const PolyDataPointArray& list)
+{
+  return list.end();
+}
+
+std::vector<PolyDataPointArray::Point>::reverse_iterator rbegin(PolyDataPointArray& list)
+{
+  return list.rbegin();
+}
+std::vector<PolyDataPointArray::Point>::reverse_iterator rend(PolyDataPointArray& list)
+{
+  return list.rend();
+}
+std::vector<PolyDataPointArray::Point>::const_reverse_iterator rbegin(const PolyDataPointArray& list)
+{
+  return list.rbegin();
+}
+std::vector<PolyDataPointArray::Point>::const_reverse_iterator rend(const PolyDataPointArray& list)
+{
+  return list.rend();
+}
 
 // Description:
 // PolyDataCellArray class to pass vertices, lines, polygons, and triangle strips
@@ -172,7 +241,7 @@ void PolyDataCellArray::AddCell(int n, igtlUint32 * cell)
     }
 }
 
-void PolyDataCellArray::AddCell(std::list<igtlUint32> cell)
+void PolyDataCellArray::AddCell(const Cell& cell)
 {
   this->m_Data.push_back(cell);
 }
@@ -238,6 +307,75 @@ int PolyDataCellArray::GetCell(unsigned int id, std::list<igtlUint32>& cell)
   return 1;
 }
 
+/// Implement support for C++11 ranged for loops
+std::vector<PolyDataCellArray::Cell>::iterator PolyDataCellArray::begin()
+{
+  return m_Data.begin();
+}
+std::vector<PolyDataCellArray::Cell>::iterator PolyDataCellArray::end()
+{
+  return m_Data.end();
+}
+std::vector<PolyDataCellArray::Cell>::const_iterator PolyDataCellArray::begin() const
+{
+  return m_Data.begin();
+}
+std::vector<PolyDataCellArray::Cell>::const_iterator PolyDataCellArray::end() const
+{
+  return m_Data.end();
+}
+
+std::vector<PolyDataCellArray::Cell>::reverse_iterator PolyDataCellArray::rbegin()
+{
+  return m_Data.rbegin();
+}
+std::vector<PolyDataCellArray::Cell>::reverse_iterator PolyDataCellArray::rend()
+{
+  return m_Data.rend();
+}
+std::vector<PolyDataCellArray::Cell>::const_reverse_iterator PolyDataCellArray::rbegin() const
+{
+  return m_Data.rbegin();
+}
+std::vector<PolyDataCellArray::Cell>::const_reverse_iterator PolyDataCellArray::rend() const
+{
+  return m_Data.rend();
+}
+
+/// Implement support for C++11 ranged for loops
+std::vector<PolyDataCellArray::Cell>::iterator begin(PolyDataCellArray& list)
+{
+  return list.begin();
+}
+std::vector<PolyDataCellArray::Cell>::iterator end(PolyDataCellArray& list)
+{
+  return list.end();
+}
+std::vector<PolyDataCellArray::Cell>::const_iterator begin(const PolyDataCellArray& list)
+{
+  return list.begin();
+}
+std::vector<PolyDataCellArray::Cell>::const_iterator end(const PolyDataCellArray& list)
+{
+  return list.end();
+}
+
+std::vector<PolyDataCellArray::Cell>::reverse_iterator rbegin(PolyDataCellArray& list)
+{
+  return list.rbegin();
+}
+std::vector<PolyDataCellArray::Cell>::reverse_iterator rend(PolyDataCellArray& list)
+{
+  return list.rend();
+}
+std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rbegin(const PolyDataCellArray& list)
+{
+  return list.rbegin();
+}
+std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rend(const PolyDataCellArray& list)
+{
+  return list.rend();
+}
 
 // Description:
 // Attribute class used for passing attribute data
@@ -417,6 +555,76 @@ int PolyDataAttribute::GetNthData(unsigned int n, igtlFloat32 * data)
   return 1;
 }
 
+/// Implement support for C++11 ranged for loops
+std::vector<igtlFloat32>::iterator PolyDataAttribute::begin()
+{
+  return m_Data.begin();
+}
+std::vector<igtlFloat32>::iterator PolyDataAttribute::end()
+{
+  return m_Data.end();
+}
+std::vector<igtlFloat32>::const_iterator PolyDataAttribute::begin() const
+{
+  return m_Data.begin();
+}
+std::vector<igtlFloat32>::const_iterator PolyDataAttribute::end() const
+{
+  return m_Data.end();
+}
+
+std::vector<igtlFloat32>::reverse_iterator PolyDataAttribute::rbegin()
+{
+  return m_Data.rbegin();
+}
+std::vector<igtlFloat32>::reverse_iterator PolyDataAttribute::rend()
+{
+  return m_Data.rend();
+}
+std::vector<igtlFloat32>::const_reverse_iterator PolyDataAttribute::rbegin() const
+{
+  return m_Data.rbegin();
+}
+std::vector<igtlFloat32>::const_reverse_iterator PolyDataAttribute::rend() const
+{
+  return m_Data.rend();
+}
+
+/// Implement support for C++11 ranged for loops
+std::vector<igtlFloat32>::iterator begin(PolyDataAttribute& list)
+{
+  return list.begin();
+}
+std::vector<igtlFloat32>::iterator end(PolyDataAttribute& list)
+{
+  return list.end();
+}
+std::vector<igtlFloat32>::const_iterator begin(const PolyDataAttribute& list)
+{
+  return list.begin();
+}
+std::vector<igtlFloat32>::const_iterator end(const PolyDataAttribute& list)
+{
+  return list.end();
+}
+
+std::vector<igtlFloat32>::reverse_iterator rbegin(PolyDataAttribute& list)
+{
+  return list.rbegin();
+}
+std::vector<igtlFloat32>::reverse_iterator rend(PolyDataAttribute& list)
+{
+  return list.rend();
+}
+std::vector<igtlFloat32>::const_reverse_iterator rbegin(const PolyDataAttribute& list)
+{
+  return list.rbegin();
+}
+std::vector<igtlFloat32>::const_reverse_iterator rend(const PolyDataAttribute& list)
+{
+  return list.rend();
+}
+
 // Description:
 // PolyDataMessage class implementation
 PolyDataMessage::PolyDataMessage()
diff --git a/Source/igtlPolyDataMessage.h b/Source/igtlPolyDataMessage.h
index 1c78555f..b4ff4472 100644
--- a/Source/igtlPolyDataMessage.h
+++ b/Source/igtlPolyDataMessage.h
@@ -172,16 +172,40 @@ class IGTLCommon_EXPORT PolyDataPointArray : public Object {
   /// Gets the coordinates of the point specified by 'id'
   int  GetPoint(unsigned int id, igtlFloat32 * point);
 
+  /// Implement support for C++11 ranged for loops
+  std::vector<Point>::iterator begin();
+  std::vector<Point>::iterator end();
+  std::vector<Point>::const_iterator begin() const;
+  std::vector<Point>::const_iterator end() const;
+
+  std::vector<Point>::reverse_iterator rbegin();
+  std::vector<Point>::reverse_iterator rend();
+  std::vector<Point>::const_reverse_iterator rbegin() const;
+  std::vector<Point>::const_reverse_iterator rend() const;
+
  private:
   /// A list of the points.
   std::vector< Point > m_Data;
 };
 
+/// Implement support for C++11 ranged for loops
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::iterator begin(PolyDataPointArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::iterator end(PolyDataPointArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_iterator begin(const PolyDataPointArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_iterator end(const PolyDataPointArray& list);
+
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::reverse_iterator rbegin(PolyDataPointArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::reverse_iterator rend(PolyDataPointArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_reverse_iterator rbegin(const PolyDataPointArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_reverse_iterator rend(const PolyDataPointArray& list);
 
 // The PolyDataCellArray class is used to pass vertices, lines, polygons, and triangle strips
 class IGTLCommon_EXPORT PolyDataCellArray : public Object {
   
  public:
+
+   typedef std::list<igtlUint32> Cell;
+
   enum {
     NULL_POINT = 0xFFFFFFFF,
   };
@@ -211,7 +235,7 @@ class IGTLCommon_EXPORT PolyDataCellArray : public Object {
   void       AddCell(int n, igtlUint32 * cell);
 
   /// Adds an array of cells stored in 'cell'.
-  void       AddCell(std::list<igtlUint32> cell);
+  void       AddCell(const Cell& cell);
 
   /// GetTotalSize() returns the total memory size of the cell data array in
   /// POLYDATA message. Cell data array is array of cell data, consisting of
@@ -232,13 +256,34 @@ class IGTLCommon_EXPORT PolyDataCellArray : public Object {
   int        GetCell(unsigned int id, igtlUint32 * cell);
 
   /// Gets the cell specified by the 'id'. A list of points in the cell will be stored in the 'cell'.
-  int        GetCell(unsigned int id, std::list<igtlUint32>& cell);
+  int        GetCell(unsigned int id, Cell& cell);
+
+  /// Implement support for C++11 ranged for loops
+  std::vector<Cell>::iterator begin();
+  std::vector<Cell>::iterator end();
+  std::vector<Cell>::const_iterator begin() const;
+  std::vector<Cell>::const_iterator end() const;
+
+  std::vector<Cell>::reverse_iterator rbegin();
+  std::vector<Cell>::reverse_iterator rend();
+  std::vector<Cell>::const_reverse_iterator rbegin() const;
+  std::vector<Cell>::const_reverse_iterator rend() const;
 
  private:
   /// A lists of the cells. Each cell consists of multiple points. 
-  std::vector< std::list<igtlUint32> > m_Data;
+  std::vector<Cell> m_Data;
 };
 
+/// Implement support for C++11 ranged for loops
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::iterator begin(PolyDataCellArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::iterator end(PolyDataCellArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_iterator begin(const PolyDataCellArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_iterator end(const PolyDataCellArray& list);
+
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::reverse_iterator rbegin(PolyDataCellArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::reverse_iterator rend(PolyDataCellArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rbegin(const PolyDataCellArray& list);
+IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rend(const PolyDataCellArray& list);
 
 /// Attribute class used for passing attribute data.
 class IGTLCommon_EXPORT PolyDataAttribute : public Object {
@@ -318,8 +363,18 @@ class IGTLCommon_EXPORT PolyDataAttribute : public Object {
   /// Gets the Nth data.
   int         GetNthData(unsigned int n, igtlFloat32 * data);
 
- private:
+  /// Implement support for C++11 ranged for loops
+  std::vector<igtlFloat32>::iterator begin();
+  std::vector<igtlFloat32>::iterator end();
+  std::vector<igtlFloat32>::const_iterator begin() const;
+  std::vector<igtlFloat32>::const_iterator end() const;
 
+  std::vector<igtlFloat32>::reverse_iterator rbegin();
+  std::vector<igtlFloat32>::reverse_iterator rend();
+  std::vector<igtlFloat32>::const_reverse_iterator rbegin() const;
+  std::vector<igtlFloat32>::const_reverse_iterator rend() const;
+
+ private:
   /// The attribute type.
   igtlUint8                m_Type;
 
@@ -337,6 +392,16 @@ class IGTLCommon_EXPORT PolyDataAttribute : public Object {
 
 };
 
+/// Implement support for C++11 ranged for loops
+IGTLCommon_EXPORT std::vector<igtlFloat32>::iterator begin(PolyDataAttribute& list);
+IGTLCommon_EXPORT std::vector<igtlFloat32>::iterator end(PolyDataAttribute& list);
+IGTLCommon_EXPORT std::vector<igtlFloat32>::const_iterator begin(const PolyDataAttribute& list);
+IGTLCommon_EXPORT std::vector<igtlFloat32>::const_iterator end(const PolyDataAttribute& list);
+
+IGTLCommon_EXPORT std::vector<igtlFloat32>::reverse_iterator rbegin(PolyDataAttribute& list);
+IGTLCommon_EXPORT std::vector<igtlFloat32>::reverse_iterator rend(PolyDataAttribute& list);
+IGTLCommon_EXPORT std::vector<igtlFloat32>::const_reverse_iterator rbegin(const PolyDataAttribute& list);
+IGTLCommon_EXPORT std::vector<igtlFloat32>::const_reverse_iterator rend(const PolyDataAttribute& list);
 
 /// A class for the POLYDATA message type.
 class IGTLCommon_EXPORT PolyDataMessage: public MessageBase

From 40161b3dcce8851b818ece8b01dead992e2725fd Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 11 Aug 2017 09:20:13 -0400
Subject: [PATCH 15/21] EHN: Example for poly data modified regarding the new
 API

---
 Examples/PolyData/PolyDataClient.cxx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Examples/PolyData/PolyDataClient.cxx b/Examples/PolyData/PolyDataClient.cxx
index a74f3bc4..ddaec68c 100644
--- a/Examples/PolyData/PolyDataClient.cxx
+++ b/Examples/PolyData/PolyDataClient.cxx
@@ -233,7 +233,7 @@ int ReceivePolyData(igtl::ClientSocket::Pointer& socket, igtl::MessageHeader::Po
     for (unsigned int i = 0; i < nAttr; i ++)
       {
       std::cerr << "  ------ Attributes #" << i << " ------" << std::endl;
-      igtl::PolyDataAttribute * p = PolyData->GetAttribute(i);
+      igtl::PolyDataAttribute * p = PolyData->GetAttribute(static_cast<igtl::PolyDataMessage::AttributeList::size_type>(i));
       if (p)
         {
         std::cerr << "  Name = " << p->GetName() << std::endl;

From 009e4fdf8b59fe0831fdd0e65245f58e8c83f1f1 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 11 Aug 2017 09:26:54 -0400
Subject: [PATCH 16/21] EHN: 1. Merge the poly data message commits. 2.
 OpenH264 link modified

---
 CMakeLists.txt                             |  8 +-------
 Source/VideoStreaming/H264Decoder.cxx      |  5 -----
 Source/VideoStreaming/H264Encoder.cxx      | 13 -------------
 Source/VideoStreaming/H264Encoder.h        |  3 ---
 Source/VideoStreaming/VideoStreaming.cmake | 12 +++++-------
 SuperBuild/External_openh264.cmake         |  2 +-
 SuperBuild/findOpenH264.cmake              |  4 ++--
 7 files changed, 9 insertions(+), 38 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b290b018..68e3fd12 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,12 +39,6 @@ SET(OpenIGTLink_LINK_VP9 "0")
 SET(OpenIGTLink_LINK_X265 "0")
 SET(OpenIGTLink_LINK_OPENHEVC "0")
 
-#SET(H264_LIBRARY_DIR "" CACHE PATH "H264 library directory")
-#MARK_AS_ADVANCED(H264_LIBRARY_DIR)
-#SET(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory")  
-#MARK_AS_ADVANCED(VP9_SOURCE_DIR) 
-#SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")  
-#MARK_AS_ADVANCED(VP9_LIBRARY_DIR) 
 IF(BUILD_VIDEOSTREAM)
   IF(USE_H264)
 		SET(OpenIGTLink_LINK_H264 "1")     
@@ -197,7 +191,7 @@ ENDIF()
 # Run superbuild script instead of library script
 IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
   #MESSAGE ("Cmake version is not less than 3.4, super build available")
-	OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." ON)
+	OPTION(OpenIGTLink_SUPERBUILD "Superbuild or not." OFF)
 	IF(OpenIGTLink_SUPERBUILD)
 		INCLUDE(SuperBuild/Superbuild.cmake)
 		RETURN()
diff --git a/Source/VideoStreaming/H264Decoder.cxx b/Source/VideoStreaming/H264Decoder.cxx
index 4c4c8e1b..80b2957a 100644
--- a/Source/VideoStreaming/H264Decoder.cxx
+++ b/Source/VideoStreaming/H264Decoder.cxx
@@ -167,7 +167,6 @@ int H264Decoder::DecodeBitStreamIntoFrame(unsigned char* kpH264BitStream,igtl_ui
   unsigned char uiStartCode[4] = {0, 0, 0, 1};
   
   unsigned char* pData[3] = {NULL};
-  //unsigned char* pDst[3] = {NULL};
   SBufferInfo sDstBufInfo;
   
   igtl_int32 iBufPos = 0;
@@ -266,10 +265,6 @@ int H264Decoder::DecodeBitStreamIntoFrame(unsigned char* kpH264BitStream,igtl_ui
     if (iFrameCount)
       {
       dElapsed = iTotal / 1e6;
-      //fprintf (stderr, "-------------------------------------------------------\n");
-      //fprintf (stderr, "iWidth:\t\t%d\nheight:\t\t%d\nFrames:\t\t%d\ndecode time:\t%f sec\nFPS:\t\t%f fps\n",
-      //iWidth, iHeight, ++iFrameCountTotal, dElapsed, (iFrameCount * 1.0) / dElapsed);
-      //fprintf (stderr, "-------------------------------------------------------\n");
       }
     iBufPos += iSliceSize;
     ++ iSliceIndex;
diff --git a/Source/VideoStreaming/H264Encoder.cxx b/Source/VideoStreaming/H264Encoder.cxx
index 04e5a8d7..9601169f 100644
--- a/Source/VideoStreaming/H264Encoder.cxx
+++ b/Source/VideoStreaming/H264Encoder.cxx
@@ -68,13 +68,6 @@ int     g_iEncodedFrame  = 0;
 #define printf(...) LOGI(__VA_ARGS__)
 #define fprintf(a, ...) LOGI(__VA_ARGS__)
 #endif
-//#define STICK_STREAM_SIZE
-
-//#include "measure_time.h"
-
-
-//#include "typedefs.h"
-//#include "read_config.h"
 
 #ifdef _MSC_VER
 #include <io.h>     /* _setmode() */
@@ -83,12 +76,6 @@ int     g_iEncodedFrame  = 0;
 
 #include "codec_def.h"
 #include "codec_api.h"
-//#include "extern.h"
-//#include "macros.h"
-//#include "wels_const.h"
-
-//#include "mt_defs.h"
-//#include "WelsThreadLib.h"
 
 #ifdef _WIN32
 #ifdef WINAPI_FAMILY
diff --git a/Source/VideoStreaming/H264Encoder.h b/Source/VideoStreaming/H264Encoder.h
index 59645a8c..a8cab5df 100644
--- a/Source/VideoStreaming/H264Encoder.h
+++ b/Source/VideoStreaming/H264Encoder.h
@@ -62,7 +62,6 @@
 #include <iostream>
 
 #include "igtlCodecCommonClasses.h"
-//#include "sha1.h"
 #include "igtl_header.h"
 #include "igtl_video.h"
 #include "igtlOSUtil.h"
@@ -71,8 +70,6 @@
 #include "igtlTimeStamp.h"
 #include "codec_def.h"
 #include "codec_app_def.h"
-//#include "read_config.h"
-//#include "wels_const.h"
 
 #define MAX_DEPENDENCY_LAYER 4
 #define MAX_THREADS_NUM 4
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index 5aabe91b..1b34335b 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -26,7 +26,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
   ENDIF()
   IF(USE_H264)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_openh264.cmake)
-  	IF(NOT ${OpenH264_INCLUDE_DIR} STREQUAL "")
+  	IF(NOT ${OpenH264_DIR} STREQUAL "")
 			LIST(APPEND OpenIGTLink_SOURCES
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.cxx
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.cxx
@@ -37,11 +37,9 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
 					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.h)
 			ENDIF()
 			LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${OpenH264_INCLUDE_DIR}
+    		${OpenH264_DIR}
+    		${OpenH264_DIR}/codec/api/svc
     	)
-			LIST(APPEND LINK_LIBS
-				${OpenH264_LIBRARY}
-			)
 		ELSE()
 			MESSAGE("H264_LIBRARY no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
 		ENDIF()
@@ -118,7 +116,7 @@ ENDIF()
 IF(WIN32) # for Windows
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
-    	${H264_LIBRARY_DIR}/lib/openh264.lib
+    	${OpenH264_DIR}/openh264.lib
     )
 	ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
@@ -138,7 +136,7 @@ IF(WIN32) # for Windows
 ELSE() # for POSIX-compatible OSs
 	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
-		  ${H264_LIBRARY_DIR}/lib/libopenh264.a
+		  ${OpenH264_DIR}/libopenh264.a
 		)
 	ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
diff --git a/SuperBuild/External_openh264.cmake b/SuperBuild/External_openh264.cmake
index f69bff48..1677fbc1 100644
--- a/SuperBuild/External_openh264.cmake
+++ b/SuperBuild/External_openh264.cmake
@@ -9,7 +9,7 @@ IF(OpenH264_FOUND)
 ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
   MESSAGE(STATUS "Downloading openh264 from https://github.com/cisco/openh264.git.")  
-  SET (OpenH264_DIR "${CMAKE_BINARY_DIR}/Deps/openh264-bin" CACHE PATH "H264 source directory" FORCE)
+  SET (OpenH264_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 source directory" FORCE)
   if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")     
 		ExternalProject_Add(OpenH264
 			PREFIX "${CMAKE_BINARY_DIR}/Deps/openh264-prefix"
diff --git a/SuperBuild/findOpenH264.cmake b/SuperBuild/findOpenH264.cmake
index 0b4118d3..2eef8a68 100644
--- a/SuperBuild/findOpenH264.cmake
+++ b/SuperBuild/findOpenH264.cmake
@@ -20,12 +20,12 @@ endif (UNIX AND NOT ANDROID)
 
 SET( OpenH264_PATH_HINTS 
 		${OpenH264_ROOT} 
-    ${CMAKE_BINARY_DIR}/Deps/openh264-bin
+    ${CMAKE_BINARY_DIR}/Deps/openh264
     )
 
 set(OpenH264_DIR "")    
 find_path(OpenH264_DIR NAMES codec_api.h codec_app_def.h codec_def.h openh264${CMAKE_STATIC_LIBRARY_SUFFIX} libopenh264.a
-	PATH_SUFFIXES include/wels lib
+	PATH_SUFFIXES include/wels lib codec/api/svc
 	HINTS ${OpenH264_PATH_HINTS}
 	)
 

From a9b0780ce405b1485c46c2980fec58271c0db25d Mon Sep 17 00:00:00 2001
From: Adam Rankin <adam.rankin@gmail.com>
Date: Fri, 11 Aug 2017 10:04:31 -0400
Subject: [PATCH 17/21] Adding C++ range for macros to clean up the code and to
 increase reusability

---
 Source/igtlMacro.h             |  47 +++++++++++
 Source/igtlPolyDataMessage.cxx | 138 +--------------------------------
 Source/igtlPolyDataMessage.h   |  41 +---------
 3 files changed, 53 insertions(+), 173 deletions(-)

diff --git a/Source/igtlMacro.h b/Source/igtlMacro.h
index eb95a62e..4e1a58d2 100644
--- a/Source/igtlMacro.h
+++ b/Source/igtlMacro.h
@@ -949,5 +949,52 @@ class OStringStream: public std::ostrstream
 #endif
 // end of Template Meta Programming helper macros
 
+//namespace igtl
+//{
+///**
+// * The following is used as a convenience macro to define the
+// * functions required for C++ range based for loops */
+//} // end namespace igtl
+
+///**
+// * The following is used as a convenience macro to define the
+// * functions required for C++ range based for loops */
+#define igtlRangeBasedForHeaderMemberMacro(varType) \
+  varType::iterator begin(); \
+  varType::iterator end(); \
+  varType::const_iterator begin() const; \
+  varType::const_iterator end() const; \
+  varType::reverse_iterator rbegin(); \
+  varType::reverse_iterator rend(); \
+  varType::const_reverse_iterator rbegin() const; \
+  varType::const_reverse_iterator rend() const;
+
+#define igtlRangeBasedForHeaderExternalMacro(classType, varType, exportDecl) \
+  exportDecl varType::iterator begin(classType& list); \
+  exportDecl varType::iterator end(classType& list); \
+  exportDecl varType::const_iterator begin(const classType& list); \
+  exportDecl varType::const_iterator end(const classType& list); \
+  exportDecl varType::reverse_iterator rbegin(classType& list); \
+  exportDecl varType::reverse_iterator rend(classType& list); \
+  exportDecl varType::const_reverse_iterator rbegin(const classType& list); \
+  exportDecl varType::const_reverse_iterator rend(const classType& list);
+
+#define igtlRangeBasedForBodyMacro(classType, varType, memberVar) \
+  varType::iterator classType::begin() { return memberVar.begin(); } \
+  varType::iterator classType::end() { return memberVar.end(); } \
+  varType::const_iterator classType::begin() const { return memberVar.begin(); } \
+  varType::const_iterator classType::end() const { return memberVar.end(); } \
+  varType::reverse_iterator classType::rbegin() { return memberVar.rbegin(); } \
+  varType::reverse_iterator classType::rend() { return memberVar.rend(); } \
+  varType::const_reverse_iterator classType::rbegin() const { return memberVar.rbegin(); } \
+  varType::const_reverse_iterator classType::rend() const { return memberVar.rend(); } \
+  varType::iterator begin(classType& list) { return list.begin(); } \
+  varType::iterator end(classType& list) { return list.end(); } \
+  varType::const_iterator begin(const classType& list) { return list.begin(); } \
+  varType::const_iterator end(const classType& list) { return list.end(); } \
+  varType::reverse_iterator rbegin(classType& list) { return list.rbegin(); } \
+  varType::reverse_iterator rend(classType& list) { return list.rend(); } \
+  varType::const_reverse_iterator rbegin(const classType& list) { return list.rbegin(); } \
+  varType::const_reverse_iterator rend(const classType& list) { return list.rend(); }
 
 #endif //end of igtlMacro.h
diff --git a/Source/igtlPolyDataMessage.cxx b/Source/igtlPolyDataMessage.cxx
index b0a20386..f377a260 100644
--- a/Source/igtlPolyDataMessage.cxx
+++ b/Source/igtlPolyDataMessage.cxx
@@ -138,74 +138,7 @@ int PolyDataPointArray::GetPoint(unsigned int id, igtlFloat32 * point)
 }
 
 /// Implement support for C++11 ranged for loops
-std::vector<PolyDataPointArray::Point>::iterator PolyDataPointArray::begin()
-{
-  return m_Data.begin();
-}
-std::vector<PolyDataPointArray::Point>::iterator PolyDataPointArray::end()
-{
-  return m_Data.end();
-}
-std::vector<PolyDataPointArray::Point>::const_iterator PolyDataPointArray::begin() const
-{
-  return m_Data.begin();
-}
-std::vector<PolyDataPointArray::Point>::const_iterator PolyDataPointArray::end() const
-{
-  return m_Data.end();
-}
-
-std::vector<PolyDataPointArray::Point>::reverse_iterator PolyDataPointArray::rbegin()
-{
-  return m_Data.rbegin();
-}
-std::vector<PolyDataPointArray::Point>::reverse_iterator PolyDataPointArray::rend()
-{
-  return m_Data.rend();
-}
-std::vector<PolyDataPointArray::Point>::const_reverse_iterator PolyDataPointArray::rbegin() const
-{
-  return m_Data.rbegin();
-}
-std::vector<PolyDataPointArray::Point>::const_reverse_iterator PolyDataPointArray::rend() const
-{
-  return m_Data.rend();
-}
-
-/// Implement support for C++11 ranged for loops
-std::vector<PolyDataPointArray::Point>::iterator begin(PolyDataPointArray& list)
-{
-  return list.begin();
-}
-std::vector<PolyDataPointArray::Point>::iterator end(PolyDataPointArray& list)
-{
-  return list.end();
-}
-std::vector<PolyDataPointArray::Point>::const_iterator begin(const PolyDataPointArray& list)
-{
-  return list.begin();
-}
-std::vector<PolyDataPointArray::Point>::const_iterator end(const PolyDataPointArray& list)
-{
-  return list.end();
-}
-
-std::vector<PolyDataPointArray::Point>::reverse_iterator rbegin(PolyDataPointArray& list)
-{
-  return list.rbegin();
-}
-std::vector<PolyDataPointArray::Point>::reverse_iterator rend(PolyDataPointArray& list)
-{
-  return list.rend();
-}
-std::vector<PolyDataPointArray::Point>::const_reverse_iterator rbegin(const PolyDataPointArray& list)
-{
-  return list.rbegin();
-}
-std::vector<PolyDataPointArray::Point>::const_reverse_iterator rend(const PolyDataPointArray& list)
-{
-  return list.rend();
-}
+igtlRangeBasedForBodyMacro(PolyDataPointArray, std::vector<PolyDataPointArray::Point>, m_Data);
 
 // Description:
 // PolyDataCellArray class to pass vertices, lines, polygons, and triangle strips
@@ -308,74 +241,7 @@ int PolyDataCellArray::GetCell(unsigned int id, std::list<igtlUint32>& cell)
 }
 
 /// Implement support for C++11 ranged for loops
-std::vector<PolyDataCellArray::Cell>::iterator PolyDataCellArray::begin()
-{
-  return m_Data.begin();
-}
-std::vector<PolyDataCellArray::Cell>::iterator PolyDataCellArray::end()
-{
-  return m_Data.end();
-}
-std::vector<PolyDataCellArray::Cell>::const_iterator PolyDataCellArray::begin() const
-{
-  return m_Data.begin();
-}
-std::vector<PolyDataCellArray::Cell>::const_iterator PolyDataCellArray::end() const
-{
-  return m_Data.end();
-}
-
-std::vector<PolyDataCellArray::Cell>::reverse_iterator PolyDataCellArray::rbegin()
-{
-  return m_Data.rbegin();
-}
-std::vector<PolyDataCellArray::Cell>::reverse_iterator PolyDataCellArray::rend()
-{
-  return m_Data.rend();
-}
-std::vector<PolyDataCellArray::Cell>::const_reverse_iterator PolyDataCellArray::rbegin() const
-{
-  return m_Data.rbegin();
-}
-std::vector<PolyDataCellArray::Cell>::const_reverse_iterator PolyDataCellArray::rend() const
-{
-  return m_Data.rend();
-}
-
-/// Implement support for C++11 ranged for loops
-std::vector<PolyDataCellArray::Cell>::iterator begin(PolyDataCellArray& list)
-{
-  return list.begin();
-}
-std::vector<PolyDataCellArray::Cell>::iterator end(PolyDataCellArray& list)
-{
-  return list.end();
-}
-std::vector<PolyDataCellArray::Cell>::const_iterator begin(const PolyDataCellArray& list)
-{
-  return list.begin();
-}
-std::vector<PolyDataCellArray::Cell>::const_iterator end(const PolyDataCellArray& list)
-{
-  return list.end();
-}
-
-std::vector<PolyDataCellArray::Cell>::reverse_iterator rbegin(PolyDataCellArray& list)
-{
-  return list.rbegin();
-}
-std::vector<PolyDataCellArray::Cell>::reverse_iterator rend(PolyDataCellArray& list)
-{
-  return list.rend();
-}
-std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rbegin(const PolyDataCellArray& list)
-{
-  return list.rbegin();
-}
-std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rend(const PolyDataCellArray& list)
-{
-  return list.rend();
-}
+igtlRangeBasedForBodyMacro(PolyDataCellArray, std::vector<PolyDataCellArray::Cell>, m_Data);
 
 // Description:
 // Attribute class used for passing attribute data
diff --git a/Source/igtlPolyDataMessage.h b/Source/igtlPolyDataMessage.h
index b4ff4472..0786cfb3 100644
--- a/Source/igtlPolyDataMessage.h
+++ b/Source/igtlPolyDataMessage.h
@@ -173,31 +173,14 @@ class IGTLCommon_EXPORT PolyDataPointArray : public Object {
   int  GetPoint(unsigned int id, igtlFloat32 * point);
 
   /// Implement support for C++11 ranged for loops
-  std::vector<Point>::iterator begin();
-  std::vector<Point>::iterator end();
-  std::vector<Point>::const_iterator begin() const;
-  std::vector<Point>::const_iterator end() const;
-
-  std::vector<Point>::reverse_iterator rbegin();
-  std::vector<Point>::reverse_iterator rend();
-  std::vector<Point>::const_reverse_iterator rbegin() const;
-  std::vector<Point>::const_reverse_iterator rend() const;
+  igtlRangeBasedForHeaderMemberMacro(std::vector<Point>);
 
  private:
   /// A list of the points.
   std::vector< Point > m_Data;
 };
 
-/// Implement support for C++11 ranged for loops
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::iterator begin(PolyDataPointArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::iterator end(PolyDataPointArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_iterator begin(const PolyDataPointArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_iterator end(const PolyDataPointArray& list);
-
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::reverse_iterator rbegin(PolyDataPointArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::reverse_iterator rend(PolyDataPointArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_reverse_iterator rbegin(const PolyDataPointArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataPointArray::Point>::const_reverse_iterator rend(const PolyDataPointArray& list);
+igtlRangeBasedForHeaderExternalMacro(PolyDataPointArray, std::vector<PolyDataPointArray::Point>, IGTLCommon_EXPORT);
 
 // The PolyDataCellArray class is used to pass vertices, lines, polygons, and triangle strips
 class IGTLCommon_EXPORT PolyDataCellArray : public Object {
@@ -259,15 +242,7 @@ class IGTLCommon_EXPORT PolyDataCellArray : public Object {
   int        GetCell(unsigned int id, Cell& cell);
 
   /// Implement support for C++11 ranged for loops
-  std::vector<Cell>::iterator begin();
-  std::vector<Cell>::iterator end();
-  std::vector<Cell>::const_iterator begin() const;
-  std::vector<Cell>::const_iterator end() const;
-
-  std::vector<Cell>::reverse_iterator rbegin();
-  std::vector<Cell>::reverse_iterator rend();
-  std::vector<Cell>::const_reverse_iterator rbegin() const;
-  std::vector<Cell>::const_reverse_iterator rend() const;
+  igtlRangeBasedForHeaderMemberMacro(std::vector<Cell>);
 
  private:
   /// A lists of the cells. Each cell consists of multiple points. 
@@ -275,15 +250,7 @@ class IGTLCommon_EXPORT PolyDataCellArray : public Object {
 };
 
 /// Implement support for C++11 ranged for loops
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::iterator begin(PolyDataCellArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::iterator end(PolyDataCellArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_iterator begin(const PolyDataCellArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_iterator end(const PolyDataCellArray& list);
-
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::reverse_iterator rbegin(PolyDataCellArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::reverse_iterator rend(PolyDataCellArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rbegin(const PolyDataCellArray& list);
-IGTLCommon_EXPORT std::vector<PolyDataCellArray::Cell>::const_reverse_iterator rend(const PolyDataCellArray& list);
+igtlRangeBasedForHeaderExternalMacro(PolyDataCellArray, std::vector<PolyDataCellArray::Cell>, IGTLCommon_EXPORT);
 
 /// Attribute class used for passing attribute data.
 class IGTLCommon_EXPORT PolyDataAttribute : public Object {

From 9bd56195a2e4706e428190c7f85a47e74d550b0e Mon Sep 17 00:00:00 2001
From: Adam Rankin <adam.rankin@gmail.com>
Date: Fri, 11 Aug 2017 10:16:01 -0400
Subject: [PATCH 18/21] Adding additional attribute data accessor

---
 Source/igtlPolyDataMessage.cxx | 19 +++++++++++++++++++
 Source/igtlPolyDataMessage.h   |  3 +++
 2 files changed, 22 insertions(+)

diff --git a/Source/igtlPolyDataMessage.cxx b/Source/igtlPolyDataMessage.cxx
index f377a260..ddf48854 100644
--- a/Source/igtlPolyDataMessage.cxx
+++ b/Source/igtlPolyDataMessage.cxx
@@ -421,6 +421,25 @@ int PolyDataAttribute::GetNthData(unsigned int n, igtlFloat32 * data)
   return 1;
 }
 
+int PolyDataAttribute::GetNthData(unsigned int n, std::vector<igtlFloat32>& data)
+{
+  if (n >= this->m_Size)
+    {
+    return 0;
+    }
+
+  data.clear();
+  std::vector<igtlFloat32>::iterator iter;
+  iter = this->m_Data.begin() + n*this->m_NComponents;
+  for (unsigned int i = 0; i < this->m_NComponents; i++)
+    {
+    data.push_back(*iter);
+    iter++;
+    }
+
+  return 1;
+}
+
 /// Implement support for C++11 ranged for loops
 std::vector<igtlFloat32>::iterator PolyDataAttribute::begin()
 {
diff --git a/Source/igtlPolyDataMessage.h b/Source/igtlPolyDataMessage.h
index 0786cfb3..acc1cc1b 100644
--- a/Source/igtlPolyDataMessage.h
+++ b/Source/igtlPolyDataMessage.h
@@ -330,6 +330,9 @@ class IGTLCommon_EXPORT PolyDataAttribute : public Object {
   /// Gets the Nth data.
   int         GetNthData(unsigned int n, igtlFloat32 * data);
 
+  /// Gets the Nth data.
+  int         GetNthData(unsigned int n, std::vector<igtlFloat32>& data);
+
   /// Implement support for C++11 ranged for loops
   std::vector<igtlFloat32>::iterator begin();
   std::vector<igtlFloat32>::iterator end();

From 517049952752b06209826cdf21324ef0972d957b Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Thu, 24 Aug 2017 16:30:32 -0400
Subject: [PATCH 19/21] EHN: add VP9 as imported library in progress

---
 Source/VideoStreaming/VideoStreaming.cmake |  3 +-
 SuperBuild/External_VP9.cmake              | 19 +-------
 SuperBuild/findVP9.cmake                   | 53 ++++++++++++++--------
 3 files changed, 37 insertions(+), 38 deletions(-)

diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index 1b34335b..e1508f09 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -121,9 +121,8 @@ IF(WIN32) # for Windows
 	ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
     #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
-    SET(LINK_VP9_LIBRARY optimized ${VP9_LIBRARY_DIR}\\$(Platform)\\Release\\vpxmd.lib debug ${VP9_LIBRARY_DIR}\\$(Platform)\\Debug\\vpxmdd.lib)
     LIST(APPEND LINK_LIBS
-      ${LINK_VP9_LIBRARY}
+      VP9_lib
     )
   ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_X265)
diff --git a/SuperBuild/External_VP9.cmake b/SuperBuild/External_VP9.cmake
index 713cfe41..e4f8a249 100644
--- a/SuperBuild/External_VP9.cmake
+++ b/SuperBuild/External_VP9.cmake
@@ -8,9 +8,9 @@ IF(VP9_FOUND)
 ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
   MESSAGE(STATUS "Downloading VP9 from https://github.com/webmproject/libvpx.git")              
-	SET (VP9_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
-  SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 library directory" FORCE)   							
 	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
+    SET (VP9_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
+    SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 library directory" FORCE)   							
     ExternalProject_Add(VP9
     	PREFIX "${CMAKE_BINARY_DIR}/Deps/VP9-prefix"
       GIT_REPOSITORY https://github.com/webmproject/libvpx/
@@ -24,20 +24,5 @@ ELSE()
       TEST_COMMAND      ""
       DEPENDS YASM
     )
-  else()
-    # ToDo: if it is a window os platform, make the build successful
-    ExternalProject_Add(VP9
-    	PREFIX "${CMAKE_BINARY_DIR}/Deps/VP9-prefix"
-      GIT_REPOSITORY https://github.com/webmproject/libvpx/
-      GIT_TAG master
-      SOURCE_DIR        "${VP9_SOURCE_DIR}"
-      BINARY_DIR        "${VP9_LIBRARY_DIR}"
-      CONFIGURE_COMMAND ""
-      BUILD_ALWAYS 1
-      BUILD_COMMAND     ""
-      INSTALL_COMMAND   ""
-      TEST_COMMAND      ""
-      DEPENDS YASM
-    )
   endif()
 ENDIF()
diff --git a/SuperBuild/findVP9.cmake b/SuperBuild/findVP9.cmake
index c316e5b9..1b97447a 100644
--- a/SuperBuild/findVP9.cmake
+++ b/SuperBuild/findVP9.cmake
@@ -7,24 +7,39 @@
 #  VP9_INCLUDE_DIR - the VP9 include directory
 #  VP9_LIBRARY_DIR - VP9 library directory
 
-SET( VP9_PATH_HINTS 
-		${VP9_ROOT} 
-    ${CMAKE_BINARY_DIR}/Deps/VP9
-    ${CMAKE_BINARY_DIR}/Deps/VP9-bin
+if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
+  SET( VP9_PATH_HINTS 
+      ${VP9_ROOT} 
+      ${CMAKE_BINARY_DIR}/Deps/VP9
+      ${CMAKE_BINARY_DIR}/Deps/VP9-bin
+      )
+  set(VP9_INCLUDE_DIR "")
+  find_path(VP9_INCLUDE_DIR NAMES vp8cx.h vpx_image.h 
+    PATH_SUFFIXES vpx
+    HINTS ${VP9_PATH_HINTS} 
     )
-set(VP9_INCLUDE_DIR "")
-find_path(VP9_INCLUDE_DIR NAMES vp8cx.h vpx_image.h 
-	PATH_SUFFIXES vpx
-	HINTS ${VP9_PATH_HINTS} 
-	)
-	
-set(VP9_LIBRARY_DIR "")
-find_path(VP9_LIBRARY_DIR
-	 NAMES vpxmdd.lib vpxmd.lib libvpx.a
-	 PATH_SUFFIXES $(Platform)/${CMAKE_BUILD_TYPE}
-	 HINTS ${VP9_PATH_HINTS}
-	 )
-include(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(VP9 REQUIRED_VARS VP9_LIBRARY_DIR VP9_INCLUDE_DIR)
+    
+  set(VP9_LIBRARY_DIR "")
+  find_path(VP9_LIBRARY_DIR
+     NAMES libvpx.a
+     PATH_SUFFIXES ${Platform}/${CMAKE_BUILD_TYPE}
+     HINTS ${VP9_PATH_HINTS}
+     )
+  include(FindPackageHandleStandardArgs)
+  FIND_PACKAGE_HANDLE_STANDARD_ARGS(VP9 REQUIRED_VARS VP9_LIBRARY_DIR VP9_INCLUDE_DIR)
 
-mark_as_advanced(VP9_INCLUDE_DIR VP9_LIBRARY_DIR)
+  mark_as_advanced(VP9_INCLUDE_DIR VP9_LIBRARY_DIR)
+else()
+  SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")
+  #SET(VP9 "")
+  find_library(VP9_lib vpxmd.lib  
+     HINTS ${VP9_LIBRARY_DIR}/Win32/Release
+     )
+  if(NOT VP9_lib)
+    MESSAGE(FATAL_ERROR "VP9 library not found, specify the library path")
+  else()
+    add_library(VP9_lib STATIC IMPORTED GLOBAL)
+    set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_RELEASE ${VP9_LIBRARY_DIR}/Win32/Release/vpxmd.lib)
+    set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_DEBUG ${VP9_LIBRARY_DIR}/Win32/Debug/vpxmdd.lib)
+  endif()
+endif()

From c20f6030c9aaa285db2d65dd13dc6da5dd177053 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 25 Aug 2017 15:54:43 -0400
Subject: [PATCH 20/21] EHN: Link openhevc to the forked repository, windows
 support of x265 improved

---
 Source/CMakeLists.txt                      |  2 +-
 Source/VideoStreaming/VideoStreaming.cmake | 27 +++++++++++++++++-----
 SuperBuild/External_openHEVC.cmake         |  6 ++---
 SuperBuild/External_x265.cmake             |  8 +++----
 SuperBuild/External_yasm.cmake             |  4 ++++
 SuperBuild/Superbuild.cmake                | 20 +++++++++++-----
 SuperBuild/findVP9.cmake                   | 21 +++++++++++++----
 7 files changed, 64 insertions(+), 24 deletions(-)

diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 6a35d51e..f09f5b66 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -259,7 +259,7 @@ IF (NOT (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4))
   		add_dependencies(OpenIGTLink X265)
   	ENDIF()
   	IF(USE_OPENHEVC)
-  		add_dependencies(OpenIGTLink openHEVC)
+  		add_dependencies(OpenIGTLink OpenHEVC)
   	ENDIF()
 	ENDIF()
 	IF(BUILD_WEBSOCKET)
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index e1508f09..10bedabb 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -45,16 +45,24 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
 		ENDIF()
 	ENDIF()
 	
-	IF(USE_OPENHEVC OR USE_X265 OR USE_VP9)
+	IF(USE_OPENHEVC OR USE_X265)
   	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
-  	LIST(APPEND OpenIGTLink_DEPENDENCIES yasm)
+  	LIST(APPEND OpenIGTLink_DEPENDENCIES YASM)
   ENDIF()	
-	
+	IF(USE_VP9)
+		#For windows build, we don't build the library in openigtlink, but import it directly
+    #So dependecicy on YASM is not necessary in openigtlink
+  	IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
+  		INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
+      LIST(APPEND OpenIGTLink_DEPENDENCIES YASM) 
+    ENDIF()
+  ENDIF()  
+  
   IF(USE_VP9)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_VP9.cmake)
   	IF(EXISTS ${VP9_LIBRARY_DIR})
   		LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${VP9_SOURCE_DIR}
+    		${VP9_INCLUDE_DIR}
     		${VP9_LIBRARY_DIR}
     	)
 			LIST(APPEND OpenIGTLink_SOURCES
@@ -73,7 +81,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
     		LINK_DIRECTORIES("${VP9_LIBRARY_DIR}/lib")
 			ENDIF()	
 		ELSE()
-			MESSAGE("VP9_SOURCE_DIR or VP9_LIBRARY_DIR no found")
+			MESSAGE("VP9_INCLUDE_DIR or VP9_LIBRARY_DIR no found")
 		ENDIF()
   ENDIF()
 
@@ -127,11 +135,18 @@ IF(WIN32) # for Windows
   ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_X265)
     #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
-    SET(LINK_X265_LIBRARY ${X265_LIBRARY_DIR}\\${CMAKE_BUILD_TYPE}\\x265-static.lib)
+    SET(LINK_X265_LIBRARY optimized ${X265_LIBRARY_DIR}\\Release\\x265-static.lib debug ${X265_LIBRARY_DIR}\\Debug\\x265-static.lib)
     LIST(APPEND LINK_LIBS
       ${LINK_X265_LIBRARY}
     )
   ENDIF()
+  IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_OPENHEVC)
+    #To do, library name depends on the compiler setting, could be vpxmt.lib and vpxmtd also. Make sure the setting matches.
+    SET(LINK_OPENHEVC_LIBRARY optimized ${OPENHEVC_LIBRARY_DIR}\\Release\\LibOpenHevcWrapper.lib debug ${OPENHEVC_LIBRARY_DIR}\\Debug\\LibOpenHevcWrapper.lib)
+    LIST(APPEND LINK_LIBS
+      ${LINK_OPENHEVC_LIBRARY}
+    )
+  ENDIF()
 ELSE() # for POSIX-compatible OSs
 	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
diff --git a/SuperBuild/External_openHEVC.cmake b/SuperBuild/External_openHEVC.cmake
index 9f0ca031..efd5e543 100644
--- a/SuperBuild/External_openHEVC.cmake
+++ b/SuperBuild/External_openHEVC.cmake
@@ -8,8 +8,8 @@ IF(OPENHEVC_FOUND)
   #SET(OPENHEVC_LIBRARY_DIR "${openHEVC_DIR}" CACHE INTERNAL "Path to store openHEVC library")
 ELSE()
   # openHEVC has not been built yet, so download and build it as an external project
-  SET(GIT_REPOSITORY "https://github.com/OpenHEVC/openHEVC.git")
-  SET(GIT_TAG "hevc_rext")
+  SET(GIT_REPOSITORY "https://github.com/openigtlink/openHEVC.git")
+  SET(GIT_TAG "master")
 
   IF(MSVC)
     LIST(APPEND PLATFORM_SPECIFIC_ARGS -DCMAKE_CXX_MP_FLAG:BOOL=ON)
@@ -20,7 +20,7 @@ ELSE()
   SET (OPENHEVC_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC" CACHE PATH "openHEVC source directory" FORCE)
   SET (OPENHEVC_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC-bin" CACHE PATH "openHEVC library directory" FORCE)
 
-  ExternalProject_Add( OPENHEVC
+  ExternalProject_Add( OpenHEVC
     PREFIX "${CMAKE_BINARY_DIR}/Deps/openHEVC-prefix"
     SOURCE_DIR "${OPENHEVC_SOURCE_DIR}"
     BINARY_DIR "${OPENHEVC_LIBRARY_DIR}"
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index 7982cb6a..c381d8d7 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 2.8.2)
+cmake_minimum_required(VERSION 3.7.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findX265.cmake)
 IF(X265_FOUND)
@@ -23,13 +23,13 @@ ELSE()
   ExternalProject_Add(X265
     PREFIX "${CMAKE_BINARY_DIR}/Deps/x265-prefix"
     SOURCE_DIR "${X265_INCLUDE_DIR}"
-    #SOURCE_SUBDIR source   # SOURCE_SUBDIR is only available for cmake version later than 3.7.2 
+    SOURCE_SUBDIR source   # SOURCE_SUBDIR is only available for cmake version later than 3.7.2 
     BINARY_DIR "${X265_LIBRARY_DIR}"
     #--Download step--------------
     GIT_REPOSITORY "${GIT_REPOSITORY}"
     GIT_TAG ${GIT_TAG}
     #--Configure step-------------
-    CONFIGURE_COMMAND cd ${X265_LIBRARY_DIR} && ${CMAKE_COMMAND} 
+    CMAKE_ARGS # cd ${X265_LIBRARY_DIR} && ${CMAKE_COMMAND} 
     	${PLATFORM_SPECIFIC_ARGS}
     	-DCMAKE_GENERATOR:STRING=${Generator}
       -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/x265-install"
@@ -40,7 +40,7 @@ ELSE()
       -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
       -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
       -DEXPORT_C_API:BOOL=ON
-      -DENABLE_CLI:BOOL=OFF ${X265_INCLUDE_DIR}/source
+      -DENABLE_CLI:BOOL=OFF #${X265_SOURCE_DIR}/source
     #--Build step----------------- 
     BUILD_ALWAYS 1
     INSTALL_COMMAND ""
diff --git a/SuperBuild/External_yasm.cmake b/SuperBuild/External_yasm.cmake
index 1c15fdb1..dea99e5f 100644
--- a/SuperBuild/External_yasm.cmake
+++ b/SuperBuild/External_yasm.cmake
@@ -1,6 +1,9 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findYASM.cmake)
+include(${CMAKE_ROOT}/Modules/FindPythonInterp.cmake)
+
+find_package(PythonInterp "2.7" REQUIRED)
 IF(YASM_FOUND)
   # YASM has been built already
   MESSAGE(STATUS "Using YASM available at: ${YASM_BINARY_DIR}")
@@ -30,6 +33,7 @@ ELSE()
       -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/yasm-install"
       -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${YASM_BINART_DIR}
       -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${YASM_BINART_DIR}
+      -DPYTHON_EXECUTABLE:STRING=${PYTHON_EXECUTABLE}
       -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${YASM_BINART_DIR}
       -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
       -DBUILD_TESTING:BOOL=OFF 
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index 73cc2c31..ad699923 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -9,31 +9,39 @@ IF(BUILD_VIDEOSTREAM)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openh264.cmake)
   ENDIF()
   
-  IF(USE_X265 OR USE_OPENHEVC OR USE_VP9)
+  IF(USE_X265 OR USE_OPENHEVC)
 		set(YASM_BINARY_DIR "" CACHE PATH "YASM binary directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES YASM)
 	ENDIF()
-
+	IF(USE_VP9)
+		#For windows build, we don't build the library in openigtlink, but import it directly
+    #So dependecicy on YASM is not necessary in openigtlink
+  	IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
+  		INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
+      LIST(APPEND OpenIGTLink_DEPENDENCIES YASM) 
+    ENDIF()
+  ENDIF()  
+  
   IF(USE_VP9)
     set(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory" FORCE)
 		set(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_VP9.cmake)
-    #LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
   ENDIF()
 	
   IF(USE_X265)
     set(X265_SOURCE_DIR "" CACHE PATH "X265 source directory" FORCE)
 		set(X265_LIBRARY_DIR "" CACHE PATH "X265 library directory" FORCE)
-    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_x265.cmake)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES x265)
+    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_X265.cmake)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES X265)
   ENDIF()
   
   IF(USE_OPENHEVC)
  		set(OPENHEVC_SOURCE_DIR "" CACHE PATH "OpenHEVC source directory" FORCE)
 		set(OPENHEVC_LIBRARY_DIR "" CACHE PATH "OpenHEVC library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openHEVC.cmake)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES openHEVC)
+    LIST(APPEND OpenIGTLink_DEPENDENCIES OpenHEVC)
   ENDIF()
 
   IF(BUILD_WEBSOCKET)
diff --git a/SuperBuild/findVP9.cmake b/SuperBuild/findVP9.cmake
index 1b97447a..b921692f 100644
--- a/SuperBuild/findVP9.cmake
+++ b/SuperBuild/findVP9.cmake
@@ -30,16 +30,29 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
 
   mark_as_advanced(VP9_INCLUDE_DIR VP9_LIBRARY_DIR)
 else()
+  set(VP9_INCLUDE_DIR "" CACHE PATH "VP9 library directory")
+  find_file(VP9_files NAMES vp8cx.h 
+    PATH_SUFFIXES vpx
+    HINTS ${VP9_INCLUDE_DIR} 
+    )
+  if(NOT VP9_files)
+    MESSAGE(FATAL_ERROR "VP9 include files not found, specify the file path")
+  endif()  
+  
   SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")
-  #SET(VP9 "")
   find_library(VP9_lib vpxmd.lib  
-     HINTS ${VP9_LIBRARY_DIR}/Win32/Release
+     HINTS ${VP9_LIBRARY_DIR}/Win32/Release ${VP9_LIBRARY_DIR}/Win32/Debug ${VP9_LIBRARY_DIR}/x64/Release ${VP9_LIBRARY_DIR}/x64/Debug
      )
   if(NOT VP9_lib)
     MESSAGE(FATAL_ERROR "VP9 library not found, specify the library path")
   else()
     add_library(VP9_lib STATIC IMPORTED GLOBAL)
-    set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_RELEASE ${VP9_LIBRARY_DIR}/Win32/Release/vpxmd.lib)
-    set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_DEBUG ${VP9_LIBRARY_DIR}/Win32/Debug/vpxmdd.lib)
+    if(NOT "${CMAKE_GENERATOR}" MATCHES "(Win64|IA64)")
+      set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_RELEASE ${VP9_LIBRARY_DIR}/Win32/Release/vpxmd.lib)
+      set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_DEBUG ${VP9_LIBRARY_DIR}/Win32/Debug/vpxmdd.lib)
+    else()
+      set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_RELEASE ${VP9_LIBRARY_DIR}/x64/Release/vpxmd.lib)
+      set_property(TARGET VP9_lib PROPERTY IMPORTED_LOCATION_DEBUG ${VP9_LIBRARY_DIR}/x64/Debug/vpxmdd.lib)
+    endif()
   endif()
 endif()

From 17d9cf01b1bbd3473f8f577c2cb5ae8207993e64 Mon Sep 17 00:00:00 2001
From: Longquan Chen <leochan2009@hotmail.com>
Date: Fri, 8 Sep 2017 16:57:23 -0400
Subject: [PATCH 21/21] EHN: find the install location of the codec libraries
 improved

---
 BUILD.md                                   |  2 +-
 Source/VideoStreaming/H265Decoder.h        |  2 +-
 Source/VideoStreaming/VideoStreaming.cmake | 47 ++++++--------
 SuperBuild/External_VP9.cmake              | 15 +++--
 SuperBuild/External_openHEVC.cmake         | 13 ++--
 SuperBuild/External_openh264.cmake         |  5 +-
 SuperBuild/External_x265.cmake             | 71 ++++++++++++----------
 SuperBuild/External_yasm.cmake             |  3 +-
 SuperBuild/Superbuild.cmake                | 27 +++-----
 SuperBuild/findOpenH264.cmake              | 21 ++++---
 SuperBuild/findOpenHEVC.cmake              | 12 ++--
 SuperBuild/findVP9.cmake                   | 28 ++++++---
 SuperBuild/findX265.cmake                  | 13 ++--
 SuperBuild/findYASM.cmake                  |  7 ++-
 14 files changed, 139 insertions(+), 127 deletions(-)

diff --git a/BUILD.md b/BUILD.md
index 0c489167..24b48047 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -62,7 +62,7 @@ Version 0.8.0 or newer is required, except Version 1.0.0.
 
 In the case of H265 build, H265 have many implementations, the encoder used in library is x265 and the decoder is OpenHEVC.
 OpenIGTLink library doesn't build H265 libraries, so the users need to download and compile the libraries by themselves. 
-Afterwards, set the variables-"X265_SOURCE_DIR, X265_LIBRARY_DIR, OPENHEVC_SOURCE_DIR, OPENHEVC_LIBRARY_DIR"-correctly in cmake configuration.
+Afterwards, set the variables-"X265_INCLUDE_DIR, X265_LIBRARY_DIR, OPENHEVC_INCLUDE_DIR, OPENHEVC_LIBRARY_DIR"-correctly in cmake configuration.
 
 * Linux / Mac OS X
 
diff --git a/Source/VideoStreaming/H265Decoder.h b/Source/VideoStreaming/H265Decoder.h
index f0295459..61c4d185 100644
--- a/Source/VideoStreaming/H265Decoder.h
+++ b/Source/VideoStreaming/H265Decoder.h
@@ -26,7 +26,7 @@
 #include "igtlVideoMessage.h"
 #include "igtlCodecCommonClasses.h"
 
-#include "gpac/modules/openhevc_dec/openHevcWrapper.h"
+#include "openHevcWrapper.h"
 
 #define FRAME_CONCEALMENT   0
 
diff --git a/Source/VideoStreaming/VideoStreaming.cmake b/Source/VideoStreaming/VideoStreaming.cmake
index 10bedabb..e1a83a10 100644
--- a/Source/VideoStreaming/VideoStreaming.cmake
+++ b/Source/VideoStreaming/VideoStreaming.cmake
@@ -26,7 +26,7 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
   ENDIF()
   IF(USE_H264)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_openh264.cmake)
-  	IF(NOT ${OpenH264_DIR} STREQUAL "")
+  	IF(OpenH264_FOUND)
 			LIST(APPEND OpenIGTLink_SOURCES
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Decoder.cxx
 				${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.cxx
@@ -37,32 +37,21 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
 					${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H264Encoder.h)
 			ENDIF()
 			LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${OpenH264_DIR}
-    		${OpenH264_DIR}/codec/api/svc
+    		${OpenH264_INCLUDE_DIR}
+    		${OpenH264_INCLUDE_DIR}/codec/api/svc # build location
+    		${OpenH264_INCLUDE_DIR}/include/wels # install location
     	)
 		ELSE()
-			MESSAGE("H264_LIBRARY no found.  You could specify now , or it will be downloaded during the openigtlink build, but build of the codec should be done by the user.")
+			MESSAGE("H264_LIBRARY no found.  You could specify now , or it will be downloaded during the openigtlink build")
 		ENDIF()
 	ENDIF()
-	
-	IF(USE_OPENHEVC OR USE_X265)
-  	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
-  	LIST(APPEND OpenIGTLink_DEPENDENCIES YASM)
-  ENDIF()	
-	IF(USE_VP9)
-		#For windows build, we don't build the library in openigtlink, but import it directly
-    #So dependecicy on YASM is not necessary in openigtlink
-  	IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
-  		INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
-      LIST(APPEND OpenIGTLink_DEPENDENCIES YASM) 
-    ENDIF()
-  ENDIF()  
   
   IF(USE_VP9)
     INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_VP9.cmake)
   	IF(EXISTS ${VP9_LIBRARY_DIR})
   		LIST(APPEND OpenIGTLink_INCLUDE_DIRS
     		${VP9_INCLUDE_DIR}
+    		${VP9_INCLUDE_DIR}/vpx
     		${VP9_LIBRARY_DIR}
     	)
 			LIST(APPEND OpenIGTLink_SOURCES
@@ -87,27 +76,26 @@ IF(${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" AND BUILD_VIDEOSTREAM)
 
   IF(USE_X265)
   	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_X265.cmake)
+  	LIST(APPEND OpenIGTLink_INCLUDE_DIRS
+    		${X265_INCLUDE_DIR}
+    		${X265_INCLUDE_DIR}/source
+    		${X265_LIBRARY_DIR}
+    	)
     LIST(APPEND OpenIGTLink_SOURCES
       ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.cxx
       )
-    LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${X265_INCLUDE_DIR}/source
-    	)
     IF(MSVC OR ${CMAKE_GENERATOR} MATCHES "Xcode")
       LIST(APPEND OpenIGTLink_INCLUDE_FILES
         ${PROJECT_SOURCE_DIR}/Source/VideoStreaming/H265Encoder.h
         )
     ENDIF()
-    LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${X265_INCLUDE_DIR}
-    		${X265_LIBRARY_DIR}
-    	)
   ENDIF()
 	
   IF(USE_OPENHEVC)
   	INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_openHEVC.cmake)
   	LIST(APPEND OpenIGTLink_INCLUDE_DIRS
-    		${OPENHEVC_SOURCE_DIR}
+    		${OPENHEVC_INCLUDE_DIR}
+    		${OPENHEVC_INCLUDE_DIR}/gpac/modules/openhevc_dec
     		${OPENHEVC_LIBRARY_DIR}
     	)
     LIST(APPEND OpenIGTLink_SOURCES
@@ -124,7 +112,7 @@ ENDIF()
 IF(WIN32) # for Windows
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
-    	${OpenH264_DIR}/openh264.lib
+    	${OpenH264_LIBRARY_DIR}/openh264.lib
     )
 	ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
@@ -150,7 +138,7 @@ IF(WIN32) # for Windows
 ELSE() # for POSIX-compatible OSs
 	IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_H264)
 		LIST(APPEND LINK_LIBS
-		  ${OpenH264_DIR}/libopenh264.a
+		  ${OpenH264_LIBRARY_DIR}/libopenh264.a
 		)
 	ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_VP9)
@@ -164,7 +152,10 @@ ELSE() # for POSIX-compatible OSs
     )
   ENDIF()
   IF((${OpenIGTLink_PROTOCOL_VERSION} GREATER "2" ) AND USE_OPENHEVC)
-  	SET(LINK_OPENHEVC_LIBRARY ${OPENHEVC_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/libLibOpenHevcWrapper.a )
+  	SET(LINK_OPENHEVC_LIBRARY ${OPENHEVC_LIBRARY_DIR}/libLibOpenHevcWrapper.a)
+  	IF (CMAKE_CONFIGURATION_TYPES) 
+  		SET(LINK_OPENHEVC_LIBRARY optimized ${OPENHEVC_LIBRARY_DIR}/Release/libLibOpenHevcWrapper.a debug ${OPENHEVC_LIBRARY_DIR}/Debug/libLibOpenHevcWrapper.a)
+  	ENDIF()	
   	LIST(APPEND LINK_LIBS
     	${LINK_OPENHEVC_LIBRARY}      
     )
diff --git a/SuperBuild/External_VP9.cmake b/SuperBuild/External_VP9.cmake
index e4f8a249..fb0e89e4 100644
--- a/SuperBuild/External_VP9.cmake
+++ b/SuperBuild/External_VP9.cmake
@@ -1,6 +1,13 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findVP9.cmake)
+INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
+SET(VP9_DEPENDENCIES)
+IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") # window os build doesn't need the yasm
+	IF(NOT YASM_FOUND)
+		LIST(APPEND VP9_DEPENDENCIES YASM)
+	ENDIF()
+ENDIF() 
 IF(VP9_FOUND)
   IF(${OpenIGTLink_PROTOCOL_VERSION} LESS 3 OR (NOT ${BUILD_VIDEOSTREAM}))
     MESSAGE(FATAL_ERROR "Video streaming requires a build of OpenIGTLink with v3 support enabled. Please set the OpenIGTLink_PROTOCOL_VERSION_3 to true and activate the BUILD_VIDEOSTREAM.")
@@ -9,20 +16,20 @@ ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
   MESSAGE(STATUS "Downloading VP9 from https://github.com/webmproject/libvpx.git")              
 	if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
-    SET (VP9_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
+    SET (VP9_INCLUDE_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 source directory" FORCE)
     SET (VP9_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/VP9" CACHE PATH "VP9 library directory" FORCE)   							
     ExternalProject_Add(VP9
     	PREFIX "${CMAKE_BINARY_DIR}/Deps/VP9-prefix"
       GIT_REPOSITORY https://github.com/webmproject/libvpx/
       GIT_TAG master
-      SOURCE_DIR        "${VP9_SOURCE_DIR}"
-      CONFIGURE_COMMAND "${VP9_SOURCE_DIR}/configure" --disable-examples --disable-tools --disable-docs --disable-vp8 --disable-libyuv --disable-unit_tests --disable-postproc WORKING_DIRECTORY "${VP9_LIBRARY_DIR}"
+      SOURCE_DIR        "${VP9_INCLUDE_DIR}"
+      CONFIGURE_COMMAND "${VP9_INCLUDE_DIR}/configure" --disable-examples --as=yasm --disable-tools --disable-docs --disable-vp8 --disable-libyuv --disable-unit_tests --disable-postproc WORKING_DIRECTORY "${VP9_LIBRARY_DIR}"
       BUILD_ALWAYS 1
       BUILD_COMMAND make
       BUILD_IN_SOURCE 1
       INSTALL_COMMAND   ""
       TEST_COMMAND      ""
-      DEPENDS YASM
+      DEPENDS ${VP9_DEPENDENCIES}
     )
   endif()
 ENDIF()
diff --git a/SuperBuild/External_openHEVC.cmake b/SuperBuild/External_openHEVC.cmake
index efd5e543..ec065194 100644
--- a/SuperBuild/External_openHEVC.cmake
+++ b/SuperBuild/External_openHEVC.cmake
@@ -1,9 +1,14 @@
 cmake_minimum_required(VERSION 2.8.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findOpenHEVC.cmake)
+INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
+SET(OpenHEVC_DEPENDENCIES)
+IF(NOT YASM_FOUND)
+	LIST(APPEND OpenHEVC_DEPENDENCIES YASM)
+ENDIF()
 IF(OPENHEVC_FOUND)
   # openHEVC has been built already
-  MESSAGE(STATUS "Using openHEVC available at: ${OPENHEVC_SOURCE_DIR}")
+  MESSAGE(STATUS "Using openHEVC available at: ${OPENHEVC_INCLUDE_DIR}")
   #FIND_PACKAGE(openHEVC REQUIRED)
   #SET(OPENHEVC_LIBRARY_DIR "${openHEVC_DIR}" CACHE INTERNAL "Path to store openHEVC library")
 ELSE()
@@ -17,12 +22,12 @@ ELSE()
   
   MESSAGE(STATUS "Downloading openHEVC ${GIT_TAG} from: ${GIT_REPOSITORY}")
 
-  SET (OPENHEVC_SOURCE_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC" CACHE PATH "openHEVC source directory" FORCE)
+  SET (OPENHEVC_INCLUDE_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC" CACHE PATH "openHEVC source directory" FORCE)
   SET (OPENHEVC_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openHEVC-bin" CACHE PATH "openHEVC library directory" FORCE)
 
   ExternalProject_Add( OpenHEVC
     PREFIX "${CMAKE_BINARY_DIR}/Deps/openHEVC-prefix"
-    SOURCE_DIR "${OPENHEVC_SOURCE_DIR}"
+    SOURCE_DIR "${OPENHEVC_INCLUDE_DIR}"
     BINARY_DIR "${OPENHEVC_LIBRARY_DIR}"
     #--Download step--------------
     GIT_REPOSITORY "${GIT_REPOSITORY}"
@@ -41,6 +46,6 @@ ELSE()
     #--Build step-----------------
     BUILD_ALWAYS 1
     INSTALL_COMMAND ""
-    DEPENDS YASM
+    DEPENDS ${OpenHEVC_DEPENDENCIES}
     )
 ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/External_openh264.cmake b/SuperBuild/External_openh264.cmake
index 1677fbc1..aeac45ef 100644
--- a/SuperBuild/External_openh264.cmake
+++ b/SuperBuild/External_openh264.cmake
@@ -9,7 +9,8 @@ IF(OpenH264_FOUND)
 ELSE()
   # OpenIGTLink has not been built yet, so download and build it as an external project
   MESSAGE(STATUS "Downloading openh264 from https://github.com/cisco/openh264.git.")  
-  SET (OpenH264_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 source directory" FORCE)
+  SET (OpenH264_INCLUDE_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 source directory" FORCE)
+  SET (OpenH264_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/openh264" CACHE PATH "H264 source directory" FORCE)
   if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")     
 		ExternalProject_Add(OpenH264
 			PREFIX "${CMAKE_BINARY_DIR}/Deps/openh264-prefix"
@@ -20,7 +21,7 @@ ELSE()
 			BUILD_ALWAYS 1
 			BUILD_COMMAND     make
 			BUILD_IN_SOURCE 1
-			INSTALL_COMMAND   make install PREFIX=${OpenH264_DIR}
+			INSTALL_COMMAND   ""
 			TEST_COMMAND      ""
 		)  
 	else()
diff --git a/SuperBuild/External_x265.cmake b/SuperBuild/External_x265.cmake
index c381d8d7..422785d4 100644
--- a/SuperBuild/External_x265.cmake
+++ b/SuperBuild/External_x265.cmake
@@ -1,6 +1,12 @@
 cmake_minimum_required(VERSION 3.7.2)
 include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 include(${OpenIGTLink_SOURCE_DIR}/SuperBuild/findX265.cmake)
+INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
+SET(X265_DEPENDENCIES)
+IF(NOT YASM_FOUND)
+	LIST(APPEND X265_DEPENDENCIES YASM)
+ENDIF()
+
 IF(X265_FOUND)
   MESSAGE(STATUS "Using X265 available at: ${X265_INCLUDE_DIR}")
 ELSE()
@@ -14,36 +20,37 @@ ELSE()
   
   SET(Generator ${CMAKE_GENERATOR})
 	IF("${CMAKE_GENERATOR}" STREQUAL "Xcode")
-	 SET(Generator "Unix Makefiles") # xcode generator tend to fail, use unix makefiles instead
-	ENDIF()
-  
-  MESSAGE(STATUS "Downloading x265 ${GIT_TAG} from: ${GIT_REPOSITORY}")
-  SET (X265_INCLUDE_DIR "${CMAKE_BINARY_DIR}/Deps/x265" CACHE PATH "x265 source directory" FORCE)
-  SET (X265_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/x265-bin" CACHE PATH "x265 library directory" FORCE)
-  ExternalProject_Add(X265
-    PREFIX "${CMAKE_BINARY_DIR}/Deps/x265-prefix"
-    SOURCE_DIR "${X265_INCLUDE_DIR}"
-    SOURCE_SUBDIR source   # SOURCE_SUBDIR is only available for cmake version later than 3.7.2 
-    BINARY_DIR "${X265_LIBRARY_DIR}"
-    #--Download step--------------
-    GIT_REPOSITORY "${GIT_REPOSITORY}"
-    GIT_TAG ${GIT_TAG}
-    #--Configure step-------------
-    CMAKE_ARGS # cd ${X265_LIBRARY_DIR} && ${CMAKE_COMMAND} 
-    	${PLATFORM_SPECIFIC_ARGS}
-    	-DCMAKE_GENERATOR:STRING=${Generator}
-      -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/x265-install"
-      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${X265_LIBRARY_DIR}
-      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${X265_LIBRARY_DIR}
-      -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
-      -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-      -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-      -DEXPORT_C_API:BOOL=ON
-      -DENABLE_CLI:BOOL=OFF #${X265_SOURCE_DIR}/source
-    #--Build step----------------- 
-    BUILD_ALWAYS 1
-    INSTALL_COMMAND ""
-    DEPENDS YASM
-    )
+		MESSAGE(FATAL_ERROR "Xcode build tend to fail for x265, use unix makefiles instead. And link the source and library directory manually in the cmake advance settings. see the link for details: https://bitbucket.org/multicoreware/x265/issues/303/build-x265-version20-on-xcode")
+	  #SET(Generator "Unix Makefiles") # xcode generator tend to fail, use unix makefiles instead, https://bitbucket.org/multicoreware/x265/issues/303/build-x265-version20-on-xcode
+	ELSE()
+		MESSAGE(STATUS "Downloading x265 ${GIT_TAG} from: ${GIT_REPOSITORY}")
+		SET (X265_INCLUDE_DIR "${CMAKE_BINARY_DIR}/Deps/x265" CACHE PATH "x265 source directory" FORCE)
+		SET (X265_LIBRARY_DIR "${CMAKE_BINARY_DIR}/Deps/x265-bin" CACHE PATH "x265 library directory" FORCE)
+		ExternalProject_Add(X265
+			PREFIX "${CMAKE_BINARY_DIR}/Deps/x265-prefix"
+			SOURCE_DIR "${X265_INCLUDE_DIR}"
+			SOURCE_SUBDIR source   # SOURCE_SUBDIR is only available for cmake version later than 3.7.2 
+			BINARY_DIR "${X265_LIBRARY_DIR}"
+			#--Download step--------------
+			GIT_REPOSITORY "${GIT_REPOSITORY}"
+			GIT_TAG ${GIT_TAG}
+			#--Configure step-------------
+			CMAKE_ARGS # cd ${X265_LIBRARY_DIR} && ${CMAKE_COMMAND} 
+				${PLATFORM_SPECIFIC_ARGS}
+				-DCMAKE_GENERATOR:STRING=${Generator}
+				-DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/x265-install"
+				-DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${X265_LIBRARY_DIR}
+				-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+				-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${X265_LIBRARY_DIR}
+				-DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
+				-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+				-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+				-DEXPORT_C_API:BOOL=ON
+				-DENABLE_CLI:BOOL=OFF #${X265_INCLUDE_DIR}/source
+			#--Build step----------------- 
+			BUILD_ALWAYS 1
+			INSTALL_COMMAND ""
+			DEPENDS ${X265_DEPENDENCIES}
+			)
+	ENDIF()		
 ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/External_yasm.cmake b/SuperBuild/External_yasm.cmake
index dea99e5f..2c1ade73 100644
--- a/SuperBuild/External_yasm.cmake
+++ b/SuperBuild/External_yasm.cmake
@@ -30,9 +30,9 @@ ELSE()
     #--Configure step-------------
     CMAKE_ARGS
       ${PLATFORM_SPECIFIC_ARGS}
-      -DCMAKE_INSTALL_PREFIX:PATH="${CMAKE_BINARY_DIR}/Deps/yasm-install"
       -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=${YASM_BINART_DIR}
       -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=${YASM_BINART_DIR}
+      -DYASM_INSTALL_BIN_DIR:STRING="bin"
       -DPYTHON_EXECUTABLE:STRING=${PYTHON_EXECUTABLE}
       -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${YASM_BINART_DIR}
       -DBUILD_SHARED_LIBS:BOOL=${OpenIGTLink_BUILD_SHARED_LIBS} 
@@ -42,6 +42,5 @@ ELSE()
       -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
     #--Build step-----------------
     BUILD_ALWAYS 1
-    INSTALL_COMMAND ""
     )
 ENDIF()
\ No newline at end of file
diff --git a/SuperBuild/Superbuild.cmake b/SuperBuild/Superbuild.cmake
index ad699923..6aad6bf4 100644
--- a/SuperBuild/Superbuild.cmake
+++ b/SuperBuild/Superbuild.cmake
@@ -5,40 +5,27 @@ SET(OpenIGTLink_DEPENDENCIES)
 # VideoStreaming dependencies
 IF(BUILD_VIDEOSTREAM)
   IF(USE_H264)
-    set(OpenH264_DIR "" CACHE PATH "H264 source directory" FORCE)    
+  	set(OpenH264_INCLUDE_DIR "" CACHE PATH "H264 source directory" FORCE)  
+    set(OpenH264_LIBRARY_DIR "" CACHE PATH "H264 library directory" FORCE)    
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openh264.cmake)
   ENDIF()
   
-  IF(USE_X265 OR USE_OPENHEVC)
-		set(YASM_BINARY_DIR "" CACHE PATH "YASM binary directory" FORCE)
-    INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_yasm.cmake)
-    LIST(APPEND OpenIGTLink_DEPENDENCIES YASM)
-	ENDIF()
-	IF(USE_VP9)
-		#For windows build, we don't build the library in openigtlink, but import it directly
-    #So dependecicy on YASM is not necessary in openigtlink
-  	IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
-  		INCLUDE(${OpenIGTLink_SOURCE_DIR}/SuperBuild/External_yasm.cmake)
-      LIST(APPEND OpenIGTLink_DEPENDENCIES YASM) 
-    ENDIF()
-  ENDIF()  
-  
   IF(USE_VP9)
-    set(VP9_SOURCE_DIR "" CACHE PATH "VP9 source directory" FORCE)
+    set(VP9_INCLUDE_DIR "" CACHE PATH "VP9 source directory" FORCE)
 		set(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_VP9.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES VP9)
   ENDIF()
 	
   IF(USE_X265)
-    set(X265_SOURCE_DIR "" CACHE PATH "X265 source directory" FORCE)
+    set(X265_INCLUDE_DIR "" CACHE PATH "X265 source directory" FORCE)
 		set(X265_LIBRARY_DIR "" CACHE PATH "X265 library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_X265.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES X265)
   ENDIF()
   
   IF(USE_OPENHEVC)
- 		set(OPENHEVC_SOURCE_DIR "" CACHE PATH "OpenHEVC source directory" FORCE)
+ 		set(OPENHEVC_INCLUDE_DIR "" CACHE PATH "OpenHEVC source directory" FORCE)
 		set(OPENHEVC_LIBRARY_DIR "" CACHE PATH "OpenHEVC library directory" FORCE)
     INCLUDE(${CMAKE_CURRENT_LIST_DIR}/External_openHEVC.cmake)
     LIST(APPEND OpenIGTLink_DEPENDENCIES OpenHEVC)
@@ -77,14 +64,14 @@ ExternalProject_Add( OpenIGTLink-lib
 		-DBUILD_EXAMPLES:BOOL=${BUILD_EXAMPLES}
 		-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
 		-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-		-DOpenH264_DIR:STRING=${OpenH264_DIR}
+		-DOpenH264_INCLUDE_DIR:STRING=${OpenH264_INCLUDE_DIR}
+		-DOpenH264_LIBRARY_DIR:STRING=${OpenH264_LIBRARY_DIR}
 		-DX265_INCLUDE_DIR:STRING=${X265_INCLUDE_DIR}
 		-DX265_LIBRARY_DIR:STRING=${X265_LIBRARY_DIR}
 		-DOPENHEVC_INCLUDE_DIR:STRING=${OPENHEVC_INCLUDE_DIR}
 		-DOPENHEVC_LIBRARY_DIR:STRING=${OPENHEVC_LIBRARY_DIR}
 		-DVP9_INCLUDE_DIR:STRING=${VP9_INCLUDE_DIR}
 		-DVP9_LIBRARY_DIR:STRING=${VP9_LIBRARY_DIR}
-		-DYASM_BINARY_DIR:STRING=${YASM_BINARY_DIR}
 	#--Build step-----------------
 	BUILD_ALWAYS 1
 	#--Install step-----------------
diff --git a/SuperBuild/findOpenH264.cmake b/SuperBuild/findOpenH264.cmake
index 2eef8a68..c219d41b 100644
--- a/SuperBuild/findOpenH264.cmake
+++ b/SuperBuild/findOpenH264.cmake
@@ -5,7 +5,7 @@
 #
 #  OpenH264_FOUND - found OpenH264
 #  OpenH264_INCLUDE_DIR - the OpenH264 include directory
-#  OpenH264_LIBRARIES - openh264 library
+#  OpenH264_LIBRARY_DIR - the OpenH264 library directory
 #  A more complete find module cmake file could be found at: 
 #  https://github.com/BelledonneCommunications/linphone-cmake-builder/blob/master/builders/openh264.cmake
 
@@ -20,16 +20,23 @@ endif (UNIX AND NOT ANDROID)
 
 SET( OpenH264_PATH_HINTS 
 		${OpenH264_ROOT} 
-    ${CMAKE_BINARY_DIR}/Deps/openh264
+    ${OpenH264_INCLUDE_DIR}
+    ${OpenH264_LIBRARY_DIR}
     )
 
-set(OpenH264_DIR "")    
-find_path(OpenH264_DIR NAMES codec_api.h codec_app_def.h codec_def.h openh264${CMAKE_STATIC_LIBRARY_SUFFIX} libopenh264.a
-	PATH_SUFFIXES include/wels lib codec/api/svc
+unset(OpenH264_INCLUDE_DIR CACHE)    
+find_path(OpenH264_INCLUDE_DIR NAMES codec_api.h codec_app_def.h codec_def.h
+	PATH_SUFFIXES include/wels codec/api/svc
 	HINTS ${OpenH264_PATH_HINTS}
 	)
 
+find_path(OpenH264_LIBRARY_DIR NAMES openh264${CMAKE_STATIC_LIBRARY_SUFFIX} libopenh264.a	
+	PATH_SUFFIXES lib
+	HINTS ${OpenH264_PATH_HINTS}
+	)	
+
+
 include(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenH264 DEFAULT_MSG OpenH264_DIR)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenH264 DEFAULT_MSG OpenH264_INCLUDE_DIR OpenH264_LIBRARY_DIR)
 
-mark_as_advanced(OpenH264_DIR)
+mark_as_advanced(OpenH264_INCLUDE_DIR OpenH264_LIBRARY_DIR)
diff --git a/SuperBuild/findOpenHEVC.cmake b/SuperBuild/findOpenHEVC.cmake
index fca92596..e3a0afa3 100644
--- a/SuperBuild/findOpenHEVC.cmake
+++ b/SuperBuild/findOpenHEVC.cmake
@@ -7,8 +7,8 @@
 #  OPENHEVC_INCLUDE_DIR - the OPENHEVC include directory
 #  OPENHEVC_LIBRARY_DIR - OPENHEVC library directory
 
-IF((EXISTS ${OPENHEVC_SOURCE_DIR}) AND (EXISTS ${OPENHEVC_LIBRARY_DIR}))
-	IF(EXISTS "${OPENHEVC_SOURCE_DIR}/gpac/modules/openhevc_dec/openHevcWrapper.h") 
+IF((EXISTS ${OPENHEVC_INCLUDE_DIR}) AND (EXISTS ${OPENHEVC_LIBRARY_DIR}))
+	IF(EXISTS "${OPENHEVC_INCLUDE_DIR}/openHevcWrapper.h") 
 		IF(WIN32)
 		ELSE()
 			IF(${CMAKE_BUILD_TYPE})
@@ -26,17 +26,17 @@ ENDIF()
 
 SET( OPENHEVC_PATH_HINTS 
 		${OPENHEVC_ROOT} 
-    ${CMAKE_BINARY_DIR}/Deps/OPENHEVC
-    ${CMAKE_BINARY_DIR}/Deps/OPENHEVC-bin
+    ${OPENHEVC_INCLUDE_DIR}
+    ${OPENHEVC_LIBRARY_DIR}
     )
     
-set(OPENHEVC_INCLUDE_DIR "")
+unset(OPENHEVC_INCLUDE_DIR CACHE)
 find_path(OPENHEVC_INCLUDE_DIR NAMES openHevcWrapper.h 
 	PATH_SUFFIXES gpac/modules/openhevc_dec
 	HINTS ${OPENHEVC_PATH_HINTS} 
 	)
 	
-set(OPENHEVC_LIBRARY_DIR "")
+unset(OPENHEVC_LIBRARY_DIR CACHE)
 find_path(OPENHEVC_LIBRARY_DIR
 	 NAMES LibOpenHevcWrapper${CMAKE_STATIC_LIBRARY_SUFFIX} libLibOpenHevcWrapper.a
 	 PATH_SUFFIXES ${CMAKE_BUILD_TYPE}
diff --git a/SuperBuild/findVP9.cmake b/SuperBuild/findVP9.cmake
index b921692f..2797b009 100644
--- a/SuperBuild/findVP9.cmake
+++ b/SuperBuild/findVP9.cmake
@@ -10,16 +10,16 @@
 if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") 
   SET( VP9_PATH_HINTS 
       ${VP9_ROOT} 
-      ${CMAKE_BINARY_DIR}/Deps/VP9
-      ${CMAKE_BINARY_DIR}/Deps/VP9-bin
+      ${VP9_INCLUDE_DIR}
+      ${VP9_LIBRARY_DIR} 
       )
-  set(VP9_INCLUDE_DIR "")
+  unset(VP9_INCLUDE_DIR CACHE)
   find_path(VP9_INCLUDE_DIR NAMES vp8cx.h vpx_image.h 
     PATH_SUFFIXES vpx
     HINTS ${VP9_PATH_HINTS} 
     )
     
-  set(VP9_LIBRARY_DIR "")
+  unset(VP9_LIBRARY_DIR CACHE)
   find_path(VP9_LIBRARY_DIR
      NAMES libvpx.a
      PATH_SUFFIXES ${Platform}/${CMAKE_BUILD_TYPE}
@@ -30,18 +30,26 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
 
   mark_as_advanced(VP9_INCLUDE_DIR VP9_LIBRARY_DIR)
 else()
-  set(VP9_INCLUDE_DIR "" CACHE PATH "VP9 library directory")
-  find_file(VP9_files NAMES vp8cx.h 
+	SET(VP9_PATH_HINTS 
+			${VP9_ROOT} 
+      ${VP9_INCLUDE_DIR}
+      ${VP9_LIBRARY_DIR}/Win32/Release 
+      ${VP9_LIBRARY_DIR}/Win32/Debug 
+      ${VP9_LIBRARY_DIR}/x64/Release 
+      ${VP9_LIBRARY_DIR}/x64/Debug
+      )
+  unset(VP9_INCLUDE_DIR CACHE)
+  find_path(VP9_INCLUDE_DIR NAMES vp8cx.h vpx_image.h 
     PATH_SUFFIXES vpx
-    HINTS ${VP9_INCLUDE_DIR} 
+    HINTS ${VP9_PATH_HINTS} 
     )
-  if(NOT VP9_files)
+  if(NOT VP9_INCLUDE_DIR)
     MESSAGE(FATAL_ERROR "VP9 include files not found, specify the file path")
   endif()  
   
-  SET(VP9_LIBRARY_DIR "" CACHE PATH "VP9 library directory")
+  unset(VP9_LIBRARY_DIR CACHE)
   find_library(VP9_lib vpxmd.lib  
-     HINTS ${VP9_LIBRARY_DIR}/Win32/Release ${VP9_LIBRARY_DIR}/Win32/Debug ${VP9_LIBRARY_DIR}/x64/Release ${VP9_LIBRARY_DIR}/x64/Debug
+     HINTS  ${VP9_PATH_HINTS}
      )
   if(NOT VP9_lib)
     MESSAGE(FATAL_ERROR "VP9 library not found, specify the library path")
diff --git a/SuperBuild/findX265.cmake b/SuperBuild/findX265.cmake
index 13a5225f..570ab2b8 100644
--- a/SuperBuild/findX265.cmake
+++ b/SuperBuild/findX265.cmake
@@ -14,20 +14,19 @@
 
 SET( X265_PATH_HINTS 
 		${X265_ROOT} 
-    ${CMAKE_BINARY_DIR}/Deps/x265
-    ${CMAKE_BINARY_DIR}/Deps/x265-bin
+    ${X265_INCLUDE_DIR}
+    ${X265_LIBRARY_DIR}
     )
-set(X265_INCLUDE_DIR "")
+unset(X265_INCLUDE_DIR CACHE)
 find_path(X265_INCLUDE_DIR NAMES x265.h 
-	PATH_SUFFIXES source
 	HINTS ${X265_PATH_HINTS} 
+	PATH_SUFFIXES source
 	)
-	
-set(X265_LIBRARY_DIR "")
+unset(X265_LIBRARY_DIR CACHE)
 find_path(X265_LIBRARY_DIR
 	 NAMES x265-static${CMAKE_STATIC_LIBRARY_SUFFIX} libx265.a
 	 HINTS ${X265_PATH_HINTS}
-	 )
+	 ) 
 include(FindPackageHandleStandardArgs)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(X265 REQUIRED_VARS X265_LIBRARY_DIR X265_INCLUDE_DIR)
 
diff --git a/SuperBuild/findYASM.cmake b/SuperBuild/findYASM.cmake
index 56dd8d86..70ad52f7 100644
--- a/SuperBuild/findYASM.cmake
+++ b/SuperBuild/findYASM.cmake
@@ -13,14 +13,15 @@
 
 SET( YASM_PATH_HINTS 
 		${YASM_ROOT} 
-    ${CMAKE_BINARY_DIR}/Deps/YASM
-    ${CMAKE_BINARY_DIR}/Deps/YASM-bin
+    ${CMAKE_BINARY_DIR}/Deps/yasm
+    ${CMAKE_BINARY_DIR}/Deps/yasm-bin
     )
 	
-set(YASM_BINARY_DIR "")
+unset(YASM_BINARY_DIR CACHE)
 find_path(YASM_BINARY_DIR
 	 NAMES yasm
 	 HINTS ${YASM_PATH_HINTS}
+	 PATH_SUFFIXES Debug Release
 	 )
 include(FindPackageHandleStandardArgs)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(YASM REQUIRED_VARS YASM_BINARY_DIR)