diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7b58fe16b224b2e7b2de4f0b05446a9097b6c6f9..4b8eaf66db47f188de03d32acc3f546b2cb9e94c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -127,6 +127,7 @@ endif()
 set(STAGE_DIR "${CMAKE_BINARY_DIR}/stage")
 set(EXECUTABLE_OUTPUT_PATH ${STAGE_DIR}/bin)
 set(HEADER_STAGE_PATH ${STAGE_DIR}/include)
+set(LIBEXEC_STAGE_PATH ${STAGE_DIR}/libexec/openstructure)
 set(SHARED_DATA_PATH ${STAGE_DIR}/share/openstructure)
 include_directories("${HEADER_STAGE_PATH}")
 link_directories(${LIB_STAGE_PATH})
@@ -148,7 +149,8 @@ endif()
 file(MAKE_DIRECTORY ${STAGE_DIR} 
      ${EXECUTABLE_OUTPUT_PATH} 
      ${HEADER_STAGE_PATH}
-     ${LIB_STAGE_PATH})
+     ${LIB_STAGE_PATH}
+     ${LIBEXEC_STAGE_PATH})
 
 if (WIN32)
    # add_definitions(-DBOOST_TEST_INCLUDED)
diff --git a/cmake_support/OST.cmake b/cmake_support/OST.cmake
index 82be3411f155a7c8a972b71cee34ecdd6d225879..1465229fc4389eefc96bff662434c698d55e6dca 100644
--- a/cmake_support/OST.cmake
+++ b/cmake_support/OST.cmake
@@ -332,14 +332,16 @@ macro(substitute)
                     ${CMAKE_COMMAND} ${_SUBST_DICT}
                     -P ${CMAKE_SOURCE_DIR}/cmake_support/substitute.cmake)
 endmacro()
+
 #-------------------------------------------------------------------------------
 # Synopsis:
 #   script(NAME script_name INPUT input_name SUBSTITUTE key=val key=val
-#         [TARGET target])
+#          [OUTPUT_DIR dir] [TARGET target])
 #-------------------------------------------------------------------------------
 macro(script)
+  set(_ARG_OUTPUT_DIR bin)
   parse_argument_list(_ARG 
-                      "NAME;INPUT;SUBSTITUTE;TARGET" "" ${ARGN})
+                      "NAME;INPUT;SUBSTITUTE;TARGET;OUTPUT_DIR" "" ${ARGN})
   if (NOT _ARG_NAME)
     message(FATAL_ERROR "invalid use of executable(): a name must be provided")
   endif()
@@ -354,10 +356,10 @@ macro(script)
     substitute(IN_FILE ${_INPUT} OUT_FILE ${_ARG_NAME} 
                DICT ${_ARG_SUBSTITUTE})
   endif()
-  install(FILES ${_ARG_NAME} DESTINATION bin 
+  install(FILES ${_ARG_NAME} DESTINATION ${_ARG_OUTPUT_DIR} 
           PERMISSIONS WORLD_EXECUTE GROUP_EXECUTE OWNER_EXECUTE 
                       WORLD_READ GROUP_READ OWNER_READ)
-  copy_if_different("./" "${EXECUTABLE_OUTPUT_PATH}" 
+  copy_if_different("./" "${STAGE_DIR}/${_ARG_OUTPUT_DIR}" 
                     "${_ARG_NAME}" "TARGETS" ${_ARG_TARGET})
   add_dependencies(${_ARG_TARGET} subst_${_ARG_NAME})
 endmacro()
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
index d78dacf8c6933dfa50222c01bae54336aa684187..18eb3244bbcd325f0a7cd4f8c53252e665fa0993 100644
--- a/scripts/CMakeLists.txt
+++ b/scripts/CMakeLists.txt
@@ -19,7 +19,7 @@ if(WIN32)
   script(NAME gipltng.bat INPUT gipltng.bat.in SUBSTITUTE ${SUBST_DICT})
 else()
   script(NAME ost_config INPUT ost_config.in SUBSTITUTE ${SUBST_DICT}
-         TARGET ost_scripts)
+         TARGET ost_scripts OUTPUT_DIR libexec/openstructure)
   script(NAME ost INPUT ost.in SUBSTITUTE ${SUBST_DICT} 
          TARGET ost_scripts)
   script(NAME dng INPUT dng.in SUBSTITUTE ${SUBST_DICT}
diff --git a/scripts/dng.in b/scripts/dng.in
index 529eaa71d0ecbca622f94071f0339f37a2d9e8b6..e78b6511fa811758e7d42babe69437d2f0e19fd2 100755
--- a/scripts/dng.in
+++ b/scripts/dng.in
@@ -26,6 +26,6 @@ else
   SCRIPT_NAME="$0"
 fi
 BIN_DIR=`dirname "$SCRIPT_NAME"`
-source $BIN_DIR/ost_config
+source $BIN_DIR/../libexec/openstructure/ost_config
 
 $DNG_BINDIR/gosty $DNG_INITDIR/init.py ost $opts
diff --git a/scripts/ost.in b/scripts/ost.in
index 6f715fda08bb58be5c61babaac2db23057b28071..3cf716f00d7e026ec9bbd92e7aa29bd6fa34d578 100755
--- a/scripts/ost.in
+++ b/scripts/ost.in
@@ -29,7 +29,7 @@ else
 fi
 BIN_DIR=`dirname "$SCRIPT_NAME"`
 
-source $BIN_DIR/ost_config
+source $BIN_DIR/../libexec/openstructure/ost_config
 
 $pyexec $interactive "$DNG_ROOT/@LIBDIR@/openstructure/init_cl.py" $opts
 RC=$?