diff --git a/DESCRIPTION b/DESCRIPTION
index a517127e0f90c09bc051d3cd465221930d762036..44ca4908f104de6441c1fe698e680cdc700b98d0 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,8 +1,8 @@
 Package: airGR
 Type: Package
 Title: Suite of GR Hydrological Models for Precipitation-Runoff Modelling
-Version: 1.6.2.2
-Date: 2020-06-05
+Version: 1.6.2.3
+Date: 2020-07-16
 Authors@R: c(
   person("Laurent", "Coron", role = c("aut", "trl"), comment = c(ORCID = "0000-0002-1503-6204")),
   person("Olivier", "Delaigue", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-7668-8468"), email = "airGR@inrae.fr"),
diff --git a/NEWS.md b/NEWS.md
index 173a46a9284cfde05987613917c5c4da7443a314..d3b32a32a338b7d1308f5cbe16322c669b80b097 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,5 +1,14 @@
 ## Release History of the airGR Package
 
+### 1.6.2.2 Release Notes (2020-07-15)
+
+#### Bug fixes
+
+- Major error in lag model implementation
+
+____________________________________________________________________________________
+
+
 ### 1.6.2.1 Release Notes (2020-06-05)
 
 #### New features
diff --git a/R/RunModel.R b/R/RunModel.R
index dabe11d2aae2dda1651dede10b31eb2037b48a59..9ca647e892c6cf21ea7fad4d77e99ddef7f240c6 100644
--- a/R/RunModel.R
+++ b/R/RunModel.R
@@ -30,10 +30,10 @@ RunModel <- function (InputsModel, RunOptions, Param, FUN_MOD) {
       }
       OutputsModelDown$Qsim <- OutputsModelDown$Qsim +
         c(rep(0, floor(PT[upstream_basin])),
-          Qupstream[(1 + floor(PT[upstream_basin])):LengthTs]) *
+          Qupstream[1:(LengthTs - floor(PT[upstream_basin]))]) *
         HUTRANS[1, upstream_basin] +
         c(rep(0, floor(PT[upstream_basin] + 1)),
-          Qupstream[(2 + floor(PT[upstream_basin])):LengthTs]) *
+          Qupstream[1:(LengthTs - floor(PT[upstream_basin]) - 1)]) *
         HUTRANS[2, upstream_basin]
     }
     # Warning for negative flows
diff --git a/tests/testthat/test-RunModel_LAG.R b/tests/testthat/test-RunModel_LAG.R
index 42a18ceb240f9c51f0be93a844fdee3636efdd83..a1fb28e624c25652f44e7ce76da3aa84b662490e 100644
--- a/tests/testthat/test-RunModel_LAG.R
+++ b/tests/testthat/test-RunModel_LAG.R
@@ -2,7 +2,6 @@ context("RunModel_LAG")
 
 data(L0123001)
 
