diff --git a/source/RobotAPI/libraries/skills_gui/gui_utils.cpp b/source/RobotAPI/libraries/skills_gui/gui_utils.cpp
index 4c6a1590eea309cbd9abc91535ad6d07b4284bbf..5a2036bbd9acb4804ad23a52d3594aca1946f634 100644
--- a/source/RobotAPI/libraries/skills_gui/gui_utils.cpp
+++ b/source/RobotAPI/libraries/skills_gui/gui_utils.cpp
@@ -118,18 +118,14 @@ armarx::gui::getIcon(std::string name)
     if (armarXGuiPath.empty())
     {
         std::scoped_lock l(m_armarXGuiPath);
-        armarXGuiPath = "ArmarXGui";
-        ArmarXDataPath::getAbsolutePath(armarXGuiPath, armarXGuiPath);
+        armarXGuiPath =
+            "$ARMARX_WORKSPACE/armarx/ArmarXGui/source/ArmarXGui/libraries/ArmarXGuiBase/icons/";
+        ArmarXDataPath::ReplaceEnvVars(armarXGuiPath);
     }
 
-    std::cout << armarXGuiPath;
-
     // now we can use the path!
 
-    // what in god's good name is "armarx/ArmarXGui/data/ArmarXGui"? And why does the util
-    // say ArmarXGui is in there???????
-    // anyways. workaround until I figure out what the hell happens here.
-    QPixmap pix(QString::fromStdString(
-        armarXGuiPath + "/../../source/ArmarXGui/libraries/ArmarXGuiBase/icons/" + name));
+    // we don't check the QIcon for validity, since an invalid icon can be safely used in the gui
+    QPixmap pix(QString::fromStdString(armarXGuiPath + name));
     return QIcon(pix);
 }
diff --git a/source/RobotAPI/libraries/skills_gui/gui_utils.h b/source/RobotAPI/libraries/skills_gui/gui_utils.h
index c958cbe2015a762cf05947b280900742074d4001..7524d7fe829e450d5c099e8aac7f038d448a75e3 100644
--- a/source/RobotAPI/libraries/skills_gui/gui_utils.h
+++ b/source/RobotAPI/libraries/skills_gui/gui_utils.h
@@ -20,7 +20,7 @@ namespace armarx::gui
     /**
      * @brief Get an icon in ArmarXGuiBase.
      * @param name The name of the icon.
-     * @return The icon.
+     * @return The icon. Empty icon if not found.
      */
     QIcon getIcon(std::string name);