diff --git a/src/operator/Producer.cpp b/src/operator/Producer.cpp
index 990809b6c7d98e3d518f31fd9630366414e629d0..43e991288c483f07138a2b236a2c4925ea0a3754 100644
--- a/src/operator/Producer.cpp
+++ b/src/operator/Producer.cpp
@@ -32,9 +32,28 @@ Aidge::Producer_Op::Producer_Op(const std::shared_ptr<Aidge::Tensor> tensor, boo
       Attributes_(attr<ProdAttr::Constant>(constant))
 {
     mOutputs[0] = tensor; // copy the pointer of the Tensor
-    mImpl = (tensor->hasImpl()) ?
-                std::make_shared<OperatorImpl>(*this, tensor->getImpl()->backend()) :
-                nullptr;
+#ifdef PYBIND
+    if(Py_IsInitialized()) {
+        auto obj = py::cast(&(*this));
+        setImpl((mOutputs[0]->hasImpl()) ?
+            (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ?
+                Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) :
+                std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) :
+            nullptr);
+    } else {
+        setImpl((mOutputs[0]->hasImpl()) ?
+            (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ?
+                Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) :
+                std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) :
+            nullptr);
+    }
+#else
+    setImpl((mOutputs[0]->hasImpl()) ?
+                (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ?
+                    Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) :
+                    std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) :
+                nullptr);
+#endif
 }
 
 /**
@@ -46,12 +65,29 @@ Aidge::Producer_Op::Producer_Op(const Aidge::Producer_Op& op)
     : OperatorTensor(op),
       Attributes_(op)
 {
-    if (op.mImpl){
-        SET_IMPL_MACRO(Producer_Op, *this, op.backend());
-    } else {
-        mImpl = nullptr;
-    }
-    // mOutputs[0] = std::make_shared<Tensor>(*(op.getOutput(0)));
+    mOutputs[0] = std::make_shared<Tensor>(*(op.getOutput(0)));
+#ifdef PYBIND
+    if(Py_IsInitialized()) {
+            auto obj = py::cast(&(*this));
+            setImpl((mOutputs[0]->hasImpl()) ?
+                (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ?
+                    Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) :
+                    std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) :
+                nullptr);
+        } else {
+            setImpl((mOutputs[0]->hasImpl()) ?
+                (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ?
+                    Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) :
+                    std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) :
+                nullptr);
+        }
+#else
+    setImpl((mOutputs[0]->hasImpl()) ?
+                (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ?
+                    Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) :
+                    std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) :
+                nullptr);
+#endif
     // if (mOutputs[0]->hasImpl()) {
         // if (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()})){
         //     setImpl(Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this));
@@ -66,6 +102,21 @@ Aidge::Producer_Op::Producer_Op(const Aidge::Producer_Op& op)
 }
 
 void Aidge::Producer_Op::setBackend(const std::string& name, Aidge::DeviceIdx_t device) {
-    SET_IMPL_MACRO(Producer_Op, *this, name);
+#ifdef PYBIND
+    if(Py_IsInitialized()) {
+            auto obj = py::cast(&(*this));
+            setImpl((Registrar<Producer_Op>::exists({name})) ?
+                    Registrar<Producer_Op>::create(name)(*this) :
+                    std::make_shared<OperatorImpl>(*this, name));
+        } else {
+            setImpl((Registrar<Producer_Op>::exists({name})) ?
+                    Registrar<Producer_Op>::create(name)(*this) :
+                    std::make_shared<OperatorImpl>(*this, name));
+        }
+#else
+    setImpl((Registrar<Producer_Op>::exists({name})) ?
+        Registrar<Producer_Op>::create(name)(*this) :
+        std::make_shared<OperatorImpl>(*this, name));
+#endif
     mOutputs[0]->setBackend(name, device);
 }
\ No newline at end of file