diff --git a/CMake/FindLibNifalcon.cmake b/CMake/FindLibNifalcon.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..b32bf5cecd64007de2e76587fbc95e2bceb2663e
--- /dev/null
+++ b/CMake/FindLibNifalcon.cmake
@@ -0,0 +1,95 @@
+# - try to find Libnifalcon library
+#
+#
+# Cache Variables: (probably not for direct use in your scripts)
+#  LIBNIFALCON_ROOT_DIR - where to start searching
+#  LIBNIFALCON_INCLUDE_DIR
+#  LIBNIFALCON_LIBRARY
+#  LIBNIFALCON_LIBUSB1_LIBRARY - Unix only
+#  LIBNIFALCON_LIBUSB1_INCLUDE_DIR - Unix only
+#  LIBNIFALCON_rt_LIBRARY - Unix only
+#
+# Non-cache variables you might use in your CMakeLists.txt:
+#  LIBNIFALCON_FOUND
+#  LIBNIFALCON_INCLUDE_DIRS
+#  LIBNIFALCON_LIBRARIES
+#
+# Requires these CMake modules:
+#  FindPackageHandleStandardArgs (known to be included with CMake >=2.6.2)
+#
+# 2010 Axel Kohlmeyer, <akohlmey@gmail.com>
+
+set(LIBNIFALCON_ROOT_DIR
+	"${LIBNIFALCON_ROOT_DIR}"
+	CACHE
+	PATH
+	"Where to start searching")
+
+find_library(LIBNIFALCON_LIBRARY
+	NAMES
+	libnifalcon
+	nifalcon
+	HINTS
+	"${LIBNIFALCON_ROOT_DIR}"
+	PATH_SUFFIXES
+	include)
+
+get_filename_component(_libdir "${LIBNIFALCON_LIBRARY}" PATH)
+
+find_path(LIBNIFALCON_INCLUDE_DIR
+	NAMES
+	falcon/core/FalconDevice.h
+	HINTS
+	"${_libdir}")
+
+set(_deps_check)
+if(NOT WIN32)
+	find_library(LIBNIFALCON_LIBUSB1_LIBRARY NAMES libusb-1.0 usb-1.0)
+	get_filename_component(_libdir "${LIBNIFALCON_LIBUSB1_LIBRARY}" PATH)
+
+	find_path(LIBNIFALCON_LIBUSB1_INCLUDE_DIR
+		NAMES
+		libusb-1.0/libusb.h
+		HINTS
+		"${_libdir}")
+
+	find_library(LIBNIFALCON_rt_LIBRARY NAMES rt)
+	set(_deps_check
+		LIBNIFALCON_LIBUSB1_LIBRARY
+		LIBNIFALCON_LIBUSB1_INCLUDE_DIR
+		LIBNIFALCON_rt_LIBRARY)
+endif()
+
+find_package(Boost QUIET)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(LibNiFalcon
+	DEFAULT_MSG
+	LIBNIFALCON_LIBRARY
+	LIBNIFALCON_INCLUDE_DIR
+	Boost_INCLUDE_DIR
+	${_deps_check})
+
+if(LIBNIFALCON_FOUND)
+	set(LIBNIFALCON_LIBRARIES "${LIBNIFALCON_LIBRARY}")
+	set(LIBNIFALCON_LIBRARY_DIRS "${_libdir}")
+	set(LIBNIFALCON_INCLUDE_DIRS "${LIBNIFALCON_INCLUDE_DIR}" "${Boost_INCLUDE_DIR}")
+
+	if(NOT WIN32)
+		list(APPEND
+			LIBNIFALCON_LIBRARIES
+			"${LIBNIFALCON_LIBUSB1_LIBRARY}"
+			"${LIBNIFALCON_rt_LIBRARY}")
+		list(APPEND
+			LIBNIFALCON_INCLUDE_DIRS
+			"${LIBNIFALCON_LIBUSB1_INCLUDE_DIR}")
+	endif()
+
+	mark_as_advanced(LIBNIFALCON_ROOT_DIR)
+endif()
+
+mark_as_advanced(LIBNIFALCON_INCLUDE_DIR
+	LIBNIFALCON_LIBRARY
+	LIBNIFALCON_LIBUSB1_LIBRARY
+	LIBNIFALCON_LIBUSB1_INCLUDE_DIR
+	LIBNIFALCON_rt_LIBRARY)
diff --git a/CMake/FindVRPN.cmake b/CMake/FindVRPN.cmake
index 64b4b1c43074a2b9fabddc036c319160b77536e9..45617d219e76fd6d7a120d58c95456e84f29be38 100644
--- a/CMake/FindVRPN.cmake
+++ b/CMake/FindVRPN.cmake
@@ -27,12 +27,19 @@ set(VRPN_INCLUDE_DIRS "${VRPN_INCLUDE_DIR}")
 set(VRPN_LIBRARIES "${VRPN_LIBRARY} ${VRPN_QUAT_LIBRARY} ${VRPN_SERVER_LIBRARY} ${VRPN_PHANTOM_LIBRARY}")
 
 # Try to find libusb dependency
