diff --git a/CMakeLists.txt b/CMakeLists.txt
index 619bfedd4f73a27d4c91cd2a1074878c30f5308a..2d2ef573a582c83e5fdc273326b7111e2594cfeb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,13 +28,14 @@ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} -LE Fullcheck)
 add_custom_target(fullcheck COMMAND ${CMAKE_CTEST_COMMAND})
    # => 'make check' is an alias for 'ctest'
 
-## declare project-wide user flags, and set default values
+## Project-wide user flags
 
-# options that can be switched off to simplify the build and reduce its scope
+# options that are on by default (switch off for accelerated builds of limited scope)
 option(BORNAGAIN_PYTHON "Build with python support" ON)
 option(BORNAGAIN_GUI "Build a graphical user interface" ON)
 option(BORNAGAIN_TIFF_SUPPORT "Tiff files read/write support" ON)
 
+# options that are off by default (switch on for additional functionality)
 option(BORNAGAIN_MPI "Build with MPI support" OFF)
 option(SLOWTESTS "CTest also covers slow tests" OFF)
 
@@ -63,44 +64,50 @@ if(ALLCONFIG)
     set(CONFIGURE_DOXY ON)
 endif()
 
-# include CMake macros and functions
-#--- Setup details depending on the major platform type ---
+## Various CMake settings (include order is of critical importance)
+
+# function definitions
+include(commons/GetFilenameComponent) # overwrite CMake command
+
+include(BornAgain/Directories)
 
 if(CMAKE_SYSTEM_NAME MATCHES Linux)
     include(BornAgain/Linux)
+    include(BornAgain/NixInstall)
 elseif(APPLE)
     include(BornAgain/MacOS)
+    include(BornAgain/NixInstall)
 elseif(WIN32)
     include(BornAgain/Windows)
 endif()
 
-include(commons/GetFilenameComponent) # overwrite CMake command
-include(BornAgain/Directories)
 include(BornAgain/Compiler)
-include(BornAgain/Dependences)
 if(ZERO_TOLERANCE)
     string(APPEND CMAKE_CXX_FLAGS " -Werror -Wfatal-errors")
 endif()
+
+include(BornAgain/Dependences)
 if(BORNAGAIN_GUI)
     include(BornAgain/Qt)
     string(APPEND CMAKE_CXX_FLAGS " -DHAVE_QT=ON")
 endif()
 include(BornAgain/Config)
 include(BornAgain/PythonDocs)
-include(BornAgain/LineLength)
 
 # debug optimization
 if(BORNAGAIN_DEBUG_OPTIMIZATION)
   include(commons/DebugOptimization)
 endif()
 
-# code coverage analysis
+# code analysis
+include(BornAgain/LineLength)
 if(BORNAGAIN_COVERAGE)
   include(commons/CoverageFunction)
   include(BornAgain/Coverage)
 endif()
 
-# recurse into the given subdirectories
+## recurse into the given subdirectories
+
 if(BORNAGAIN_USERMANUAL)
     add_subdirectory(Doc/UserManual)
 endif()
diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt
index 2c90cb7a7a1b07868d1b328a5a232010178caeb7..7fe50862f6b75129576f58bb2bec1ab99596e36f 100644
--- a/Core/CMakeLists.txt
+++ b/Core/CMakeLists.txt
@@ -263,37 +263,6 @@ if(WIN32)
     endforeach()
     message(STATUS "Other dlls: ${DLL_MSG}")
 
