diff --git a/src/modules/TrackingMultiplet/README.md b/src/modules/TrackingMultiplet/README.md
index 38d968d6db16b2b3544f6b7da950e5bf912206d7..70ce97345a0383c5652d43f292bf2f1c8715bd04 100644
--- a/src/modules/TrackingMultiplet/README.md
+++ b/src/modules/TrackingMultiplet/README.md
@@ -32,9 +32,11 @@ For each upstream tracklet, the downstream tracklet with the lowest matching dis
 * `time_cut_abs`: Specifies an absolute value for the maximum time difference allowed between clusters and an upstream or downstream tracklet for association to the tracklet. Absolute and relative time cuts are mutually exclusive. No default value.
 * `spatial_cut_rel`: Factor by which the `spatial_resolution` in x and y of each detector plane will be multiplied. These calculated value are defining an ellipse which is then used as the maximum distance in the XY plane allowed between clusters and an upstream or downstream tracklet for association to the tracklet. This allows the spatial cuts between different planes to be detector appropriate. By default, a relative spatial cut is applied. Absolute and relative spatial cuts are mutually exclusive. Defaults to `3.0`.
 * `spatial_cut_abs`: Specifies a set of absolute value (x and y) which defines an ellipse for the maximum spatial distance in the XY plane between clusters and an upstream or downstream tracklet for association to the tracklet. Absolute and relative spatial cuts are mutually exclusive. No default value.
-* `track_model`: Specifies the track model used for the up and downstream
-arms. Defaults to `straightline`
+* `track_model`: Specifies the track model used for the up and downstream arms. Defaults to `straightline`
 * `momentum`: Defines the beam momentum. Only required if `track_model="gbl"`
+* `require_detectors`: Names of detectors which are required to have a cluster on the track. If a track does not have a cluster from all detectors listed here, it is rejected. If empty, no detector is required. Default is empty.
+* `timestamp_from`: Defines the detector which provides the track timestamp. This detector is by default added to `required_detector`. If empty, the average timestamp of upstream and downstream tracklet will be used. Empty by default.
+* `refit_gbl`: Refit the multiplet tracks with GBL. Defaults to false.
 
 ### Plots produced
 
