diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml
index 129b5aaafa..5f3601524e 100644
--- a/.github/workflows/build-linux.yml
+++ b/.github/workflows/build-linux.yml
@@ -1,6 +1,14 @@
 name: Linux CI
 
-on: [pull_request]
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
 
 jobs:
   build:
diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml
index 3fa3c15dde..61b71e8604 100644
--- a/.github/workflows/build-macos.yml
+++ b/.github/workflows/build-macos.yml
@@ -1,6 +1,14 @@
 name: macOS CI
 
-on: [pull_request]
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+    
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
 
 jobs:
   build:
diff --git a/.github/workflows/build-python.yml b/.github/workflows/build-python.yml
index f09d589dcf..45d1dacb99 100644
--- a/.github/workflows/build-python.yml
+++ b/.github/workflows/build-python.yml
@@ -1,6 +1,14 @@
 name: Python CI
 
-on: [pull_request]
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+    
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
 
 jobs:
   build:
diff --git a/.github/workflows/build-special.yml b/.github/workflows/build-special.yml
index f72dadbae0..414c6cb587 100644
--- a/.github/workflows/build-special.yml
+++ b/.github/workflows/build-special.yml
@@ -1,6 +1,14 @@
 name: Special Cases CI
 
-on: [pull_request]
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+    
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
 
 jobs:
   build:
diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml
index 0434577c10..ecbf224aea 100644
--- a/.github/workflows/build-windows.yml
+++ b/.github/workflows/build-windows.yml
@@ -1,6 +1,14 @@
 name: Windows CI
 
-on: [pull_request]
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+    
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
 
 jobs:
   build:
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
new file mode 100644
index 0000000000..b647c5c007
--- /dev/null
+++ b/.github/workflows/linux.yml
@@ -0,0 +1,77 @@
+name: Linux
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+  schedule:
+    - cron:  '10 12 * * 0'
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
+
+env:
+  BUILD_DIR: gtsam/3rdparty/linux
+  VCPKG_ROOT: gtsam/3rdparty/linux/vcpkg
+  VCPKG_LINK: https://github.com/microsoft/vcpkg/
+  VCPKG_CONFIGS: gtsam/3rdparty/vcpkg
+  BINARY_CACHE: gtsam/3rdparty/buildCache/linux
+
+jobs:
+  build:
+    name: vcpkg-ubuntu-22.04
+    runs-on: ubuntu-22.04
+    strategy:
+      fail-fast: false
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Cache dependencies
+        uses: actions/cache@v3
+        with:
+          path: |
+            gtsam/3rdparty/buildCache/linux
+          key: linux-${{ hashFiles('.github/workflows/linux.yml') }}
+
+      - name: Init vcpkg
+        if: success()
+        run: |        
+          mkdir -p $BUILD_DIR
+          git -C $BUILD_DIR clone $VCPKG_LINK
+          $VCPKG_ROOT/bootstrap-vcpkg.sh
+          $VCPKG_ROOT/vcpkg fetch ninja
+
+      - name: Vcpkg build & cmake config
+        if: success() 
+        run: |
+          export VCPKG_DEFAULT_BINARY_CACHE="$PWD/$BINARY_CACHE"
+          mkdir -p $VCPKG_DEFAULT_BINARY_CACHE
+          cmake . -B build \
+              -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \
+              -DVCPKG_MANIFEST_DIR=$VCPKG_CONFIGS/manifest \
+              -DVCPKG_INSTALLED_DIR=$VCPKG_ROOT/installed \
+              -DVCPKG_OVERLAY_TRIPLETS=$VCPKG_CONFIGS/triplets \
+              -DVCPKG_TARGET_TRIPLET=x64-linux \
+              -DVCPKG_INSTALL_OPTIONS=--clean-after-build \
+              -DGTSAM_BUILD_EXAMPLES_ALWAYS=ON \
+              -DGTSAM_ROT3_EXPMAP=ON \
+              -DGTSAM_POSE3_EXPMAP=ON \
+              -DGTSAM_BUILD_PYTHON=ON \
+              -DGTSAM_BUILD_TESTS=ON \
+              -DGTSAM_BUILD_UNSTABLE=ON \
+              -DGTSAM_USE_SYSTEM_EIGEN=ON \
+              -DGTSAM_USE_SYSTEM_METIS=ON \
+              -DGTSAM_SUPPORT_NESTED_DISSECTION=ON
+
+      - name: Cmake build
+        if: success()
+        run: |
+          cmake --build build --config Release -j 2
+
+      - name: Run tests
+        if: success() 
+        run: |
+          # Currently tests aren't compile. Tests needed to be fix, then remove these comments.
+          # cmake --build build --target check -j 2
diff --git a/.github/workflows/osx.yml b/.github/workflows/osx.yml
new file mode 100644
index 0000000000..d66923b374
--- /dev/null
+++ b/.github/workflows/osx.yml
@@ -0,0 +1,85 @@
+name: OSX
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+  schedule:
+    - cron:  '10 12 * * 0'
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
+
+env:
+  BUILD_DIR: gtsam/3rdparty/osx
+  VCPKG_ROOT: gtsam/3rdparty/osx/vcpkg
+  VCPKG_LINK: https://github.com/microsoft/vcpkg/
+  VCPKG_CONFIGS: gtsam/3rdparty/vcpkg
+  BINARY_CACHE: gtsam/3rdparty/buildCache/osx
+
+jobs:
+  build:
+    name: vcpkg-macos-12
+    runs-on: macos-12
+    strategy:
+      fail-fast: false
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Cache dependencies
+        uses: actions/cache@v3
+        with:
+          path: |
+            gtsam/3rdparty/buildCache/osx
+          key: osx-${{ hashFiles('.github/workflows/osx.yml') }}
+
+      - name: Install Dependencies
+        run: |
+          sudo xcode-select -switch /Applications/Xcode.app
+
+      - name: Install python packages
+        if: success()
+        run: |
+          pip3 install pyparsing
+
+      - name: Init vcpkg
+        if: success()
+        run: |        
+          mkdir -p $BUILD_DIR
+          git -C $BUILD_DIR clone $VCPKG_LINK
+          $VCPKG_ROOT/bootstrap-vcpkg.sh
+
+      - name: Vcpkg build & cmake config
+        if: success() 
+        run: |
+          export VCPKG_DEFAULT_BINARY_CACHE="$PWD/$BINARY_CACHE"
+          mkdir -p $VCPKG_DEFAULT_BINARY_CACHE
+          cmake . -B build \
+              -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \
+              -DVCPKG_MANIFEST_DIR=$VCPKG_CONFIGS/manifest \
+              -DVCPKG_INSTALLED_DIR=$VCPKG_ROOT/installed \
+              -DVCPKG_OVERLAY_TRIPLETS=$VCPKG_CONFIGS/triplets \
+              -DVCPKG_TARGET_TRIPLET=x64-osx \
+              -DVCPKG_INSTALL_OPTIONS=--clean-after-build \
+              -DGTSAM_BUILD_EXAMPLES_ALWAYS=ON \
+              -DGTSAM_ROT3_EXPMAP=ON \
+              -DGTSAM_POSE3_EXPMAP=ON \
+              -DGTSAM_BUILD_PYTHON=ON \
+              -DGTSAM_BUILD_TESTS=ON \
+              -DGTSAM_BUILD_UNSTABLE=ON \
+              -DGTSAM_USE_SYSTEM_EIGEN=ON \
+              -DGTSAM_USE_SYSTEM_METIS=ON \
+              -DGTSAM_SUPPORT_NESTED_DISSECTION=ON
+
+      - name: Cmake build
+        if: success()
+        run: |
+          cmake --build build --config Release -j 2
+
+      - name: Run tests
+        if: success() 
+        run: |
+          # Currently tests aren't compile. Tests needed to be fix, then remove these comments.
+          # cmake --build build --target check -j 2
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
new file mode 100644
index 0000000000..cad34eff26
--- /dev/null
+++ b/.github/workflows/windows.yml
@@ -0,0 +1,90 @@
+name: Windows
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+  schedule:
+    - cron:  '10 12 * * 0'
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
+
+env:
+  BUILD_DIR: gtsam\3rdparty\windows
+  VCPKG_ROOT: gtsam\3rdparty\windows\vcpkg
+  VCPKG_LINK: https://github.com/microsoft/vcpkg/
+  VCPKG_CONFIGS: gtsam\3rdparty\vcpkg
+  BINARY_CACHE: gtsam\3rdparty\buildCache\windows
+  PYTHON: c:\hostedtoolcache\windows\Python\3.11.1\x64\Scripts\pip3.exe
+
+jobs:
+  build:
+    name: vcpkg-windows-2022
+    runs-on: windows-2022
+    strategy:
+      fail-fast: false
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Cache dependencies
+        uses: actions/cache@v3
+        with:
+          path: |
+            gtsam/3rdparty/buildCache/windows
+          key: windows-${{ hashFiles('.github/workflows/windows.yml') }}
+
+      - name: Install python packages
+        if: success()
+        shell: cmd
+        run: |
+          pip3 install pyparsing
+
+      - name: Fix vcpkg
+        run: vcpkg.exe integrate remove
+
+      - name: Init vcpkg
+        if: success()
+        shell: cmd
+        run: |        
+          mkdir -p %BUILD_DIR%
+          git -C %BUILD_DIR% clone %VCPKG_LINK%
+          %VCPKG_ROOT%\bootstrap-vcpkg.bat
+
+      - name: Vcpkg build & cmake config
+        if: success()
+        shell: cmd
+        run: |
+          set "VCPKG_DEFAULT_BINARY_CACHE=%CD%\%BINARY_CACHE%"
+          mkdir %VCPKG_DEFAULT_BINARY_CACHE%
+          cmake . -B build ^
+              -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake ^
+              -DVCPKG_MANIFEST_DIR=%VCPKG_CONFIGS%\manifest ^
+              -DVCPKG_INSTALLED_DIR=%VCPKG_ROOT%\installed ^
+              -DVCPKG_OVERLAY_TRIPLETS=%VCPKG_CONFIGS%\triplets ^
+              -DVCPKG_TARGET_TRIPLET=x64-windows ^
+              -DVCPKG_INSTALL_OPTIONS=--clean-after-build ^
+              -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF ^
+              -DGTSAM_ROT3_EXPMAP=OFF ^
+              -DGTSAM_POSE3_EXPMAP=OFF ^
+              -DGTSAM_BUILD_PYTHON=OFF ^
+              -DGTSAM_BUILD_TESTS=ON ^
+              -DGTSAM_BUILD_UNSTABLE=OFF ^
+              -DGTSAM_USE_SYSTEM_EIGEN=ON ^
+              -DGTSAM_USE_SYSTEM_METIS=ON ^
+              -DGTSAM_SUPPORT_NESTED_DISSECTION=ON
+
+      - name: Cmake build
+        if: success()
+        shell: cmd
+        run: |
+          cmake --build build --config Release -j 2
+
+      - name: Run tests
+        if: success() 
+        shell: cmd
+        run: |
+          :: Currently tests aren't compile. Tests needed to be fix, then remove these comments.
+          :: cmake --build build --target check -j 2
diff --git a/cmake/FindTBB.cmake b/cmake/FindTBB.cmake
deleted file mode 100644
index 0ecd4ca0e3..0000000000
--- a/cmake/FindTBB.cmake
+++ /dev/null
@@ -1,323 +0,0 @@
-# The MIT License (MIT)
-#
-# Copyright (c) 2015 Justus Calvin
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-#
-# FindTBB
-# -------
-#
-# Find TBB include directories and libraries.
-#
-# Usage:
-#
-#  find_package(TBB [major[.minor]] [EXACT]
-#               [QUIET] [REQUIRED]
-#               [[COMPONENTS] [components...]]
-#               [OPTIONAL_COMPONENTS components...])
-#
-# where the allowed components are tbbmalloc and tbb_preview. Users may modify
-# the behavior of this module with the following variables:
-#
-# * TBB_ROOT_DIR          - The base directory the of TBB installation.
-# * TBB_INCLUDE_DIR       - The directory that contains the TBB headers files.
-# * TBB_LIBRARY           - The directory that contains the TBB library files.
-# * TBB_<library>_LIBRARY - The path of the TBB the corresponding TBB library.
-#                           These libraries, if specified, override the
-#                           corresponding library search results, where <library>
-#                           may be tbb, tbb_debug, tbbmalloc, tbbmalloc_debug,
-#                           tbb_preview, or tbb_preview_debug.
-# * TBB_USE_DEBUG_BUILD   - The debug version of tbb libraries, if present, will
-#                           be used instead of the release version.
-#
-# Users may modify the behavior of this module with the following environment
-# variables:
-#
-# * TBB_INSTALL_DIR
-# * TBBROOT
-# * LIBRARY_PATH
-#
-# This module will set the following variables:
-#
-# * TBB_FOUND             - Set to false, or undefined, if we haven’t found, or
-#                           don’t want to use TBB.
-# * TBB_<component>_FOUND - If False, optional <component> part of TBB sytem is
-#                           not available.
-# * TBB_VERSION           - The full version string
-# * TBB_VERSION_MAJOR     - The major version
-# * TBB_VERSION_MINOR     - The minor version
-# * TBB_INTERFACE_VERSION - The interface version number defined in
-#                           tbb/tbb_stddef.h.
-# * TBB_<library>_LIBRARY_RELEASE - The path of the TBB release version of
-#                           <library>, where <library> may be tbb, tbb_debug,
-#                           tbbmalloc, tbbmalloc_debug, tbb_preview, or
-#                           tbb_preview_debug.
-# * TBB_<library>_LIBRARY_DEGUG - The path of the TBB release version of
-#                           <library>, where <library> may be tbb, tbb_debug,
-#                           tbbmalloc, tbbmalloc_debug, tbb_preview, or
-#                           tbb_preview_debug.
-#
-# The following varibles should be used to build and link with TBB:
-#
-# * TBB_INCLUDE_DIRS        - The include directory for TBB.
-# * TBB_LIBRARIES           - The libraries to link against to use TBB.
-# * TBB_LIBRARIES_RELEASE   - The release libraries to link against to use TBB.
-# * TBB_LIBRARIES_DEBUG     - The debug libraries to link against to use TBB.
-# * TBB_DEFINITIONS         - Definitions to use when compiling code that uses
-#                             TBB.
-# * TBB_DEFINITIONS_RELEASE - Definitions to use when compiling release code that
-#                             uses TBB.
-# * TBB_DEFINITIONS_DEBUG   - Definitions to use when compiling debug code that
-#                             uses TBB.
-#
-# This module will also create the "tbb" target that may be used when building
-# executables and libraries.
-
-include(FindPackageHandleStandardArgs)
-
-if(NOT TBB_FOUND)
-
-  ##################################
-  # Check the build type
-  ##################################
-
-  if(NOT DEFINED TBB_USE_DEBUG_BUILD)
-    # Set build type to RELEASE by default for optimization.
-    set(TBB_BUILD_TYPE RELEASE)
-  elseif(TBB_USE_DEBUG_BUILD)
-    set(TBB_BUILD_TYPE DEBUG)
-  else()
-    set(TBB_BUILD_TYPE RELEASE)
-  endif()
-
-  ##################################
-  # Set the TBB search directories
-  ##################################
-
-  # Define search paths based on user input and environment variables
-  set(TBB_SEARCH_DIR ${TBB_ROOT_DIR} $ENV{TBB_INSTALL_DIR} $ENV{TBBROOT})
-
-  # Define the search directories based on the current platform
-  if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
-    set(TBB_DEFAULT_SEARCH_DIR "C:/Program Files/Intel/TBB"
-                               "C:/Program Files (x86)/Intel/TBB")
-
-    # Set the target architecture
-    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-      set(TBB_ARCHITECTURE "intel64")
-    else()
-      set(TBB_ARCHITECTURE "ia32")
-    endif()
-
-    # Set the TBB search library path search suffix based on the version of VC
-    if(WINDOWS_STORE)
-      set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11_ui")
-    elseif(MSVC14)
-      set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc14")
-    elseif(MSVC12)
-      set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc12")
-    elseif(MSVC11)
-      set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11")
-    elseif(MSVC10)
-      set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc10")
-    endif()
-
-    # Add the library path search suffix for the VC independent version of TBB
-    list(APPEND TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc_mt")
-
-  elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
-    # OS X
-    set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb"
-                               "/usr/local/opt/tbb")
-
-    # TODO: Check to see which C++ library is being used by the compiler.
-    if(NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 13.0)
-      # The default C++ library on OS X 10.9 and later is libc++
-      set(TBB_LIB_PATH_SUFFIX "lib/libc++" "lib")
-    else()
-      set(TBB_LIB_PATH_SUFFIX "lib")
-    endif()
-  elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
-    # Linux
-    set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb")
-
-    # TODO: Check compiler version to see the suffix should be <arch>/gcc4.1 or
-    #       <arch>/gcc4.1. For now, assume that the compiler is more recent than
-    #       gcc 4.4.x or later.
-    if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
-      set(TBB_LIB_PATH_SUFFIX "lib/intel64/gcc4.4")
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
-      set(TBB_LIB_PATH_SUFFIX "lib/ia32/gcc4.4")
-    endif()
-  endif()
-
-  ##################################
-  # Find the TBB include dir
-  ##################################
-
-  find_path(TBB_INCLUDE_DIRS tbb/tbb.h
-      HINTS ${TBB_INCLUDE_DIR} ${TBB_SEARCH_DIR}
-      PATHS ${TBB_DEFAULT_SEARCH_DIR}
-      PATH_SUFFIXES include)
-
-  ##################################
-  # Set version strings
-  ##################################
-
-  if(TBB_INCLUDE_DIRS)
-    set(_tbb_version_file_prior_to_tbb_2021_1 "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h")
-    set(_tbb_version_file_after_tbb_2021_1 "${TBB_INCLUDE_DIRS}/oneapi/tbb/version.h")
-
-    if (EXISTS "${_tbb_version_file_prior_to_tbb_2021_1}")
-      file(READ "${_tbb_version_file_prior_to_tbb_2021_1}" _tbb_version_file )
-    elseif (EXISTS "${_tbb_version_file_after_tbb_2021_1}")
-      file(READ "${_tbb_version_file_after_tbb_2021_1}" _tbb_version_file )
-    else()
-        message(FATAL_ERROR "Found TBB installation: ${TBB_INCLUDE_DIRS} "
-      "missing version header.")
-    endif()
-
-    string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1"
-        TBB_VERSION_MAJOR "${_tbb_version_file}")
-    string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1"
-        TBB_VERSION_MINOR "${_tbb_version_file}")
-    string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1"
-        TBB_INTERFACE_VERSION "${_tbb_version_file}")
-    set(TBB_VERSION "${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR}")
-  endif()
-
-  ##################################
-  # Find TBB components
-  ##################################
-
-  if(TBB_VERSION VERSION_LESS 4.3)
-    set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc tbb)
-  else()
-    set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc_proxy tbbmalloc tbb)
-  endif()
-
-  # Find each component
-  foreach(_comp ${TBB_SEARCH_COMPOMPONENTS})
-    if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};")
-
-      # Search for the libraries
-      find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}
-          HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
-          PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
-          PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX})
-
-      find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}_debug
-          HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
-          PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
-          PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX})
-
-      if(TBB_${_comp}_LIBRARY_DEBUG)
-        list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}")
-      endif()
-      if(TBB_${_comp}_LIBRARY_RELEASE)
-        list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}")
-      endif()
-      if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY)
-        set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}")
-      endif()
-
-      if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}")
-        set(TBB_${_comp}_FOUND TRUE)
-      else()
-        set(TBB_${_comp}_FOUND FALSE)
-      endif()
-
-      # Mark internal variables as advanced
-      mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE)
-      mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG)
-      mark_as_advanced(TBB_${_comp}_LIBRARY)
-
-    endif()
-  endforeach()
-
-  ##################################
-  # Set compile flags and libraries
-  ##################################
-
-  set(TBB_DEFINITIONS_RELEASE "")
-  set(TBB_DEFINITIONS_DEBUG "-DTBB_USE_DEBUG=1")
-
-  if(TBB_LIBRARIES_${TBB_BUILD_TYPE})
-    set(TBB_DEFINITIONS "${TBB_DEFINITIONS_${TBB_BUILD_TYPE}}")
-    set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}")
-  elseif(TBB_LIBRARIES_RELEASE)
-    set(TBB_DEFINITIONS "${TBB_DEFINITIONS_RELEASE}")
-    set(TBB_LIBRARIES "${TBB_LIBRARIES_RELEASE}")
-  elseif(TBB_LIBRARIES_DEBUG)
-    set(TBB_DEFINITIONS "${TBB_DEFINITIONS_DEBUG}")
-    set(TBB_LIBRARIES "${TBB_LIBRARIES_DEBUG}")
-  endif()
-
-  find_package_handle_standard_args(TBB
-      REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES
-      HANDLE_COMPONENTS
-      VERSION_VAR TBB_VERSION)
-
-  ##################################
-  # Create targets
-  ##################################
-
-  if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND)
-    # Start fix to support different targets for tbb, tbbmalloc, etc.
-    # (Jose Luis Blanco, Jan 2019)
-    # Iterate over tbb, tbbmalloc, etc.
-    foreach(libname ${TBB_SEARCH_COMPOMPONENTS})
-      if ((NOT TBB_${libname}_LIBRARY_RELEASE) AND (NOT TBB_${libname}_LIBRARY_DEBUG))
-        continue()
-      endif()
-
-      add_library(${libname} SHARED IMPORTED)
-
-      set_target_properties(${libname} PROPERTIES
-            INTERFACE_INCLUDE_DIRECTORIES  ${TBB_INCLUDE_DIRS}
-            IMPORTED_LOCATION              ${TBB_${libname}_LIBRARY_RELEASE})
-      if(TBB_${libname}_LIBRARY_RELEASE AND TBB_${libname}_LIBRARY_DEBUG)
-        set_target_properties(${libname} PROPERTIES
-            INTERFACE_COMPILE_DEFINITIONS "$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:TBB_USE_DEBUG=1>"
-            IMPORTED_LOCATION_DEBUG          ${TBB_${libname}_LIBRARY_DEBUG}
-            IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_${libname}_LIBRARY_DEBUG}
-            IMPORTED_LOCATION_RELEASE        ${TBB_${libname}_LIBRARY_RELEASE}
-            IMPORTED_LOCATION_MINSIZEREL     ${TBB_${libname}_LIBRARY_RELEASE}
-            )
-      elseif(TBB_${libname}_LIBRARY_RELEASE)
-        set_target_properties(${libname} PROPERTIES IMPORTED_LOCATION ${TBB_${libname}_LIBRARY_RELEASE})
-      else()
-        set_target_properties(${libname} PROPERTIES
-            INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS_DEBUG}"
-            IMPORTED_LOCATION              ${TBB_${libname}_LIBRARY_DEBUG}
-            )
-      endif()
-    endforeach()
-    # End of fix to support different targets
-  endif()
-
-  mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES)
-
-  unset(TBB_ARCHITECTURE)
-  unset(TBB_BUILD_TYPE)
-  unset(TBB_LIB_PATH_SUFFIX)
-  unset(TBB_DEFAULT_SEARCH_DIR)
-
-endif()
diff --git a/cmake/HandleMetis.cmake b/cmake/HandleMetis.cmake
index 5cbec4ff58..10dbb53de5 100644
--- a/cmake/HandleMetis.cmake
+++ b/cmake/HandleMetis.cmake
@@ -13,10 +13,9 @@ option(GTSAM_USE_SYSTEM_METIS "Find and use system-installed libmetis. If 'off',
 if(GTSAM_USE_SYSTEM_METIS)
   # Debian package: libmetis-dev
 
-  find_path(METIS_INCLUDE_DIR metis.h REQUIRED)
-  find_library(METIS_LIBRARY metis REQUIRED)
+  find_package(metis CONFIG REQUIRED)
 
-  if(METIS_INCLUDE_DIR AND METIS_LIBRARY)
+  if(metis_FOUND)
     mark_as_advanced(METIS_INCLUDE_DIR)
     mark_as_advanced(METIS_LIBRARY)
 
@@ -27,7 +26,7 @@ if(GTSAM_USE_SYSTEM_METIS)
       $<BUILD_INTERFACE:${GTSAM_SOURCE_DIR}/gtsam/3rdparty/metis/libmetis>
       $<BUILD_INTERFACE:${GTSAM_SOURCE_DIR}/gtsam/3rdparty/metis/GKlib>
     )
