diff --git a/src/ce_MRICH.cpp b/src/ce_MRICH.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4f5418fc98ecedd3fd9ef813afa1a0b404328f4d
--- /dev/null
+++ b/src/ce_MRICH.cpp
@@ -0,0 +1,61 @@
+
+#include <XML/Helper.h>
+#include "TMath.h"
+#include "TString.h"
+#include "Math/Point2D.h"
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/OpticalSurfaces.h"
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
+
+using namespace std;
+using namespace dd4hep;
+using namespace dd4hep::rec;
+
+typedef ROOT::Math::XYPoint Point;
+
+
+// create the detector
+static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetector sens)
+{
+ xml::DetElement detElem = handle;
+ std::string detName = detElem.nameStr();
+ int detID = detElem.id();
+
+ DetElement det(detName, detID);
+ xml::Component dims = detElem.dimensions();
+ xml::Component mods = detElem.child(_Unicode(modules));
+ xml::Component rads = detElem.child(_Unicode(radiator));
+
+ auto RIn = dims.attr<double>(_Unicode(r_in));
+ auto ROut = dims.attr<double>(_Unicode(r_out));
+ auto SizeZ = dims.attr<double>(_Unicode(size_z));
+ auto PosZ = dims.z();
+ auto InnerR = dims.attr<double>(_Unicode(inner_r));
+
+ auto mThick = mods.attr<double>(_Unicode(thickness));
+ auto mWidth = mods.attr<double>(_Unicode(width));
+ auto mGap = mods.attr<double>(_Unicode(gap));
+
+ auto envMat = desc.material(detElem.materialStr());
+
+ // detector envelope
+ auto envShape = Tube(RIn, ROut, SizeZ / 2., 0., 2*M_PI);
+ Volume envVol("ce_MRICH_GVol", envShape, envMat);
+ envVol.setVisAttributes(desc.visAttributes(detElem.visStr()));
+
+ // modules
+
+ // place envelope
+ Volume motherVol = desc.pickMotherVolume(det);
+ PlacedVolume envPV = motherVol.placeVolume(envVol, Position(0, 0, PosZ));
+ envPV.addPhysVolID("system", detID);
+ det.setPlacement(envPV);
+ return det;
+}
+
+
+// clang-format off
+DECLARE_DETELEMENT(ce_MRICH, createDetector)
+