-find_package(Libusb1 REQUIRED)
+find_package(Libusb1 QUIET)
 if(LIBUSB1_FOUND)
     list(APPEND VRPN_LIBRARIES ${LIBUSB1_LIBRARIES})
     list(APPEND VRPN_INCLUDE_DIRS ${LIBUSB1_INCLUDE_DIRS})
 endif()
 
+# Try to find falcon dependency
+find_package(LibNifalcon QUIET)
+if(LIBUSB1_FOUND)
+    list(APPEND VRPN_LIBRARIES ${LIBNIFALCON_LIBRARIES})
+    list(APPEND VRPN_INCLUDE_DIRS ${LIBNIFALCON_INCLUDE_DIRS})
+endif()
+
 include(FindPackageHandleStandardArgs)
 
 find_package_handle_standard_args(VRPN
@@ -57,12 +64,22 @@ if(VRPN_FOUND)
         INTERFACE_LINK_LIBRARIES "${VRPN_LIBRARY}"
         INTERFACE_INCLUDE_DIRECTORIES "${VRPN_INCLUDE_DIR}")
   endif()
-  if(NOT TARGET vrpn::libusb)
-    add_library(vrpn::libusb INTERFACE IMPORTED)
-    set_target_properties(vrpn::libusb PROPERTIES
-        INTERFACE_LINK_LIBRARIES "${LIBUSB1_LIBRARIES}"
-        INTERFACE_INCLUDE_DIRECTORIES "${LIBUSB1_INCLUDE_DIRS}")
-  endif()
+  if(LIBUSB1_FOUND)
+    if(NOT TARGET vrpn::libusb)
+        add_library(vrpn::libusb INTERFACE IMPORTED)
+        set_target_properties(vrpn::libusb PROPERTIES
+            INTERFACE_LINK_LIBRARIES "${LIBUSB1_LIBRARIES}"
+            INTERFACE_INCLUDE_DIRECTORIES "${LIBUSB1_INCLUDE_DIRS}")
+    endif()
+  endif(LIBUSB1_FOUND)
+  if(LIBNIFALCON_FOUND)
+    if(NOT TARGET vrpn::libfalcon)
+        add_library(vrpn::libfalcon INTERFACE IMPORTED)
+        set_target_properties(vrpn::libfalcon PROPERTIES
+            INTERFACE_LINK_LIBRARIES "${LIBNIFALCON_LIBRARIES}"
+            INTERFACE_INCLUDE_DIRECTORIES "${LIBNIFALCON_INCLUDE_DIRS}")
+    endif()
+  endif(LIBNIFALCON_FOUND)
   if(NOT TARGET vrpn::quat)
     add_library(vrpn::quat INTERFACE IMPORTED)
     set_target_properties(vrpn::quat PROPERTIES
diff --git a/CMake/SuperBuild/External_LibNifalcon.cmake b/CMake/SuperBuild/External_LibNifalcon.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..b60d07763c7577919c3d2890cf1f15397fe1df8c
--- /dev/null
+++ b/CMake/SuperBuild/External_LibNifalcon.cmake
@@ -0,0 +1,79 @@
+###########################################################################
+# Copyright 2015 by Kitware and RPI. See toplevel LICENSE.txt for details.
+###########################################################################
+
+set(LibNifalcon_TAG 7e98c9f2bdf936d236260176921c865f8fd1b108)
+set(LibNifalcon_REPOSITORY git@github.com:qdot/libnifalcon.git)
+
+# Make sure this file is included only once
+get_filename_component(CMAKE_CURRENT_LIST_FILENAME ${CMAKE_CURRENT_LIST_FILE} NAME_WE)
+if(${CMAKE_CURRENT_LIST_FILENAME}_FILE_INCLUDED)
+  return()
+endif()
+set(${CMAKE_CURRENT_LIST_FILENAME}_FILE_INCLUDED 1)
+
+# Sanity checks
+if(DEFINED LibNifalcon_DIR AND NOT EXISTS ${LibNifalcon_DIR})
+  message(FATAL_ERROR "LibNifalcon_DIR variable is defined but corresponds to non-existing directory")
+endif()
+
+set(LibNifalcon_DEPENDENCIES "")
+
+# Include dependent projects if any
+SimMedTKCheckDependencies(LibNifalcon)
+
+set(proj LibNifalcon)
+
+if(NOT DEFINED ${proj}_DIR)
+
+  # Set CMake OSX variable to pass down the external project
+  set(CMAKE_OSX_EXTERNAL_PROJECT_ARGS)
+  if(APPLE)
+    list(APPEND CMAKE_OSX_EXTERNAL_PROJECT_ARGS
+      -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES}
+      -DCMAKE_OSX_SYSROOT:PATH=${CMAKE_OSX_SYSROOT}
+      -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET}
+      -DCMAKE_MACOSX_RPATH:BOOL=ON
+    )
+  endif()
+
+#   message(STATUS "Adding project:${proj}")
+  ExternalProject_Add(${proj}
+    SOURCE_DIR ${CMAKE_BINARY_DIR}/SuperBuild/${proj}
+    BINARY_DIR ${CMAKE_BINARY_DIR}/SuperBuild/${proj}-build
+    PREFIX ${CMAKE_BINARY_DIR}/SuperBuild/${proj}${ep_suffix}
+    GIT_REPOSITORY ${${proj}_REPOSITORY}
+    GIT_TAG ${${proj}_TAG}
+    GIT_SUBMODULES cmake_modules
+    UPDATE_COMMAND ""
+    INSTALL_COMMAND ""
+    CMAKE_GENERATOR ${gen}
+    CMAKE_ARGS
+      -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+      -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags}
+      -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags}
+      -DBUILD_SHARED:BOOL=${SimMedTK_BUILD_SHARED_LIBS}
+      -DCMAKE_INCLUDE_PATH:STRING=${SimMedTK_CMAKE_INCLUDE_PATH}
+      -DCMAKE_LIBRARY_PATH:STRING=${SimMedTK_CMAKE_LIBRARY_PATH}
+      -DBUILD_TESTING:BOOL=OFF
+      -DBUILD_EXAMPLES:BOOL=OFF
+      -DBUILD_SWIG_BINDINGS:BOOL=OFF
+      ${CMAKE_OSX_EXTERNAL_PROJECT_ARGS}
+      ${OUTPUT_DIRECTORIES}
+    DEPENDS
+      ${${proj}_DEPENDENCIES}
+    LOG_DOWNLOAD 1            # Wrap download in script to log output
+#     LOG_UPDATE 1              # Wrap update in script to log output
+#     LOG_CONFIGURE 1           # Wrap configure in script to log output
+#     LOG_BUILD 1               # Wrap build in script to log output
+#     LOG_TEST 1                # Wrap test in script to log output
+#     LOG_INSTALL 1             # Wrap install in script to log output
+    )
+  set(${proj}_DIR ${CMAKE_BINARY_DIR}/SimMedTK-build/lib)
+
+else()
+  SimMedTKEmptyExternalProject(${proj} "${${proj}_DEPENDENCIES}")
+endif()
+
+set(SimMedTK_CMAKE_INCLUDE_PATH ${CMAKE_BINARY_DIR}/SuperBuild/${proj}/${sep}${SimMedTK_CMAKE_INCLUDE_PATH})
+list(APPEND SimMedTK_SUPERBUILD_EP_ARGS -DLibNifalcon_DIR:PATH=${${proj}_DIR})
diff --git a/CMake/SuperBuild/External_VRPN.cmake b/CMake/SuperBuild/External_VRPN.cmake
index 69ec6b29551f77796b88cc9053d081bd17655c23..70063603f678b5a0e7883075af00e8c83dfc6220 100644
--- a/CMake/SuperBuild/External_VRPN.cmake
+++ b/CMake/SuperBuild/External_VRPN.cmake
@@ -18,6 +18,9 @@ if(DEFINED VRPN_DIR AND NOT EXISTS ${VRPN_DIR})
 endif()
 
 set(VRPN_DEPENDENCIES "")
