diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp
index c7d941aa565e37ecd7b53c3035f844c139981d8a..13a4deeedebadcc01b47d37348d2c0ca1ba90d42 100644
--- a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp
+++ b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp
@@ -72,6 +72,9 @@ namespace armarx
         workingMemory().addCoreSegment("ExampleData", armem::example::ExampleData::ToAronType());
         workingMemory().addCoreSegment("LinkedData", armem::example::LinkedData::ToAronType());
 
+        // We support the "Latest" prediction engine for the entire memory.
+        workingMemory().predictionEngines().push_back({"Latest"});
+
         // For illustration purposes, we add more segments (without types).
         bool trim = true;
         p.core.defaultCoreSegments = simox::alg::split(p.core._defaultSegmentsStr, ",", trim);
@@ -275,12 +278,6 @@ namespace armarx
         return result.toIce();
     }
 
-    armem::prediction::data::EngineSupportMap
-    ExampleMemory::getAvailableEngines()
-    {
-        return {{armarx::toIce<armem::data::MemoryID>(workingMemory().id()), {{"Latest"}}}};
-    }
-
     // REMOTE GUI
 
     void ExampleMemory::createRemoteGuiTab()
diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h
index fa9c2b1eacc314bcb37de05f4f19039d9bcbd582..76e437bcb6f6db0e31c023eed4386831267c5fc2 100644
--- a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h
+++ b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.h
@@ -76,8 +76,6 @@ namespace armarx
         armem::prediction::data::PredictionResultSeq
         predict(const armem::prediction::data::PredictionRequestSeq& requests) override;
 
-        armem::prediction::data::EngineSupportMap getAvailableEngines() override;
-
 
     protected:
 
diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
index 71eba7787783661f2c1dee98c605ab0122e5ece9..fe2a7471594c303e21ed0638bb1fa6f5e1635fa5 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
@@ -295,14 +295,6 @@ namespace armarx::armem::server::obj
         return results;
     }
 
-    armem::prediction::data::EngineSupportMap ObjectMemory::getAvailableEngines()
-    {
-        // TODO(phesch): Replace with generic code in Memory implementation
-        return {{armarx::toIce<armem::data::MemoryID>(
-                     workingMemory().id().withCoreSegmentName("Instance")),
-                 {{"Linear Position Regression"}}}};
-    }
-
     void ObjectMemory::createRemoteGuiTab()
     {
         using namespace armarx::RemoteGui::Client;
diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
index 7067f42da1344fb4aa1936dfcafaa2b77f3df599..1a939eebff7c94f887b4d68f5d363c5f986e5194 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
@@ -110,7 +110,6 @@ namespace armarx::armem::server::obj
         // Predictions
         armem::prediction::data::PredictionResultSeq
         predict(const armem::prediction::data::PredictionRequestSeq& requests) override;
-        armem::prediction::data::EngineSupportMap getAvailableEngines() override;
 
         // Remote GUI
         void createRemoteGuiTab();
diff --git a/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h b/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
index a0139d9f44daa48aa36a760e70b89938dd8960e9..36334fd3e6f04a294d33880aec04891b55d8501c 100644
--- a/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
@@ -284,15 +284,20 @@ namespace armarx::armem::base
         }
 
         /**
-         * @brief Add an empty provider segment with the given name and optional provider segment type.
+         * @brief Add an empty provider segment with the given name,
+         *        optional provider segment type and prediction engines.
          * @param name The segment name.
          * @param providerSegmentType The provider type. If nullptr, the core segment type is used.
+         * @param predictionEngines The prediction engines supported by the provider segment (optional).
          * @return The added provider segment.
          */
-        ProviderSegmentT& addProviderSegment(const std::string& name, aron::type::ObjectPtr providerSegmentType = nullptr)
+        ProviderSegmentT&
+        addProviderSegment(const std::string& name,
+                           aron::type::ObjectPtr providerSegmentType = nullptr,
+                           const std::vector<PredictionEngine>& predictionEngines = {})
         {
             aron::type::ObjectPtr type = providerSegmentType ? providerSegmentType : this->aronType();
-            return this->_derived().addProviderSegment(name, name, type);
+            return this->_derived().addProviderSegment(name, name, type, predictionEngines);
         }
 
         /// Copy and insert a provider segment.
diff --git a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
index 947b459afec4e50642afa05b721e9d0e0c61a786..7f9ce5a185a1f1d5705f508f96e1fa2cd19971bb 100644
--- a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
@@ -219,15 +219,18 @@ namespace armarx::armem::base
         // MODIFICATION
 
         /**
-         * @brief Add an empty core segment with the given name.
+         * @brief Add an empty core segment with the given name, type and prediction engines.
          * @param name The core segment name.
          * @param coreSegmentType The core segment type (optional).
+         * @param predictionEngines The prediction engines supported by the core segment (optional).
          * @return The added core segment.
          */
