diff --git a/include/MantleAPI/Traffic/i_controller_config.h b/include/MantleAPI/Traffic/i_controller_config.h
index 414317d5b62f63f16c7756a3c68744074008beb1..1f9ab47c0066cf0f2cd898a178fc99464467c7b3 100644
--- a/include/MantleAPI/Traffic/i_controller_config.h
+++ b/include/MantleAPI/Traffic/i_controller_config.h
@@ -30,16 +30,6 @@ namespace mantle_api
 {
 struct IControllerConfig
 {
-  IControllerConfig() = default;
-  IControllerConfig(const IControllerConfig& controller_config)
-      : map_query_service(controller_config.map_query_service)
-  {
-    std::transform(controller_config.control_strategies.begin(),
-                   controller_config.control_strategies.end(),
-                   std::back_inserter(control_strategies),
-                   [](auto& control_strategy) { return std::make_unique<mantle_api::ControlStrategy>(*control_strategy); });
-  }
-
   virtual ~IControllerConfig() = default;
 
   std::string name;
@@ -52,23 +42,57 @@ struct IControllerConfig
 
 inline bool operator==(const IControllerConfig& lhs, const IControllerConfig& rhs) noexcept
 {
-  bool control_strategies_equal = true;
-  if (lhs.control_strategies.size() != rhs.control_strategies.size())
+  if (&lhs == &rhs)
   {
-    control_strategies_equal = false;
+    return true;
   }
-  else
+
+  const auto compare_control_strategies = [](const auto& lhs, const auto& rhs)
   {
-    for (unsigned int i = 0; i < lhs.control_strategies.size(); i++)
+    if (lhs.size() != rhs.size())
     {
-      if (*(lhs.control_strategies[i]) != *(rhs.control_strategies[i]))
+      return false;
+    }
+    else
+    {
+      for (size_t i = 0; i < lhs.size(); i++)
       {
-        control_strategies_equal = false;
-        break;
+        if (*(lhs[i]) != *(rhs[i]))
+        {
+          return false;
+        }
       }
     }
-  }
-  return control_strategies_equal;
+    return true;
+  };
+
+  const auto compare_route_definition = [](const auto& lhs, const auto& rhs)
+  {
+    if (lhs.waypoints.size() != rhs.waypoints.size())
+    {
+      return false;
+    }
+
+    for (size_t i = 0; i < lhs.waypoints.size(); ++i)
+    {
+      if (lhs.waypoints[i].route_strategy != rhs.waypoints[i].route_strategy ||
+          lhs.waypoints[i].waypoint != rhs.waypoints[i].waypoint)
+      {
+        return false;
+      }
+    }
+    return true;
+  };
+
+  return lhs.name == rhs.name &&
+         lhs.map_query_service == rhs.map_query_service &&
+         compare_control_strategies(lhs.control_strategies, rhs.control_strategies) &&
+         compare_route_definition(lhs.route_definition, rhs.route_definition);
+}
+
+inline bool operator!=(const IControllerConfig& lhs, const IControllerConfig& rhs) noexcept
+{
+  return !(lhs == rhs);
 }
 
 struct NoOpControllerConfig : public IControllerConfig
@@ -84,6 +108,21 @@ struct ExternalControllerConfig : public IControllerConfig
   std::map<std::string, std::string> parameters;
 };
 
+inline bool operator==(const ExternalControllerConfig& lhs, const ExternalControllerConfig& rhs) noexcept
+{
+  auto compare_base = [](const IControllerConfig& lhs, const IControllerConfig& rhs)
+  {
+    return lhs == rhs;
+  };
+
+  return compare_base(lhs, rhs) && lhs.parameters == rhs.parameters;
+}
+
+inline bool operator!=(const ExternalControllerConfig& lhs, const ExternalControllerConfig& rhs) noexcept
+{
+  return !(lhs == rhs);
+}
+
 }  // namespace mantle_api
 
 #endif  // MANTLEAPI_TRAFFIC_I_CONTROLLER_CONFIG_H