+if(SimMedTK_USE_FALCON)
+    set(VRPN_DEPENDENCIES "LibNifalcon;${VRPN_DEPENDENCIES}")
+endif()
 
 # Include dependent projects if any
 SimMedTKCheckDependencies(VRPN)
@@ -25,6 +28,15 @@ SimMedTKCheckDependencies(VRPN)
 set(proj VRPN)
 
 if(NOT DEFINED ${proj}_DIR)
+  set(VRPN_EP_ARGS)
+  if(SimMedTK_USE_FALCON)
+      list(APPEND VRPN_EP_ARGS
+          -DVRPN_USE_LIBNIFALCON:BOOL=ON
+          -DLibNifalcon_DIR=${LibNifalcon_DIR}
+          -DCMAKE_INCLUDE_PATH=${SimMedTK_CMAKE_INCLUDE_PATH}
+          )
+          message("SimMedTK_CMAKE_INCLUDE_PATH=${SimMedTK_CMAKE_INCLUDE_PATH}")
+  endif()
 
   # Set CMake OSX variable to pass down the external project
   set(CMAKE_OSX_EXTERNAL_PROJECT_ARGS)
@@ -66,8 +78,8 @@ if(NOT DEFINED ${proj}_DIR)
       -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
       -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags}
       -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags}