-        CoreSegmentT& addCoreSegment(
-            const std::string& name, aron::type::ObjectPtr coreSegmentType = nullptr)
+        CoreSegmentT&
+        addCoreSegment(const std::string& name,
+                       aron::type::ObjectPtr coreSegmentType = nullptr,
+                       const std::vector<PredictionEngine>& predictionEngines = {})
         {
-            return this->_derived().addCoreSegment(name, name, coreSegmentType);
+            return this->_derived().addCoreSegment(name, name, coreSegmentType, predictionEngines);
         }
 
         /// Copy and insert a core segment.
diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h
index 37f25fd8f3199179402755dc76d98367964aa2af..8ddf174b172d4eb2fc4fba7f3e89d79553d72b42 100644
--- a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h
+++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h
@@ -57,6 +57,10 @@ namespace armarx::armem::server::plugins
 
         // PredictingInterface interface
         virtual armem::prediction::data::PredictionResultSeq predict(const armem::prediction::data::PredictionRequestSeq& requests);
+
+        // Unless you need very unusual behavior from this method for your memory server,
+        // it is better to set the available prediction engines in the memory itself
+        // and let it handle the requests than to override this.
         virtual armem::prediction::data::EngineSupportMap getAvailableEngines();
 
         virtual armem::prediction::data::PredictionResultSeq predict(const armem::prediction::data::PredictionRequestSeq& requests, const ::Ice::Current&) override;
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 6bad86c0f05ccdaa33855d9411c27d9cc04d50f6..aaf23c20e21eff50cf135664b6c8c951d9980abd 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -49,8 +49,11 @@ namespace armarx::armem::server::obj::instance
 {
 
     Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
-        SpecializedCoreSegment(memoryToIceAdapter, "Instance",
-                           arondto::ObjectInstance::ToAronType(), 64)
+        SpecializedCoreSegment(memoryToIceAdapter,
+                               "Instance",
+                               arondto::ObjectInstance::ToAronType(),
+                               64,
+                               predictionEngines)
     {
         oobbCache.setFetchFn([this](const ObjectID & id) -> std::optional<simox::OrientedBoxf>
         {
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
index da1426a6f4db83633f8d0cce30dcc080cd724ece..ba7c5539df7299be11ceead0c4253938bfe9ed73 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
@@ -194,7 +194,6 @@ namespace armarx::armem::server::obj::instance
 
         static const std::string timestampPlaceholder;
 
-
     public:
 
         struct RemoteGui
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
index 959d3b5fad43a9d7909798d58550e36afb377d10..228b96f1e9d0bef4cfd787694a060a7467ba5316 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
@@ -68,6 +68,7 @@ namespace armarx::armem::server::obj::instance
     {
         segment.setTag(getName());
         segment.decay.setTag(getName());
+        segment.setPredictionEngines(predictionEngines);
         robotHead.setTag(getName());
         visu.setTag(getName());
 
@@ -498,7 +499,7 @@ namespace armarx::armem::server::obj::instance
                         armem::PredictionSettings::fromIce(request.settings);
 
                 if (settings.predictionEngineID.empty()
-                    or settings.predictionEngineID == "Linear Position Regression")
+                    or settings.predictionEngineID == linearPredictionEngineID)
                 {
                     result = objpose::predictObjectPoseLinear(
                         poses.at(i),
@@ -519,10 +520,7 @@ namespace armarx::armem::server::obj::instance
     armem::prediction::data::PredictionEngineSeq
     SegmentAdapter::getAvailableObjectPoseEngines(const Ice::Current&)
     {
-        armem::prediction::data::PredictionEngine engine;
-        // TODO(phesch): Make this a constant somewhere
-        engine.engineID = "Linear Position Regression";
-        return { engine };
+        return armarx::toIce<armem::prediction::data::PredictionEngineSeq>(predictionEngines);
     }
 
     void
@@ -600,7 +598,9 @@ namespace armarx::armem::server::obj::instance
             cycle.waitForCycleDuration();
         }
     }
-
+    
+    const std::string SegmentAdapter::linearPredictionEngineID = "Linear Position Regression";
+    const std::vector<PredictionEngine> SegmentAdapter::predictionEngines{{linearPredictionEngineID}};
 
     void SegmentAdapter::Calibration::defineProperties(PropertyDefinitionsPtr defs, const std::string& prefix)
     {
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h
index 69595f7b640ec57cb1dcd7222233e7681f6f20e1..1000f237a897a0791353e58da70721ba9f997d92 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h
@@ -127,6 +127,9 @@ namespace armarx::armem::server::obj::instance
 
         void visualizeRun();
 
+    public:
+        static const std::string linearPredictionEngineID;
+        static const std::vector<PredictionEngine> predictionEngines;
 
     private: