diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b5cf5566221eace6fa97746e672ea288463c1fc6
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,159 @@
+## Version: $Id$
+##
+######################################################################
+##
+### Commentary:
+##
+######################################################################
+##
+### Change Log:
+##
+######################################################################
+##
+### Code:
+
+cmake_minimum_required(VERSION 3.0.0)
+
+######################################################################
+
+project(dtkWidgets)
+
+## ###################################################################
+## Version setup
+## ###################################################################
+
+set(${PROJECT_NAME}_VERSION_MAJOR 0)
+set(${PROJECT_NAME}_VERSION_MINOR 1)
+set(${PROJECT_NAME}_VERSION_PATCH 0)
+set(${PROJECT_NAME}_VERSION
+  ${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH})
+
+## ###################################################################
+## Output directory setup
+## ###################################################################
+
+include(GNUInstallDirs)
+
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
+
+## #################################################################
+## Install prefix
+## #################################################################
+
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install" CACHE PATH "${PROJECT_NAME} install prefix" FORCE)
+endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+
+## #################################################################
+## Generate compilation database
+## #################################################################
+
+set(CMAKE_EXPORT_COMPILE_COMMANDS "ON")
+
+## #################################################################
+## Build setup
+## #################################################################
+
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+## ###################################################################
+## Dependencies - cmake
+## ###################################################################
+
+include(GenerateExportHeader)
+
+## #################################################################
+## Dependencies - external
+## #################################################################
+
+find_package(Qt5Core    REQUIRED)
+find_package(Qt5Widgets REQUIRED)
+find_package(Qt5OpenGL  REQUIRED)
+find_package(Qt5Xml     REQUIRED)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+## #################################################################
+## Dependencies - internal
+## #################################################################
+
+include_directories(${CMAKE_BINARY_DIR})
+include_directories(${CMAKE_SOURCE_DIR}/src)
+include_directories(${CMAKE_SOURCE_DIR}/src/dtkWidgets)
+
+## ###################################################################
+## Input
+## ###################################################################
+
+add_subdirectory(src)
+
+## ###################################################################
+## Exporting
+## ###################################################################
+
+export(PACKAGE ${PROJECT_NAME})
+
+configure_file(${CMAKE_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in
+  "${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY)
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.install.cmake.in
+  "${CMAKE_BINARY_DIR}/install/${PROJECT_NAME}Config.cmake" @ONLY)
+
+configure_file(${CMAKE_SOURCE_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake.in
+  "${CMAKE_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" @ONLY)
+
+install(FILES
+  "${CMAKE_BINARY_DIR}/install/${PROJECT_NAME}Config.cmake"
+  "${CMAKE_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
+  DESTINATION  ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
+
+install(EXPORT ${PROJECT_NAME}Depends DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
+
+## ###################################################################
+## Beautifying
+## ###################################################################
+
+mark_as_advanced(${PROJECT_NAME}_VERSION_MAJOR)
+mark_as_advanced(${PROJECT_NAME}_VERSION_MINOR)
+mark_as_advanced(${PROJECT_NAME}_VERSION_BUILD)
+
+mark_as_advanced(Qt5OpenGL_DIR)
+mark_as_advanced(Qt5Concurrent_DIR)
+mark_as_advanced(Qt5Core_DIR)
+mark_as_advanced(Qt5Declarative_DIR)
+mark_as_advanced(Qt5Gui_DIR)
+mark_as_advanced(Qt5Network_DIR)
+mark_as_advanced(Qt5Qml_DIR)
+mark_as_advanced(Qt5Quick_DIR)
+mark_as_advanced(Qt5QuickTest_DIR)
+mark_as_advanced(Qt5Script_DIR)
+mark_as_advanced(Qt5Test_DIR)
+mark_as_advanced(Qt5Widgets_DIR)
+mark_as_advanced(Qt5Xml_DIR)
+mark_as_advanced(Qt5Sql_DIR)
+
+mark_as_advanced(CMAKE_AR)
+mark_as_advanced(CMAKE_BUILD_TYPE)
+mark_as_advanced(CMAKE_INSTALL_PREFIX)
+mark_as_advanced(CMAKE_OSX_ARCHITECTURES)
+mark_as_advanced(CMAKE_OSX_DEPLOYMENT_TARGET)
+mark_as_advanced(CMAKE_OSX_SYSROOT)
+
+## ###################################################################
+## Packaging
+## ###################################################################
+
+include(InstallRequiredSystemLibraries)
+
+set(CPACK_PACKAGE_VERSION_MAJOR "${${PROJECT_NAME}_VERSION_MAJOR}")
+set(CPACK_PACKAGE_VERSION_MINOR "${${PROJECT_NAME}_VERSION_MINOR}")
+set(CPACK_PACKAGE_VERSION_PATCH "${${PROJECT_NAME}_VERSION_PATCH}")
+
+include(CPack)
+
+######################################################################
+### CMakeLists.txt ends here
diff --git a/cmake/dtkWidgetsConfig.cmake.in b/cmake/dtkWidgetsConfig.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..f0349dfe9c9265a1426ac7df3aa5ddaae0305a55
--- /dev/null
+++ b/cmake/dtkWidgetsConfig.cmake.in
@@ -0,0 +1,23 @@
+## Version: $Id$
+##
+######################################################################
+##
+### Commentary:
+##
+######################################################################
+##
+### Change Log:
+##
+######################################################################
+##
+### Code:
+
+set(dtkWidgets_INCLUDE_DIRS
+  "@CMAKE_CURRENT_SOURCE_DIR@/src"
+  "@CMAKE_CURRENT_SOURCE_DIR@/src/dtkWidgets"
+  "@CMAKE_CURRENT_BINARY_DIR@")
+
+include("@CMAKE_BINARY_DIR@/dtkWidgetsDepends.cmake")
+
+######################################################################
+### dtkWidgetsConfig.cmake.in ends here
diff --git a/cmake/dtkWidgetsConfig.install.cmake.in b/cmake/dtkWidgetsConfig.install.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..c43efe94e0a4c719e824bdee73688f9203a8fe50
--- /dev/null
+++ b/cmake/dtkWidgetsConfig.install.cmake.in
@@ -0,0 +1,22 @@
+## Version: $Id$
+##
+######################################################################
+##
+### Commentary:
+##
+######################################################################
+##
+### Change Log:
+##
+######################################################################
+##
+### Code:
+
+set(dtkWidgets_INCLUDE_DIRS
+  "@CMAKE_INSTALL_PREFIX@/include"
+  "@CMAKE_INSTALL_PREFIX@/include/dtkWidgets")
+
+include("@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/cmake/dtkWidgets/dtkWidgetsDepends.cmake")
+
+######################################################################
+### dtkWidgetsConfig.install.cmake.in ends here
diff --git a/cmake/dtkWidgetsConfigVersion.cmake.in b/cmake/dtkWidgetsConfigVersion.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..6111d027f2129192a9b60dfc1a570661321564fa
--- /dev/null
+++ b/cmake/dtkWidgetsConfigVersion.cmake.in
@@ -0,0 +1,27 @@
+## Version: $Id$
+##
+######################################################################
+##
+### Commentary:
+##
+######################################################################
+##
+### Change Log:
+##
+######################################################################
+##
+### Code:
+
+set(PACKAGE_VERSION "@dtkWidgets_VERSION@")
+
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
+  set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+  set(PACKAGE_VERSION_COMPATIBLE TRUE)
+  if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
+    set(PACKAGE_VERSION_EXACT TRUE)
+  endif()
+endif()
+
+######################################################################
+### dtkWidgetsConfigVersion.cmake.in ends here