-      -DBUILD_SHARED_LIBS:BOOL=OFF
-      -DVRPN_USE_SHARED_LIBRARY:BOOL=OFF
+      -DBUILD_SHARED_LIBS:BOOL=${SimMedTK_BUILD_SHARED_LIBS}
+      -DVRPN_USE_SHARED_LIBRARY:BOOL=${SimMedTK_BUILD_SHARED_LIBS}
       -DCMAKE_INCLUDE_PATH:STRING=${SimMedTK_CMAKE_INCLUDE_PATH}
       -DCMAKE_LIBRARY_PATH:STRING=${SimMedTK_CMAKE_LIBRARY_PATH}
       -DVRPN_SUBPROJECT_BUILD:BOOL=ON
@@ -76,11 +88,11 @@ if(NOT DEFINED ${proj}_DIR)
       -DVRPN_INSTALL:BOOL=OFF
       -DVRPN_BUILD_PYTHON:BOOL=OFF
       -DVRPN_USE_GPM_MOUSE:BOOL=OFF
-      -DVRPN_USE_LIBNIFALCON:BOOL=OFF
       -DBUILD_TESTING:BOOL=OFF
       ${CMAKE_OSX_EXTERNAL_PROJECT_ARGS}
       ${OUTPUT_DIRECTORIES}
       ${SERVER_ARGS}
+      ${VRPN_EP_ARGS}
     DEPENDS
       ${${proj}_DEPENDENCIES}
     LOG_DOWNLOAD 1            # Wrap download in script to log output
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ac2c3d2053f00ca83183a1919ebc6829c456ef8d..77fe7e18bf756cd36e92f0e05e26e40643eb2142 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,6 +52,7 @@ mark_as_advanced(SimMedTK_SUPERBUILD)
 option(SimMedTK_USE_PHANTOM_OMNI "Use the phantom omni device." OFF)
 option(SimMedTK_USE_ADU "Use the adu device." OFF)
 option(SimMedTK_USE_NIUSB6008 "Use the NIUSB6008 device." OFF)
+option(SimMedTK_USE_FALCON "Use the Falcon device." OFF)
 
 #-----------------------------------------------------------------------------
 # VRPN options