diff --git a/tests/executables_src/testPropagateDataFaultFlag.cc b/tests/executables_src/testPropagateDataFaultFlag.cc
index 8df58345c6b3e991e454017dd9c5e314584435dc..638e8aa1853c4e740d31a598c9a53fcf50b47b8c 100644
--- a/tests/executables_src/testPropagateDataFaultFlag.cc
+++ b/tests/executables_src/testPropagateDataFaultFlag.cc
@@ -699,4 +699,85 @@ BOOST_AUTO_TEST_CASE(testConsumingFanout){
   BOOST_CHECK_EQUAL(fromConsumingFanout, 0);
   BOOST_CHECK(fromConsumingFanout.dataValidity() == ctk::DataValidity::ok);
 }
+
+BOOST_AUTO_TEST_CASE(testDataFlowOnDeviceException) {
+  auto threadedFanoutInput = test.getScalar<int>("m1/o1");
+  auto m1_result = test.getScalar<int>("m1/Module1_result");
+  auto m2_result = test.getScalar<int>("m2/Module2_result");
+
+  auto consumingFanoutSource = device1->getRawAccessor("m1", "i1");
+  consumingFanoutSource = 1000;
+
+  auto pollRegister = device2->getRawAccessor("m1", "i2");
+  pollRegister = 100;
+
+  threadedFanoutInput = 1;
+
+  // ------------------------------------------------------------------//
+  // without exception
+  app.run();
+  threadedFanoutInput.write();
+  CHECK_TIMEOUT(m1_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m1_result, 1101);
+  BOOST_CHECK(m1_result.dataValidity() == ctk::DataValidity::ok);
+
+  CHECK_TIMEOUT(m2_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m2_result, 1101);
+  BOOST_CHECK(m2_result.dataValidity() == ctk::DataValidity::ok);
+
+  // ------------------------------------------------------------------//
+  // faulty threadedFanout input
+  threadedFanoutInput.setDataValidity(ctk::DataValidity::faulty);
+  threadedFanoutInput.write();
+
+  CHECK_TIMEOUT(m1_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m1_result, 1101);
+  BOOST_CHECK(m1_result.dataValidity() == ctk::DataValidity::faulty);
+
+  CHECK_TIMEOUT(m2_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m2_result, 1101);
+  BOOST_CHECK(m2_result.dataValidity() == ctk::DataValidity::faulty);
+
+  // ---------------------------------------------------------------------//
+  // device module exception
+  device2->throwExceptionRead = true;
+  threadedFanoutInput = 0;
+  threadedFanoutInput.write();
+
+  CHECK_TIMEOUT(m1_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m1_result, 1101);
+  BOOST_CHECK(m1_result.dataValidity() == ctk::DataValidity::faulty);
+
+  CHECK_TIMEOUT(m2_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m2_result, 1101);
+  BOOST_CHECK(m2_result.dataValidity() == ctk::DataValidity::faulty);
+
+  // ---------------------------------------------------------------------//
+  // device exception recovery
+  device2->throwExceptionRead = false;
+
+
+  CHECK_TIMEOUT(m1_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m1_result, 1100);
+  BOOST_CHECK(m1_result.dataValidity() == ctk::DataValidity::faulty);
+
+  CHECK_TIMEOUT(m2_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m2_result, 1100);
+  BOOST_CHECK(m2_result.dataValidity() == ctk::DataValidity::faulty);
+
+  // ---------------------------------------------------------------------//
+  // recovery: fanout input
+  device2->throwExceptionRead = false;
+  threadedFanoutInput.setDataValidity(ctk::DataValidity::ok);
+  threadedFanoutInput.write();
+
+  CHECK_TIMEOUT(m1_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m1_result, 1100);
+  BOOST_CHECK(m1_result.dataValidity() == ctk::DataValidity::ok);
+
+  CHECK_TIMEOUT(m2_result.readLatest(), 10000);
+  BOOST_CHECK_EQUAL(m2_result, 1100);
+  BOOST_CHECK(m2_result.dataValidity() == ctk::DataValidity::ok);
+}
+
 BOOST_AUTO_TEST_SUITE_END()