diff --git a/Framework/ProcessSequence/ConditionalProcessSequence.h b/Framework/ProcessSequence/ConditionalProcessSequence.h
index 1c81b4561bce1e48f486db532a3d82ba7ffe35c5..40f5ffac5e565a52d3c0914584286ccd9c813e52 100644
--- a/Framework/ProcessSequence/ConditionalProcessSequence.h
+++ b/Framework/ProcessSequence/ConditionalProcessSequence.h
@@ -27,19 +27,29 @@ namespace corsika::process {
 
   public:
     static constexpr bool is_boundary_crossing =
-        TSeq::is_boundary_crossing || USeq::is_boundary_crossing;
-    static constexpr bool is_continuous = TSeq::is_continuous || USeq::is_continuous;
-    static constexpr bool is_decay = TSeq::is_decay || USeq::is_decay;
-    static constexpr bool is_interaction = TSeq::is_interaction || USeq::is_interaction;
-    static constexpr bool is_secondaries = TSeq::is_secondaries || USeq::is_secondaries;
-    static constexpr bool is_stack = TSeq::is_stack || USeq::is_stack;
+        std::decay_t<true_seq_t>::is_boundary_crossing ||
+        std::decay_t<false_seq_t>::is_boundary_crossing;
+    static constexpr bool is_continuous = std::decay_t<true_seq_t>::is_continuous ||
+                                          std::decay_t<false_seq_t>::is_continuous;
+    static constexpr bool is_decay =
+        std::decay_t<true_seq_t>::is_decay || std::decay_t<false_seq_t>::is_decay;
+    static constexpr bool is_interaction = std::decay_t<true_seq_t>::is_interaction ||
+                                           std::decay_t<false_seq_t>::is_interaction;
+    static constexpr bool is_secondaries = std::decay_t<true_seq_t>::is_secondaries ||
+                                           std::decay_t<false_seq_t>::is_secondaries;
+    static constexpr bool is_stack =
+        std::decay_t<true_seq_t>::is_stack || std::decay_t<false_seq_t>::is_stack;
 
     template <class TPredicate_, class TTrueSeq, class TFalseSeq>
     ConditionalProcessSequence(TPredicate_&& pred, TTrueSeq&& true_seq,
                                TFalseSeq&& false_seq)
         : pred_(std::forward<TPredicate_>(pred))
         , true_seq_(std::forward<TTrueSeq>(true_seq))
-        , false_seq_(std::forward<TFalseSeq>(false_seq)) {}
+        , false_seq_(std::forward<TFalseSeq>(false_seq)) {
+      static_assert(
+          is_process_v<std::decay_t<TTrueSeq>> && is_process_v<std::decay_t<TFalseSeq>>,
+          "arguments must be processes");
+    }
 
     template <typename TParticle, typename VTNType>
     EProcessReturn DoBoundaryCrossing(TParticle& vP, VTNType const& vFrom,
@@ -142,19 +152,14 @@ namespace corsika::process {
     false_seq_t false_seq_;
   };
 
-  // deduction guides
+  // deduction guide, see deduction guide of ProcessSequence
   template <class P, class T, class U>
   ConditionalProcessSequence(P&&, T&&, U &&)
       ->ConditionalProcessSequence<
-          P, boost::mp11::mp_rename<std::decay_t<T>, ProcessSequence>,
-          boost::mp11::mp_rename<std::decay_t<U>, ProcessSequence>>;
-
-  // template <class T, class U>
-  // ConditionalProcessSequence(corsika::units::si::HEPEnergyType, T&&, U &&)
-  //     ->ConditionalProcessSequence<
-  //         ByThreshold, boost::mp11::mp_rename<std::decay_t<T>, ProcessSequence>,
-  //         boost::mp11::mp_rename<std::decay_t<U>, ProcessSequence>>;
+          P, boost::mp11::mp_if<std::is_rvalue_reference<T>, std::decay_t<T>, T>,
+          boost::mp11::mp_if<std::is_rvalue_reference<U>, std::decay_t<U>, U>>;
 
+  // predicate for deduction guide below
   struct EnergyThreshold {
     EnergyThreshold(corsika::units::si::HEPEnergyType x)
         : value{x} {}
@@ -167,11 +172,14 @@ namespace corsika::process {
     corsika::units::si::HEPEnergyType value;
   };
 
-  template <class... Ts, class... Us>
-  ConditionalProcessSequence(corsika::units::si::HEPEnergyType,
-                             const ProcessSequence<Ts...>&, const ProcessSequence<Us...>&)
-      ->ConditionalProcessSequence<EnergyThreshold, ProcessSequence<Ts...>,
-                                   ProcessSequence<Us...>>;
+  // convenience: generate ConditionalProcessSequence with energy threshold
+  // when first argument is energy unit type
+  template <class T, class U>
+  ConditionalProcessSequence(corsika::units::si::HEPEnergyType, T&&, U &&)
+      ->ConditionalProcessSequence<
+          EnergyThreshold,
+          boost::mp11::mp_if<std::is_rvalue_reference<T>, std::decay_t<T>, T>,
+          boost::mp11::mp_if<std::is_rvalue_reference<U>, std::decay_t<U>, U>>;
 
 } // namespace corsika::process
 
diff --git a/Framework/ProcessSequence/testConditionalProcessSequence.cc b/Framework/ProcessSequence/testConditionalProcessSequence.cc
index 8961360f1841d962d54ce13dd2d2094939576fbd..487a5f3985f50b1c932a68a00931bba41ef56d7d 100644
--- a/Framework/ProcessSequence/testConditionalProcessSequence.cc
+++ b/Framework/ProcessSequence/testConditionalProcessSequence.cc
@@ -65,10 +65,7 @@ TEST_CASE("ConditionalProcessSequence") {
   DummyProcess<3> false_P;
   DummyProcess<4> additional;
 
-  ConditionalProcessSequence<EnergyThreshold,
-                             ProcessSequence<DummyProcess<1>&, DummyProcess<2>&>,
-                             ProcessSequence<DummyProcess<3>&>>
-      cseq(1_TeV, ProcessSequence(true_A, true_B), false_P);
+  ConditionalProcessSequence cseq(1_TeV, ProcessSequence(true_A, true_B), false_P);
   ProcessSequence seq(cseq, additional);
 
   SECTION("low energy") {