-
 test_that("'BasinAreas' must have one more element than 'LengthHydro'", {
   expect_error(
     InputsModel <- CreateInputsModel(
@@ -18,6 +17,8 @@ test_that("'BasinAreas' must have one more element than 'LengthHydro'", {
   )
 })
 
+BasinAreas <- c(BasinInfo$BasinArea, BasinInfo$BasinArea)
+
 test_that("'Qupstream' cannot contain any NA value", {
   expect_error(
     InputsModel <- CreateInputsModel(
@@ -27,14 +28,14 @@ test_that("'Qupstream' cannot contain any NA value", {
       PotEvap = BasinObs$E,
       Qupstream = matrix(BasinObs$Qmm, ncol = 1),
       LengthHydro = 1,
-      BasinAreas = c(1, 2)
+      BasinAreas = BasinAreas
     ),
     regexp = "'Qupstream' cannot contain any NA value"
   )
 })
 
-Qupstream = BasinObs$Qmm
-Qupstream[is.na(Qupstream)] = mean(Qupstream, na.rm = TRUE)
+# Qupstream = sinusoid synchronised on hydrological year from 0 mm to mean value of Qobs
+Qupstream = floor((sin((1:length(BasinObs$Qmm)/365*2*3.14))+1)*mean(BasinObs$Qmm, na.rm = T))
 
 InputsModel <- CreateInputsModel(
   FUN_MOD = RunModel_GR4J,
@@ -43,7 +44,7 @@ InputsModel <- CreateInputsModel(
   PotEvap = BasinObs$E,
   Qupstream = matrix(Qupstream, ncol = 1),
   LengthHydro = 1000,
-  BasinAreas = c(BasinInfo$BasinArea * 2, BasinInfo$BasinArea)
+  BasinAreas = BasinAreas
 )
 
 Ind_Run <- seq(which(format(BasinObs$DatesR, format = "%Y-%m-%d") == "1990-01-01"),
@@ -60,7 +61,6 @@ OutputsGR4JOnly <-
                 RunOptions = RunOptions,
                 Param = Param)
 
-
 test_that("Upstream basin with nil area should return same Qdown as GR4J alone", {
   UpstBasinArea = InputsModel$BasinAreas[1]
   InputsModel$BasinAreas[1] <- 0
@@ -88,25 +88,40 @@ test_that(
 
 ParamSD = c(Param, InputsModel$LengthHydro / (24 * 60 * 60)) # Speed corresponding to one time step delay
 
+QlsGR4Only <-
+  OutputsGR4JOnly$Qsim * InputsModel$BasinAreas[2] * 1E6 / 86400
+
 test_that("1 input with lag of 1 time step delay out gives an output delayed of one time step", {
-  QlsGR4Only <-
-    OutputsGR4JOnly$Qsim * InputsModel$BasinAreas[2] * 1E6 / 86400
   OutputsSD <-
     RunModel(InputsModel, RunOptions, Param = ParamSD, FUN_MOD = RunModel_GR4J)
   QlsSdSim <-
     OutputsSD$Qsim * sum(InputsModel$BasinAreas) * 1E6 / 86400
   QlsUpstLagObs <-
-    c(0, Qupstream[Ind_Run[1:(length(Ind_Run) - 1)] + 1]) * InputsModel$BasinAreas[1] * 1E6 / 86400
+    c(0, Qupstream[Ind_Run[1:(length(Ind_Run) - 1)]]) * InputsModel$BasinAreas[1] * 1E6 / 86400
   expect_equal(QlsSdSim - QlsGR4Only, QlsUpstLagObs)
 })
 
+test_that("1 input with lag of 0.5 time step delay out gives an output delayed of 0.5 time step", {
+  OutputsSD <-
+    RunModel(InputsModel, RunOptions, Param = c(Param, InputsModel$LengthHydro / (12 * 3600)), FUN_MOD = RunModel_GR4J)
+  QlsSdSim <-
+    OutputsSD$Qsim * sum(InputsModel$BasinAreas) * 1E6 / 86400
+  QlsUpstLagObs <-
+    (Qupstream[Ind_Run] + c(0, Qupstream[Ind_Run[1:(length(Ind_Run) - 1)]]))/2 * InputsModel$BasinAreas[1] * 1E6 / 86400
+  expect_equal(QlsSdSim - QlsGR4Only, QlsUpstLagObs)
+})
+
+
 test_that("Params from calibration with simulated data should be similar to initial params", {
   InputsCrit <- CreateInputsCrit(
     FUN_CRIT = ErrorCrit_NSE,
     InputsModel = InputsModel,
     RunOptions = RunOptions,
     VarObs = "Q",
-    Obs = BasinObs$Qmm[Ind_Run]
+    Obs = (
+      c(0, Qupstream[Ind_Run[1:(length(Ind_Run) - 1)]]) * BasinAreas[1] +
+      BasinObs$Qmm[Ind_Run] * BasinAreas[2]
+    ) / sum(BasinAreas)
   )
   CalibOptions <- CreateCalibOptions(
     FUN_MOD = RunModel_GR4J,
@@ -114,31 +129,32 @@ test_that("Params from calibration with simulated data should be similar to init
     IsSD = TRUE
   )
   OutputsCalib <- Calibration_Michel(
-      InputsModel = InputsModel,
-      RunOptions = RunOptions,
-      InputsCrit = InputsCrit,
-      CalibOptions = CalibOptions,
-      FUN_MOD = RunModel_GR4J
-    )
-  expect_equal(OutputsCalib$ParamFinalR, ParamSD, tolerance = 1E-3)
+    InputsModel = InputsModel,
+    RunOptions = RunOptions,
+    InputsCrit = InputsCrit,
+    CalibOptions = CalibOptions,
+    FUN_MOD = RunModel_GR4J
+  )
+  expect_equal(OutputsCalib$ParamFinalR[1:4] / ParamSD[1:4], rep(1, 4), tolerance = 1E-2)
+  expect_equal(OutputsCalib$ParamFinalR[5], ParamSD[5], tolerance = 2E-3)
 })
 
 test_that("1 no area input with lag of 1 time step delay out gives an output delayed of one time step converted to mm", {
   Qm3GR4Only <-
-    OutputsGR4JOnly$Qsim * InputsModel$BasinAreas[2] * 1E3
+    OutputsGR4JOnly$Qsim * BasinAreas[2] * 1E3
   # Specify that upstream flow is not related to an area
-  InputsModel$BasinAreas = c(NA, BasinInfo$BasinArea)
-  # Convert upstream flow to Liter/day
-  InputsModel$Qupstream <- matrix(Qupstream, ncol = 1) * BasinInfo$BasinArea * 2
+  InputsModel$BasinAreas = c(NA, BasinAreas[2])
+  # Convert upstream flow to m3/day
+  InputsModel$Qupstream <- matrix(Qupstream, ncol = 1) * BasinAreas[1] * 1E3
+
   OutputsSD <-
     RunModel(InputsModel, RunOptions, Param = ParamSD, FUN_MOD = RunModel_GR4J)
-  
+
   expect_false(any(is.na(OutputsSD$Qsim)))
-  
-  Qm3SdSim <-
-    OutputsSD$Qsim * sum(InputsModel$BasinAreas, na.rm = TRUE) * 1E3
+
+  Qm3SdSim <- OutputsSD$Qsim * sum(InputsModel$BasinAreas, na.rm = TRUE) * 1E3
   Qm3UpstLagObs <-
-    c(0, InputsModel$Qupstream[Ind_Run[1:(length(Ind_Run) - 1)] + 1])
-  
+    c(0, InputsModel$Qupstream[Ind_Run[1:(length(Ind_Run) - 1)]])
+
   expect_equal(Qm3SdSim - Qm3GR4Only, Qm3UpstLagObs)
 })