diff --git a/src/backend/OperatorImpl.cpp b/src/backend/OperatorImpl.cpp
index 0fa2cfdadb3af350a5668444c0a330e023818a41..876d3b2e92bcd7b581314e50becdd5c114083d73 100644
--- a/src/backend/OperatorImpl.cpp
+++ b/src/backend/OperatorImpl.cpp
@@ -120,11 +120,10 @@ Aidge::ImplSpec Aidge::OperatorImpl::getBestMatch(const ImplSpec& requiredSpecs)
             std::string qualifier;
             const auto qualifierPos = std::find_if(attrName.begin(), attrName.end(),
                 [](char c) { return c == ':'; });
-            if (qualifierPos != attrName.begin()) {
-                name = attrName.substr(0, qualifierPos - attrName.begin());
-                qualifier = attrName.substr(qualifierPos - attrName.begin());
+            if (qualifierPos != attrName.end()) {
+                name = attrName.substr(0, (qualifierPos - attrName.begin()));
+                qualifier = attrName.substr((qualifierPos - attrName.begin())+1);
             }
-
             const bool mandatory = (qualifier == "!");
             if (mandatory) {
                 // Required attribute:
@@ -161,6 +160,10 @@ Aidge::ImplSpec Aidge::OperatorImpl::getBestMatch(const ImplSpec& requiredSpecs)
         Log::debug("  {}:{} - {}", (match) ? "MATCH" : "MISMATCH", priority, spec);
     }
 
+    if(matchingSpecs.empty()){
+        Log::debug("  No spec to match registered, returning requiredSpecs.");
+        return requiredSpecs;
+    }
     // Return best match
     const auto bestMatch = std::max_element(matchingSpecs.begin(), matchingSpecs.end());
     if (*bestMatch >= 0) {
@@ -367,6 +370,6 @@ std::shared_ptr<Aidge::ProdConso> Aidge::OperatorImpl::getProdConso() const {
     return std::make_shared<ProdConso>(mOp);
 }
 
-std::set<Aidge::ImplSpec> Aidge::OperatorImpl::getAvailableImplSpecs() const {
-    return std::set<ImplSpec>();
+std::vector<Aidge::ImplSpec> Aidge::OperatorImpl::getAvailableImplSpecs() const {
+    return std::vector<ImplSpec>();
 }