-    target_link_libraries(metis-gtsam-if INTERFACE ${METIS_LIBRARY})
+    target_link_libraries(metis-gtsam-if INTERFACE ${METIS_LIBRARY} metis)
   endif()
 else()
   # Bundled version:
diff --git a/cmake/HandleTBB.cmake b/cmake/HandleTBB.cmake
index fb944ba5b5..393aeb3456 100644
--- a/cmake/HandleTBB.cmake
+++ b/cmake/HandleTBB.cmake
@@ -14,7 +14,7 @@ if (GTSAM_WITH_TBB)
         endif()
         # all definitions and link requisites will go via imported targets:
         # tbb & tbbmalloc
-        list(APPEND GTSAM_ADDITIONAL_LIBRARIES tbb tbbmalloc)
+        list(APPEND GTSAM_ADDITIONAL_LIBRARIES TBB::tbb TBB::tbbmalloc)
     else()
         set(GTSAM_USE_TBB 0)  # This will go into config.h
     endif()
diff --git a/gtsam/3rdparty/vcpkg/manifest/vcpkg.json b/gtsam/3rdparty/vcpkg/manifest/vcpkg.json
new file mode 100644
index 0000000000..102b965236
--- /dev/null
+++ b/gtsam/3rdparty/vcpkg/manifest/vcpkg.json
@@ -0,0 +1,25 @@
+{
+  "name": "gtsam",
+  "description": "Georgia Tech Smoothing and Mapping Library.",
+  "homepage": "gtsam.org",
+  "dependencies": [
+    "boost-assign",
+    "boost-bimap",
+    "boost-chrono",
+    "boost-date-time",
+    "boost-filesystem",
+    "boost-format",
+    "boost-graph",
+    "boost-math",
+    "boost-program-options",
+    "boost-regex",
+    "boost-serialization",
+    "boost-system",
+    "boost-thread",
+    "boost-timer",
+    "eigen3",
+    "metis",
+    "tbb",
+    "geographiclib"
+  ]
+}
diff --git a/gtsam/3rdparty/vcpkg/triplets/x64-linux.cmake b/gtsam/3rdparty/vcpkg/triplets/x64-linux.cmake
new file mode 100644
index 0000000000..bcf748a9cc
--- /dev/null
+++ b/gtsam/3rdparty/vcpkg/triplets/x64-linux.cmake
@@ -0,0 +1,5 @@
+set(VCPKG_BUILD_TYPE release)
+set(VCPKG_TARGET_ARCHITECTURE x64)
+set(VCPKG_CRT_LINKAGE dynamic)
+set(VCPKG_LIBRARY_LINKAGE static)
+set(VCPKG_CMAKE_SYSTEM_NAME Linux)
diff --git a/gtsam/3rdparty/vcpkg/triplets/x64-osx.cmake b/gtsam/3rdparty/vcpkg/triplets/x64-osx.cmake
new file mode 100644
index 0000000000..0073b5daed
--- /dev/null
+++ b/gtsam/3rdparty/vcpkg/triplets/x64-osx.cmake
@@ -0,0 +1,8 @@
+set(VCPKG_BUILD_TYPE release)
+set(VCPKG_TARGET_ARCHITECTURE x64)
+set(VCPKG_CRT_LINKAGE dynamic)
+set(VCPKG_LIBRARY_LINKAGE static)
+
+set(VCPKG_CMAKE_SYSTEM_NAME Darwin)
+set(VCPKG_OSX_ARCHITECTURES x86_64)
+
diff --git a/gtsam/3rdparty/vcpkg/triplets/x64-windows.cmake b/gtsam/3rdparty/vcpkg/triplets/x64-windows.cmake
new file mode 100644
index 0000000000..17dc398fc1
--- /dev/null
+++ b/gtsam/3rdparty/vcpkg/triplets/x64-windows.cmake
@@ -0,0 +1,5 @@
+set(VCPKG_BUILD_TYPE release)
+set(VCPKG_TARGET_ARCHITECTURE x64)
+set(VCPKG_CRT_LINKAGE dynamic)
+set(VCPKG_LIBRARY_LINKAGE dynamic)
+