-else()
-    # Install thisbornagain.sh.
-    install(FILES
-                ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.sh
-                ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.csh
-        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
-        GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ
-        DESTINATION ${destination_libexec})
-
-    if(NOT BORNAGAIN_APPLE_BUNDLE AND NOT BUILD_DEBIAN)
-        # Create bin directory for links.
-        install(CODE "
-            FILE(MAKE_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
-            "
-            COMPONENT Runtime)
-        # Make links.
-        install(CODE "
-        execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink
-        \"../${destination_libexec}/thisbornagain.sh\" \"thisbornagain.sh\"
-        WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
-        " COMPONENT Runtime)
-        install(CODE "
-        execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink
-        \"../${destination_libexec}/thisbornagain.csh\" \"thisbornagain.csh\"
-        WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
-        " COMPONENT Runtime)
-    else()
-
-        install(FILES ${WRAP_DIR}/python/bornagain_python_install.py
-            DESTINATION ${destination_libexec})
-    endif()
 endif()
 
 # Install bornagain/__init__.py and utilites
diff --git a/cmake/BornAgain/Config.cmake b/cmake/BornAgain/Config.cmake
index 72ce1d8a4b68a09ef3e1ba3f5302814f0f052c84..bd48224c063cf03230168482f1e317191908f46e 100644
--- a/cmake/BornAgain/Config.cmake
+++ b/cmake/BornAgain/Config.cmake
@@ -2,67 +2,6 @@
 # BornAgain project configuration
 ###############################################################################
 
-# -----------------------------------------------------------------------------
-# file extensions
-# -----------------------------------------------------------------------------
-
-if(WIN32)
-    set(libprefix _lib)
-    set(libsuffix .dll)
-elseif(APPLE)
-    set(libprefix _lib)
-    set(libsuffix .so)
-else()
-    set(libprefix _lib)
-    set(libsuffix .so)
-endif()
-
-# -----------------------------------------------------------------------------
-# destinations
-# -----------------------------------------------------------------------------
-
-if(WIN32)
-    set(destination_bin bin)
-    set(destination_lib ${destination_bin})
-    set(destination_gui bin)
-    set(destination_include include)
-    set(destination_examples Examples)
-    set(destination_images Images)
-    set(destination_libexec python)
-else()
-    set(destination_suffix BornAgain-${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR})
-    if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
-        set(destination_bundle BornAgain.app)
-        set(destination_prefix ${destination_bundle}/Contents/)
-        set(destination_libexec ${destination_prefix}libexec/${destination_suffix})
-    else()
-        if(APPLE)
-            set(QTDIR $ENV{QTDIR})
-            message(STATUS "QTDIR is ${QTDIR}")
-            set(CMAKE_INSTALL_RPATH ${QTDIR}/lib)
-        endif()
-        set(destination_prefix "")
-        set(destination_libexec ${destination_prefix}lib/${destination_suffix})
-    endif()
-    set(destination_bin ${destination_prefix}bin)
-    set(destination_gui ${destination_libexec})
-    set(destination_lib ${destination_prefix}lib/${destination_suffix})
-    set(destination_include ${destination_prefix}include/${destination_suffix})
-    set(destination_share ${destination_prefix}share/${destination_suffix}/)
-    set(destination_examples ${destination_share}Examples)
-    set(destination_images ${destination_share}Images)
-endif()
-
-message(STATUS "Destination directories:
-    bin->${destination_bin},
-    lib->${destination_lib},
-    gui->${destination_gui},
-    include->${destination_include},
-    share->${destination_share},
-    examples->${destination_examples},
-    images->${destination_images},
-    libexec->${destination_libexec}")
-
 # -----------------------------------------------------------------------------
 # configure files
 # -----------------------------------------------------------------------------
diff --git a/cmake/BornAgain/Directories.cmake b/cmake/BornAgain/Directories.cmake
index 36386c67183a1106212e6ad4c947b9261a43472d..85354d7ec01a18fe75fa684762bd3fb42fff7ce0 100644
--- a/cmake/BornAgain/Directories.cmake
+++ b/cmake/BornAgain/Directories.cmake
@@ -31,3 +31,64 @@ file(MAKE_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
 file(MAKE_DIRECTORY ${BUILD_VAR_DIR})
 file(MAKE_DIRECTORY ${BUILD_INC_DIR})
 file(MAKE_DIRECTORY ${BUILD_SRC_DIR})
+
+# -----------------------------------------------------------------------------
+# file extensions
+# -----------------------------------------------------------------------------
+
+if(WIN32)
+    set(libprefix _lib)
+    set(libsuffix .dll)
+elseif(APPLE)
+    set(libprefix _lib)
+    set(libsuffix .so)
+else()
+    set(libprefix _lib)
+    set(libsuffix .so)
+endif()
+
+# -----------------------------------------------------------------------------
+# destinations
+# -----------------------------------------------------------------------------
+
+if(WIN32)
+    set(destination_bin bin)
+    set(destination_lib ${destination_bin})
+    set(destination_gui bin)
+    set(destination_include include)
+    set(destination_examples Examples)
+    set(destination_images Images)
+    set(destination_libexec python)
+else()
+    set(destination_suffix BornAgain-${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR})
+    if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
+        set(destination_bundle BornAgain.app)
+        set(destination_prefix ${destination_bundle}/Contents/)
+        set(destination_libexec ${destination_prefix}libexec/${destination_suffix})
+    else()
+        if(APPLE)
+            set(QTDIR $ENV{QTDIR})
+            message(STATUS "QTDIR is ${QTDIR}")
+            set(CMAKE_INSTALL_RPATH ${QTDIR}/lib)
+        endif()
+        set(destination_prefix "")
+        set(destination_libexec ${destination_prefix}lib/${destination_suffix})
+    endif()
+    set(destination_bin ${destination_prefix}bin)
+    set(destination_gui ${destination_libexec})
+    set(destination_lib ${destination_prefix}lib/${destination_suffix})
+    set(destination_include ${destination_prefix}include/${destination_suffix})
+    set(destination_share ${destination_prefix}share/${destination_suffix}/)
+    set(destination_examples ${destination_share}Examples)
+    set(destination_images ${destination_share}Images)
+endif()
+
+message(STATUS "Destination directories:
+    bin->${destination_bin},
+    lib->${destination_lib},
+    gui->${destination_gui},
+    include->${destination_include},
+    share->${destination_share},
+    examples->${destination_examples},
+    images->${destination_images},
+    libexec->${destination_libexec}")
diff --git a/cmake/BornAgain/NixInstall.cmake b/cmake/BornAgain/NixInstall.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6c7bdfbb5155adf9902b1abb905a88e2d37f4b77
--- /dev/null
+++ b/cmake/BornAgain/NixInstall.cmake
@@ -0,0 +1,34 @@
+if(WIN32)
+    message(FATAL_ERROR "Invalid invocation of NixInstall.cmake")
+endif()
+
+# Install thisbornagain.sh.
+install(FILES
+    ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.sh
+    ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.csh
+    PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
+    GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ
+    DESTINATION ${destination_libexec})
+
+if(NOT BORNAGAIN_APPLE_BUNDLE AND NOT BUILD_DEBIAN)
+    # Create bin directory for links.
+    install(CODE "
+            FILE(MAKE_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
+            "
+        COMPONENT Runtime)
+    # Make links.
+    install(CODE "
+        execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink
+        \"../${destination_libexec}/thisbornagain.sh\" \"thisbornagain.sh\"
+        WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
+        " COMPONENT Runtime)
+    install(CODE "
+        execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink
+        \"../${destination_libexec}/thisbornagain.csh\" \"thisbornagain.csh\"
+        WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
+        " COMPONENT Runtime)
+else()
+
+    install(FILES ${WRAP_DIR}/python/bornagain_python_install.py
+        DESTINATION ${destination_libexec})
+endif()