diff --git a/cmake_support/OST.cmake b/cmake_support/OST.cmake
index 44591345781fb9cf6320660777bd135fe3041066..9ecbc0c2b9a2182132980d0fb327a0c1e0ade15c 100644
--- a/cmake_support/OST.cmake
+++ b/cmake_support/OST.cmake
@@ -542,7 +542,7 @@ macro(pymod)
       set(_PARENT_LIB_NAME "${_PARENT_NAME}")
     endif()
     target_link_libraries("_${_LIB_NAME}" ${_PARENT_LIB_NAME} 
-                          ${Python_LIBRARIES} Boost::python)
+                          Boost::python)
 
     set_target_properties("_${_LIB_NAME}"
                           PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYMOD_STAGE_DIR})
@@ -857,14 +857,8 @@ macro(setup_stage)
   if (UNIX AND NOT APPLE)
     check_architecture()
   endif()
-  set (ARCH ${CMAKE_NATIVE_ARCH})
-  if ("${ARCH}" MATCHES "64" AND NOT _UBUNTU_LAYOUT)
-    set(LIB_DIR lib64  )
-    set(LIB_STAGE_PATH "${STAGE_DIR}/lib64"  )
-  else()
-    set(LIB_DIR lib  )
-    set(LIB_STAGE_PATH "${STAGE_DIR}/lib"  )
-  endif()
+  set(LIB_DIR lib  )
+  set(LIB_STAGE_PATH "${STAGE_DIR}/lib"  )
   if (_UBUNTU_LAYOUT)
     set(LIBEXEC_PATH ${LIB_DIR}/openstructure/libexec  )
     set(LIBEXEC_STAGE_PATH ${LIB_STAGE_PATH}/openstructure/libexec  )
diff --git a/modules/gui/src/CMakeLists.txt b/modules/gui/src/CMakeLists.txt
index 5c2fd044ee6e83ae5ac20a358af83cc91cab2b06..b340d27335895f314db84744f94e87bf62f67092 100644
--- a/modules/gui/src/CMakeLists.txt
+++ b/modules/gui/src/CMakeLists.txt
@@ -452,7 +452,6 @@ module(NAME gui SOURCES ${OST_GUI_MOCS} ${OST_GUI_SOURCES}
                ${OST_GUI_HEADERS}
        DEPENDS_ON ost_gfx ost_io ost_mol_alg ost_seq_alg
        LINK ${QT_LIBRARIES}
-            ${Python_LIBRARIES} 
             Boost::python
             ${SPNAV_LIBRARIES}
         NO_STATIC)