diff --git a/src/modules/TrackingMultiplet/TrackingMultiplet.cpp b/src/modules/TrackingMultiplet/TrackingMultiplet.cpp
index 96862d04f6c33a8fa16c9aea0c01b073c3d732e2..f5f69f56206646d04163f190f647e958442be117 100644
--- a/src/modules/TrackingMultiplet/TrackingMultiplet.cpp
+++ b/src/modules/TrackingMultiplet/TrackingMultiplet.cpp
@@ -53,6 +53,15 @@ TrackingMultiplet::TrackingMultiplet(Configuration& config, std::vector<std::sha
     config_.setDefault<bool>("refit_gbl", false);
     refit_gbl_ = config_.get<bool>("refit_gbl");
 
+    require_detectors_ = config_.getArray<std::string>("require_detectors", {});
+    timestamp_from_ = config_.get<std::string>("timestamp_from", {});
+    if(!timestamp_from_.empty() &&
+       std::find(require_detectors_.begin(), require_detectors_.end(), timestamp_from_) == require_detectors_.end()) {
+        LOG(WARNING) << "Adding detector " << timestamp_from_
+                     << " to list of required detectors as it provides the timestamp";
+        require_detectors_.push_back(timestamp_from_);
+    }
+
     config_.setDefaultArray<std::string>("upstream_detectors", default_upstream_detectors);
     config_.setDefaultArray<std::string>("downstream_detectors", default_downstream_detectors);
 
@@ -66,6 +75,9 @@ TrackingMultiplet::TrackingMultiplet(Configuration& config, std::vector<std::sha
     for(auto detectorID : downstream_detectors_str) {
         m_downstream_detectors.push_back(get_detector(detectorID));
     }
+    for(auto detectorID : require_detectors_) {
+        m_require_detectors.push_back(get_detector(detectorID));
+    }
 
     if(m_upstream_detectors.size() < 2) {
         throw InvalidValueError(config_, "upstream_detectors", "At least two upstream detectors have to be provided.");
@@ -116,6 +128,24 @@ TrackingMultiplet::TrackingMultiplet(Configuration& config, std::vector<std::sha
                                       "Last upstream detector is located behind first downstream detector.");
     }
 
+    // check if required detectors are included either upstream or downstream
+    for(auto detector : m_require_detectors) {
+        auto includedUpstream =
+            (std::find(m_upstream_detectors.begin(), m_upstream_detectors.end(), detector) != m_upstream_detectors.end());
+        auto includedDownstream =
+            (std::find(m_upstream_detectors.begin(), m_upstream_detectors.end(), detector) != m_upstream_detectors.end());
+        if(includedUpstream) {
+            LOG(DEBUG) << detector->getName() << " is required and listed as upstream.";
+        } else if(includedDownstream) {
+            LOG(DEBUG) << detector->getName() << " is required and listed as downstream.";
+        } else {
+            throw InvalidCombinationError(config_,
+                                          {"upstream_detectors", "downstream_detectors", "require_detectors"},
+                                          "Detector " + detector->getName() +
+                                              " is listed as required but not found either upstream nor downstream.");
+        }
+    }
+
     config_.setDefault<size_t>("min_hits_upstream", m_upstream_detectors.size());
     config_.setDefault<size_t>("min_hits_downstream", m_downstream_detectors.size());
 
@@ -652,8 +682,33 @@ StatusCode TrackingMultiplet::run(const std::shared_ptr<Clipboard>& clipboard) {
         }
 
         LOG(DEBUG) << "Multiplet found";
-        multiplet->setTimestamp(
-            (multiplet->getUpstreamTracklet()->timestamp() + multiplet->getDownstreamTracklet()->timestamp()) / 2.);
+
+        // check if track has required detector(s):
+        auto foundRequiredDetector = [this](Track* t) {
+            for(auto& requireDet : require_detectors_) {
+                if(!requireDet.empty() && !t->hasDetector(requireDet)) {
+                    LOG(DEBUG) << "No cluster from required detector " << requireDet << " on the track.";
+                    return false;
+                }
+            }
+            return true;
+        };
+        if(!foundRequiredDetector(multiplet.get())) {
+            continue;
+        }
+
+        if(timestamp_from_.empty()) {
+            double average_timestamp =
+                (multiplet->getUpstreamTracklet()->timestamp() + multiplet->getDownstreamTracklet()->timestamp()) / 2.;
+            multiplet->setTimestamp(average_timestamp);
+            LOG(DEBUG) << "Using average timestamp of " << Units::display(average_timestamp, "us") << " as track timestamp.";
+        } else {
+            auto* cluster = multiplet->getClusterFromDetector(timestamp_from_);
+            double det_timestamp = cluster->timestamp();
+            LOG(DEBUG) << "Using timestamp of detector " << timestamp_from_
+                       << " as track timestamp: " << Units::display(det_timestamp, "us");
+            multiplet->setTimestamp(det_timestamp);
+        }
 
         LOG(DEBUG) << "Deleting downstream tracklet";
         downstream_tracklets.erase(used_downtracklet);
diff --git a/src/modules/TrackingMultiplet/TrackingMultiplet.h b/src/modules/TrackingMultiplet/TrackingMultiplet.h
index b075ca583932952fd1f11983c69bbb7129757f88..43618d6f2c68dbcec0d6c70b7a032734a8d937f0 100644
--- a/src/modules/TrackingMultiplet/TrackingMultiplet.h
+++ b/src/modules/TrackingMultiplet/TrackingMultiplet.h
@@ -61,6 +61,7 @@ namespace corryvreckan {
 
         std::vector<std::shared_ptr<Detector>> m_upstream_detectors;
         std::vector<std::shared_ptr<Detector>> m_downstream_detectors;
+        std::vector<std::shared_ptr<Detector>> m_require_detectors;
 
         double scatterer_position_;
         double scatterer_matching_cut_;
@@ -72,6 +73,8 @@ namespace corryvreckan {
 
         // track model for up/downstream fit
         std::string track_model_;
+        std::string timestamp_from_;
+        std::vector<std::string> require_detectors_;
 
         // Member histograms
         std::map<streams, TH1F*> trackletMultiplicity;