diff --git a/include/aidge/graph/Node.hpp b/include/aidge/graph/Node.hpp
index c6ac9c651aadbc8b074bc55aa955838ac370746b..9841555e88b63cef9c7f8fe7554ed42cfe5b87ed 100644
--- a/include/aidge/graph/Node.hpp
+++ b/include/aidge/graph/Node.hpp
@@ -252,10 +252,10 @@ public:
       if ((inputCategory(i) == InputCategory::Data || inputCategory(i) == InputCategory::OptionalData)
         && input(i).second == gk_IODefaultIndex)
       {
-        break;
+        return i;
       }
     }
-    return (i < nbInputs()) ? i : gk_IODefaultIndex;
+    return gk_IODefaultIndex;
   }
 
 
diff --git a/src/graph/Node.cpp b/src/graph/Node.cpp
index 33c336a843bcf168497cd86fea241d4ad2dec362..37bc77b70dbb544f8185a145451b5a870feab05a 100644
--- a/src/graph/Node.cpp
+++ b/src/graph/Node.cpp
@@ -147,7 +147,9 @@ bool Aidge::Node::valid() const {
 Aidge::IOIndex_t Aidge::Node::getNbFreeDataInputs() const {
     IOIndex_t nbFreeDataIn = 0;
     for (IOIndex_t i = 0; i < nbInputs(); ++i) {
-        if (input(i).second == gk_IODefaultIndex) {
+        if ((inputCategory(i) == InputCategory::Data
+             || inputCategory(i) == InputCategory::OptionalData)
+            && input(i).second == gk_IODefaultIndex) {
             ++nbFreeDataIn;
         }
     }
@@ -387,10 +389,17 @@ void Aidge::Node::addChild(const std::shared_ptr<Node>& otherNode, const IOIndex
 void Aidge::Node::addChild(std::shared_ptr<GraphView> otherView, const IOIndex_t outId,
                            std::pair<std::shared_ptr<Node>, IOIndex_t> otherInId) {
     if (!otherInId.first) {
-        AIDGE_ASSERT(otherView->inputNodes().size() == 1U,
+        AIDGE_ASSERT(otherView->getNbFreeDataInputs() == 1U,
             "Input node of GraphView {} need to be specified, because it has more than one input ({} inputs), when trying to add it as a child of node {} (of type {})",
             otherView->name(), otherView->inputNodes().size(), name(), type());
-        otherInId.first = *(otherView->inputNodes().begin());
+
+        otherInId.first = *(std::find_if(
+            otherView->inputNodes().begin(),
+            otherView->inputNodes().end(),
+            [](const auto &node) {
+                return node->getFirstFreeDataInput() != gk_IODefaultIndex;
+            }
+        ));
     }
     otherInId.second = (otherInId.second != gk_IODefaultIndex)
                                ? otherInId.second