diff --git a/R/Calibration.GRiwrmInputsModel.R b/R/Calibration.GRiwrmInputsModel.R
index 6e0cdd38f9cd53dd4f0f5afa52c9b9d2233465c8..ef44dfd80d70d587df25f93b4aa58c10bcbcae24 100644
--- a/R/Calibration.GRiwrmInputsModel.R
+++ b/R/Calibration.GRiwrmInputsModel.R
@@ -78,7 +78,7 @@ Calibration.GRiwrmInputsModel <- function(InputsModel,
     if (hasUngauged) {
       # Select nodes with model in the sub-network
       g <- attr(IM, "GRiwrm")
-      Ids <- g$id[g$donor == id & !is.na(g$model)]
+      Ids <- g$id[!is.na(g$donor) & g$donor == id]
       # Extract the X4 calibrated for the whole intermediate basin
       if(IM[[id]]$model$hasX4) {
         X4 <- OutputsCalib[[id]]$ParamFinalR[IM[[id]]$model$iX4] # Global parameter
@@ -167,7 +167,8 @@ getInputsCrit_Lavenne <- function(id, OutputsModel, InputsCrit) {
 reduceGRiwrmObj4Ungauged <- function(griwrm, obj) {
   objAttributes <- attributes(obj)
   obj <- lapply(obj, function(o) {
-    if(o$id %in% griwrm$id && !is.na(griwrm$model[griwrm$id == o$id])) {
+    if (o$id %in% griwrm$id &&
+        !is.na(griwrm$model[griwrm$id == o$id & griwrm$model != "Diversion"])) {
       o
     } else {
       NULL
@@ -204,9 +205,9 @@ updateParameters4Ungauged <- function(GaugedId,
   griwrm <- attr(InputsModel, "GRiwrm")
   gDonor <- griwrm[!is.na(griwrm$donor) & griwrm$donor == GaugedId, ]
   # Add upstream nodes for routing upstream flows
-  upIds <- griwrm$id[griwrm$down %in% gDonor$id & !griwrm$id %in% gDonor$id]
+  upIds <- unique(griwrm$id[griwrm$down %in% gDonor$id & !griwrm$id %in% gDonor$id])
   g <- rbind(griwrm[griwrm$id %in% upIds, ], gDonor)
-  g$model[g$id %in% upIds] <- NA
+  g$model[g$id %in% upIds & g$model != "Diversion"] <- NA
   # Set downstream node
   g$down[!g$down %in% g$id] <- NA
 
@@ -221,21 +222,21 @@ updateParameters4Ungauged <- function(GaugedId,
   }
   # Update griwrm
   attr(InputsModel, "GRiwrm") <- g
-  # Update Qupstream already modeled in the reduced network upstream nodes
+  # Update Qupstream already modelled in the reduced network upstream nodes
   idIM <- unique(g$down[g$id %in% upIds])
   for (id in idIM) {
     if(useUpstreamQsim && any(InputsModel[[id]]$UpstreamIsModeled)) {
       # Temporarily switch off upstream nodes belonging to the donor basin
-      UpIsModeledBackUp <- InputsModel[[idIM]]$UpstreamIsModeled
-      ImUpIds <- InputsModel[[idIM]]$UpstreamNodes
-      InputsModel[[idIM]]$UpstreamIsModeled[!ImUpIds %in% upIds] <- FALSE
+      UpIsModeledBackUp <- InputsModel[[id]]$UpstreamIsModeled
+      ImUpIds <- InputsModel[[id]]$UpstreamNodes
+      InputsModel[[id]]$UpstreamIsModeled[!ImUpIds %in% upIds] <- FALSE
       # Update InputsModel$Qupstream with simulated upstream flows
-      InputsModel[[idIM]] <- UpdateQsimUpstream(InputsModel[[idIM]],
-                                              RunOptions[[idIM]],
+      InputsModel[[id]] <- UpdateQsimUpstream(InputsModel[[id]],
+                                              RunOptions[[id]],
                                               OutputsModel)
       # Restore initial UpstreamIsModeled and switch off already modelled nodes
-      InputsModel[[idIM]]$UpstreamIsModeled <- UpIsModeledBackUp
-      InputsModel[[idIM]]$UpstreamIsModeled[ImUpIds %in% upIds] <- FALSE
+      InputsModel[[id]]$UpstreamIsModeled <- UpIsModeledBackUp
+      InputsModel[[id]]$UpstreamIsModeled[ImUpIds %in% upIds] <- FALSE
     }
   }
 
diff --git a/tests/testthat/test-RunModel_Ungauged.R b/tests/testthat/test-RunModel_Ungauged.R
index 54b1335a98c8d3bdac22b288b772493e809fdc56..559053fc8351415096628f1c75c45295391d83b1 100644
--- a/tests/testthat/test-RunModel_Ungauged.R
+++ b/tests/testthat/test-RunModel_Ungauged.R
@@ -54,3 +54,52 @@ test_that("RunModel_Ungauged works with a diversion as donor (#110)", {
   OCdiv <- Calibration(InputsModel, RunOptions, IC, CO)
   expect_equal(OCdiv, OC)
 })
+
+# 3 nodes on one branch with ungauged node in the middle
+nodes <- loadSevernNodes()
+nodes <- nodes[!nodes$id %in% c("54002", "54057", "54029"), ]
+nodes[nodes$id == "54032", c("down", "length")] <- c(NA, NA)
+nodes$model[nodes$id == "54001"] <- "Ungauged"
+g <- CreateGRiwrm(nodes)
+e <- setupRunModel(griwrm = g, runRunModel = FALSE)
+for(x in ls(e)) assign(x, get(x, e))
+np <- getAllNodesProperties(griwrm)
+
+IC <- CreateInputsCrit(
+  InputsModel,
+  FUN_CRIT = ErrorCrit_KGE2,
+  RunOptions = RunOptions,
+  Obs = Qobs[IndPeriod_Run, np$id[np$RunOff & np$calibration == "Gauged"], drop = FALSE],
+  transfo = "sqrt",
+  k = 0.15
+)
+
+CO <- CreateCalibOptions(InputsModel)
+OC <- Calibration(InputsModel, RunOptions, IC, CO)
+Param <- sapply(OC, "[[", "ParamFinalR")
+OM <- RunModel(
+  InputsModel,
+  RunOptions = RunOptions,
+  Param = Param
+)
+CritValue <- ErrorCrit_KGE2(
+  InputsCrit = IC$`54032`,
+  OutputsModel = OM$`54032`
+)$CritValue
+
+test_that("Ungauged node with gauged upstream node should works", {
+  expect_equal(OC$`54032`$CritFinal, CritValue)
+})
+
+test_that("RunModel_Ungauged works with a diversion as upstream node (#113)", {
+  nodes <- rbind(nodes,
+                 data.frame(id = "54095", down = "54032", length = 100, area = NA, model = "Diversion"))
+  g <- CreateGRiwrm(nodes)
+  Qobs2 <- matrix(0, ncol = 1, nrow = 11536)
+  colnames(Qobs2) <- "54095"
+  e <- setupRunModel(griwrm = g, runRunModel = FALSE, Qobs2 = Qobs2)
+  for(x in ls(e)) assign(x, get(x, e))
+  np <- getAllNodesProperties(griwrm)
+  OCdiv <- Calibration(InputsModel, RunOptions, IC, CO)
+  expect_equal(OCdiv$`54032`$CritFinal, CritValue)
+})