diff --git a/RecoTracker/MkFit/BuildFile.xml b/RecoTracker/MkFit/BuildFile.xml
new file mode 100644
index 0000000000000..46570ba3ef629
--- /dev/null
+++ b/RecoTracker/MkFit/BuildFile.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/RecoTracker/MkFit/README.md b/RecoTracker/MkFit/README.md
new file mode 100644
index 0000000000000..7bbfde5274be7
--- /dev/null
+++ b/RecoTracker/MkFit/README.md
@@ -0,0 +1,27 @@
+# mkFit
+
+This package holds the glue modules for running
+[mkFit](http://trackreco.github.io/) within CMSSW.
+
+Note that at the moment there may be only one `MkFitProducer` in a
+single job. This restriction will be removed in the future.
+
+## Customize functions for runTheMatrix workflows (offline reconstruction)
+
+* `RecoTracker/MkFit/customizeInitialStepToMkFit.customizeInitialStepToMkFit`
+ * Replaces initialStep track building module with `mkFit`.
+* `RecoTracker/MkFit/customizeInitialStepOnly.customizeInitialStepOnly`
+ * Run only the initialStep tracking. In practice this configuration
+ runs the initialStepPreSplitting iteration, but named as
+ initialStep. MultiTrackValidator is included, and configured to
+ monitor initialStep. Intended to provide the minimal configuration
+ for CMSSW tests.
+* `RecoTracker/MkFit/customizeInitialStepOnly.customizeInitialStepOnlyNoMTV`
+ * Otherwise same as `customizeInitialStepOnly` except drops
+ MultiTrackValidator. Intended for profiling.
+
+
+These can be used with e.g.
+```bash
+$ runTheMatrix.py -l --apply 2 --command "--customise RecoTracker/MkFit/customizeInitialStepToMkFit.customizeInitialStepToMkFit"
+```
\ No newline at end of file
diff --git a/RecoTracker/MkFit/interface/MkFitIndexLayer.h b/RecoTracker/MkFit/interface/MkFitIndexLayer.h
new file mode 100644
index 0000000000000..44035ecb17918
--- /dev/null
+++ b/RecoTracker/MkFit/interface/MkFitIndexLayer.h
@@ -0,0 +1,45 @@
+#ifndef RecoTracker_MkFit_MkFitIndexLayer_h
+#define RecoTracker_MkFit_MkFitIndexLayer_h
+
+#include "DataFormats/Provenance/interface/ProductID.h"
+
+#include
+
+class TrackingRecHit;
+
+class MkFitIndexLayer {
+public:
+ struct HitInfo {
+ HitInfo() : index(-1), layer(-1) {}
+ HitInfo(int i, int l) : index(i), layer(l) {}
+ int index;
+ int layer;
+ };
+
+ struct Coll {
+ explicit Coll(edm::ProductID id) : productID(id) {}
+ edm::ProductID productID;
+ std::vector infos; // indexed by cluster index
+ };
+
+ MkFitIndexLayer() = default;
+
+ void insert(edm::ProductID id, size_t clusterIndex, int hit, int layer, const TrackingRecHit *hitPtr);
+
+ const HitInfo &get(edm::ProductID id, size_t clusterIndex) const;
+
+ const TrackingRecHit *getHitPtr(int layer, int hit) const { return hits_.at(layer).at(hit).ptr; }
+
+ size_t getClusterIndex(int layer, int hit) const { return hits_.at(layer).at(hit).clusterIndex; }
+
+private:
+ struct CMSSWHit {
+ const TrackingRecHit *ptr = nullptr;
+ size_t clusterIndex = 0;
+ };
+
+ std::vector colls_; // mapping from CMSSW(ProductID, index) -> mkfit(index, layer)
+ std::vector > hits_; // reverse mapping, mkfit(layer, index) -> CMSSW hit
+};
+
+#endif
diff --git a/RecoTracker/MkFit/interface/MkFitInputWrapper.h b/RecoTracker/MkFit/interface/MkFitInputWrapper.h
new file mode 100644
index 0000000000000..a281b66c3e415
--- /dev/null
+++ b/RecoTracker/MkFit/interface/MkFitInputWrapper.h
@@ -0,0 +1,44 @@
+#ifndef RecoTracker_MkFit_MkFitInputWrapper_h
+#define RecoTracker_MkFit_MkFitInputWrapper_h
+
+#include "RecoTracker/MkFit/interface/MkFitIndexLayer.h"
+
+#include
+#include
+
+namespace mkfit {
+ class Hit;
+ class Track;
+ class LayerNumberConverter;
+ using HitVec = std::vector;
+ using TrackVec = std::vector