diff --git a/include/aidge/operator/MetaOperator.hpp b/include/aidge/operator/MetaOperator.hpp
index 63ca56d0b70aefc00280647f99de03c2916a3615..6c8038966f8a308a529efc40ca524ece410b371f 100644
--- a/include/aidge/operator/MetaOperator.hpp
+++ b/include/aidge/operator/MetaOperator.hpp
@@ -31,7 +31,7 @@ namespace Aidge {
 /**
  * @class MetaOperator_Op
  * @brief Represents a meta-operator, which is a composition of multiple operators.
- * 
+ *
  * A meta-operator encapsulates a micro-graph of operations, facilitating modularity
  * and reusability. It extends the functionality of `OperatorTensor` and provides
  * features such as cloning, dynamic input association, and custom backend support.
@@ -55,7 +55,7 @@ private:
 public:
     /**
      * @brief Constructor for MetaOperator_Op.
-     * 
+     *
      * @param type The type of the meta-operator.
      * @param graph The micro-graph defining the meta-operator.
      * @param forcedInputsCategory Optional input categories to override default behavior.
@@ -64,16 +64,16 @@ public:
 
     /**
      * @brief Copy constructor.
-     * 
+     *
      * Copies the operator's attributes and output tensors, but not its input tensors.
-     * 
+     *
      * @param op The operator to copy.
      */
     MetaOperator_Op(const MetaOperator_Op& op);
 
     /**
      * @brief Set the node for scheduling.
-     * 
+     *
      * @param node The node to be used as the upper node in the scheduling hierarchy.
      */
     inline void setUpperNode(std::shared_ptr<Node> node) {
@@ -82,16 +82,16 @@ public:
 
     /**
      * @brief Clone this meta-operator.
-     * 
+     *
      * Uses the copy constructor to create a new instance with identical attributes.
-     * 
+     *
      * @return A shared pointer to the cloned operator.
      */
     std::shared_ptr<Operator> clone() const override;
 
     /**
      * @brief Retrieve the micro-graph defining the meta-operator.
-     * 
+     *
      * @return A shared pointer to the micro-graph.
      */
     inline const std::shared_ptr<GraphView>& getMicroGraph() const noexcept {
@@ -100,7 +100,7 @@ public:
 
     /**
      * @brief Retrieve the scheduler for the micro-graph.
-     * 
+     *
      * @return A shared pointer to the scheduler.
      */
     inline const std::shared_ptr<SequentialScheduler>& getMicroGraphScheduler() const noexcept {
@@ -109,7 +109,7 @@ public:
 
     /**
      * @brief Associate an input tensor to the operator.
-     * 
+     *
      * @param inputIdx Index of the input tensor.
      * @param data Shared pointer to the data tensor.
      */
@@ -117,7 +117,7 @@ public:
 
     /**
      * @brief Set an input tensor for the operator.
-     * 
+     *
      * @param inputIdx Index of the input tensor.
      * @param data Shared pointer to the data tensor.
      */
@@ -125,7 +125,7 @@ public:
 
     /**
      * @brief Forward the dimensions through the micro-graph.
-     * 
+     *
      * @param allowDataDependency If true, allows data-dependent operations during forwarding.
      * @return True if the operation succeeded, false otherwise.
      */
@@ -137,16 +137,31 @@ public:
         return false;
     }
 
+    /**
+     * @brief Forward the data type through the micro-graph.
+     *
+     * @return True if the operation succeeded, false otherwise.
+     */
+    bool forwardDType() override final {
+        if (inputsAssociated(false)) {
+            // Forward dims of micro-graph
+            return mGraph->forwardDType({});
+        }else{
+            Log::warn("No input associated to metaoperator.");
+        }
+        return false;
+    }
+
     /**
      * @brief Retrieve the backend for the operator.
-     * 
+     *
      * @return The name of the backend.
      */
     std::string backend() const noexcept override;
 
     /**
      * @brief Set the backend for the operator.
-     * 
+     *
      * @param name The name of the backend.
      * @param device The device index.
      */
@@ -154,16 +169,16 @@ public:
 
     /**
      * @brief Get the available backends for the operator.
-     * 
+     *
      * @return A set of available backend names.
      */
     std::set<std::string> getAvailableBackends() const override;
 
     /**
      * @brief Set the data type for the operator.
-     * 
+     *
      * This propagates the data type change to the micro-graph.
-     * 
+     *
      * @param datatype The new data type.
      */
     void setDataType(const DataType &datatype) const override {
@@ -175,7 +190,7 @@ public:
 
     /**
      * @brief Retrieve the dynamic attributes of the operator.
-     * 
+     *
      * @return A shared pointer to the attributes.
      */
     inline std::shared_ptr<Attributes> attributes() const override { return mAttributes; }
@@ -207,7 +222,7 @@ public:
     void backward() override;
     /**
      * @brief Check if the operator is atomic.
-     * 
+     *
      * @return False, as meta-operators are inherently non-atomic.
      */
     inline bool isAtomic() const noexcept override final { return false; }
@@ -216,7 +231,7 @@ public:
 
 /**
  * @brief Helper function to create a MetaOperator node.
- * 
+ *
  * @param type The type of the meta-operator.
  * @param graph The micro-graph defining the meta-operator.
  * @param forcedInputsCategory Optional input categories to override default behavior.