@@ -469,10 +468,17 @@ qt5_wrap_cpp(OST_GOSTY_MOC "gosty.hh"
              OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
                      -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 
-set(LINK LINK ${QT_LIBRARIES} Boost::program_options)
+find_package(Python 3 COMPONENTS Interpreter Development REQUIRED)
 
-executable_libexec(NAME gosty SOURCES gosty.cc ${OST_GOSTY_MOC}
-                   ${OST_QT_RESOURCE} DEPENDS_ON ost_gui ${LINK})
+set(GOSTY_LINK_LIBS
+    ${QT_LIBRARIES}
+    ${BOOST_PROGRAM_OPTIONS_LIBRARIES}
+    Python::Python)
+
+executable_libexec(NAME gosty
+                   SOURCES gosty.cc ${OST_GOSTY_MOC} ${OST_QT_RESOURCE}
+                   DEPENDS_ON ost_gui
+                   LINK ${GOSTY_LINK_LIBS})
            
 file(GLOB MOC_CXX_FILES moc_*.cxx)
 
diff --git a/modules/gui/src/gosty.cc b/modules/gui/src/gosty.cc
index 689cbf9eee7c0f6f341eecdb33e32d4e4f70889d..853899a17e4f9b923aae52b6043ca627fe39eea9 100644
--- a/modules/gui/src/gosty.cc
+++ b/modules/gui/src/gosty.cc
@@ -111,11 +111,7 @@ String setup_python_search_path(const String& root, PythonInterpreter& pi)
 #ifdef _MSC_VER
   String loc=root+"\\lib\\"+site_pkgs.str()+"\\site-packages";
 #else  
-# if (defined(__ppc64__) || defined(__x86_64__)) && !defined(__APPLE__) && !OST_UBUNTU_LAYOUT
-  String loc=root+"/lib64/"+site_pkgs.str()+"/site-packages";
-# else
   String loc=root+"/lib/"+site_pkgs.str()+"/site-packages";
-# endif
 #endif
   pi.AppendModulePath(QString::fromStdString(loc));
   // dng is an interactive python session, so add '.' to search path
diff --git a/scripts/dng.in b/scripts/dng.in
index 93e7d862e853343728468587dd96b5f4466771aa..624ec98b1194c6130364c48787a206b79fbf721f 100755
--- a/scripts/dng.in
+++ b/scripts/dng.in
@@ -20,14 +20,30 @@
 # Startup script for a protein-centric user interface
 # Author: Marco Biasini
 
-if [ -h "$0" ] ; then
-  SCRIPT_NAME=`readlink "$0"`
+if [ -h "$0" ]; then
+  TARGET="$0"
+  while [ -h "$TARGET" ]; do
+    DIR="$(cd -P "$(dirname "$TARGET")" && pwd)"
+    TARGET="$(readlink "$TARGET")"
+    [[ $TARGET != /* ]] && TARGET="$DIR/$TARGET"
+  done
+  SCRIPT_PATH="$DIR/$(basename "$TARGET")"
 else
-  SCRIPT_NAME="$0"
+  SCRIPT_PATH="$0"
 fi
-BIN_DIR=`dirname "$SCRIPT_NAME"`
-source "$BIN_DIR/../@LIBEXEC_PATH@/ost_config"
 
+# Get the absolute path of the script
+if command -v realpath >/dev/null 2>&1; then
+  SCRIPT_PATH="$(realpath "$SCRIPT_PATH")"
+elif command -v readlink >/dev/null 2>&1; then
+  SCRIPT_PATH="$(readlink -f "$SCRIPT_PATH")"
+else
+  # Fallback for systems without realpath or readlink
+  SCRIPT_PATH="$(cd "$(dirname "$SCRIPT_PATH")" && pwd -P)/$(basename "$SCRIPT_PATH")"
+fi
+
+BIN_DIR=$(dirname "$SCRIPT_PATH")
+source "$BIN_DIR/../@LIBEXEC_PATH@/ost_config"
 
 opts=""
 
diff --git a/scripts/ost.in b/scripts/ost.in
index b85886a39356514615d557e9533906deafa5b62f..fc48014e0128dec2e0f21609f1766ef8cbc133c7 100755
--- a/scripts/ost.in
+++ b/scripts/ost.in
@@ -22,12 +22,29 @@
 # convenience wrapper for non-gui openstructure interface 'ost'
 #
 # Self detect important directories
-if [ -h "$0" ] ; then
-  SCRIPT_NAME=`readlink "$0"`
+if [ -h "$0" ]; then
+  TARGET="$0"
+  while [ -h "$TARGET" ]; do
+    DIR="$(cd -P "$(dirname "$TARGET")" && pwd)"
+    TARGET="$(readlink "$TARGET")"
+    [[ $TARGET != /* ]] && TARGET="$DIR/$TARGET"
+  done
+  SCRIPT_PATH="$DIR/$(basename "$TARGET")"
 else
-  SCRIPT_NAME="$0"
+  SCRIPT_PATH="$0"
 fi
-BIN_DIR=`dirname "$SCRIPT_NAME"`
+
+# Get the absolute path of the script
+if command -v realpath >/dev/null 2>&1; then
+  SCRIPT_PATH="$(realpath "$SCRIPT_PATH")"
+elif command -v readlink >/dev/null 2>&1; then
+  SCRIPT_PATH="$(readlink -f "$SCRIPT_PATH")"
+else
+  # Fallback for systems without realpath or readlink
+  SCRIPT_PATH="$(cd "$(dirname "$SCRIPT_PATH")" && pwd -P)/$(basename "$SCRIPT_PATH")"
+fi
+
+BIN_DIR=$(dirname "$SCRIPT_PATH")
 OST_EXEC_DIR=$(cd $BIN_DIR/../@LIBEXEC_PATH@ && pwd)
 export OST_EXEC_DIR