diff --git a/DDRec/src/LayerStack.cpp b/DDRec/src/LayerStack.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..077dac6428e5cf5bbc47659cfd01594b1c49e763
--- /dev/null
+++ b/DDRec/src/LayerStack.cpp
@@ -0,0 +1,165 @@
+/*
+ * Layer.cpp
+ *
+ *  Created on: Apr 18, 2013
+ *      Author: Christian Grefe, CERN
+ */
+
+#include "LayerStack.h"
+#include "Exceptions.h"
+#include "DD4hep/Detector.h"
+#include "DD4hep/Shapes.h"
+
+#include <sstream>
+
+namespace DD4hep {
+namespace DDRec{
+
+using std::stringstream;
+
+LayerStack::LayerStack(const DetElement& det) : det(det) {
+
+}
+
+LayerStack::LayerStack(const LayerStack& layerStack, const DetElement& det) : det(det) {
+
+}
+
+LayerStack::~LayerStack() {
+
+}
+
+double LayerStack::getThickness(int layerIndex, int moduleIndex) const {
+	double thickness = 0.;
+	for (int sliceIndex = 0; sliceIndex < getNumberOfSlices(layerIndex, moduleIndex); sliceIndex++) {
+		thickness += Box(getSlice(layerIndex, moduleIndex, sliceIndex+1).volume().solid())->GetDZ();
+	}
+	return thickness;
+}
+
+double LayerStack::getRadiationLengths(int layerIndex, int moduleIndex) const {
+	double radiationLengths = 0.;
+	for (int sliceIndex = 0; sliceIndex < getNumberOfSlices(layerIndex, moduleIndex); sliceIndex++) {
+		radiationLengths += Box(getSlice(layerIndex, moduleIndex, sliceIndex+1).volume().solid())->GetDZ() / getSlice(layerIndex, moduleIndex).volume().material().radLength();
+	}
+	return radiationLengths;
+}
+
+double LayerStack::getInteractionLengths(int layerIndex, int moduleIndex) const {
+	double interactionLengths = 0.;
+	for (int sliceIndex = 0; sliceIndex < getNumberOfSlices(layerIndex, moduleIndex); sliceIndex++) {
+		interactionLengths += Box(getSlice(layerIndex, moduleIndex, sliceIndex+1).volume().solid())->GetDZ() / getSlice(layerIndex, moduleIndex).volume().material().intLength();
+	}
+	return interactionLengths;
+}
+
+double LayerStack::getTotalThickness(int moduleIndex) const {
+	double thickness = 0.;
+	for (int layerIndex = 0; layerIndex < getNumberOfLayers(); layerIndex++) {
+		thickness += getThickness(layerIndex+1, moduleIndex);
+	}
+	return thickness;
+}
+
+double LayerStack::getTotalInteractionLengths(int moduleIndex) const {
+	double interactionLengths = 0.;
+	for (int layerIndex = 0; layerIndex < getNumberOfLayers(); layerIndex++) {
+		interactionLengths += getInteractionLengths(layerIndex+1, moduleIndex);
+	}
+	return interactionLengths;
+}
+
+double LayerStack::getTotalRadiationLengths(int moduleIndex) const {
+	double radiationLengths = 0.;
+	for (int layerIndex = 0; layerIndex < getNumberOfLayers(); layerIndex++) {
+		radiationLengths += getRadiationLengths(layerIndex+1, moduleIndex);
+	}
+	return radiationLengths;
+}
+
+PolyhedralCalorimeterLayerStack::PolyhedralCalorimeterLayerStack(const DetElement& det) : LayerStack(det) {
+
+}
+
+PolyhedralCalorimeterLayerStack::PolyhedralCalorimeterLayerStack(const PolyhedralCalorimeterLayerStack& layerStack, const DetElement& det) : LayerStack(layerStack, det) {
+
+}
+
+PolyhedralCalorimeterLayerStack::~PolyhedralCalorimeterLayerStack() {
+
+}
+
+int PolyhedralCalorimeterLayerStack::getNumberOfLayers() const {
+	stringstream moduleName;
+	moduleName << "stave1";
+	DetElement module = det.child(moduleName.str());
+	if (not module.isValid()) {
+		std::cerr << "Invalid module name " << moduleName.str() << std::endl;
+		return 0;
+	}
+	return module.children().size();
+}
+
+int PolyhedralCalorimeterLayerStack::getNumberOfModules(int layerIndex) const {
+	return det.children().size();
+}
+
+DetElement PolyhedralCalorimeterLayerStack::getModule(int layerIndex, int moduleIndex) const {
+	stringstream moduleName;
+	moduleName << "stave" << moduleIndex;
+	DetElement module = det.child(moduleName.str());
+	if (not module.isValid()) {
+		std::cerr << "Invalid module name " << moduleName.str() << std::endl;
+		return DetElement();
+	}
+	stringstream layerName;
+	layerName << "layer" << layerIndex;
+	DetElement layer = module.child(layerName.str());
+	if (not layer.isValid()) {
+		std::cerr << "Invalid layer name " << layerName.str() << std::endl;
+		return DetElement();
+	}
+	return layer;
+}
+
+int PolyhedralCalorimeterLayerStack::getNumberOfSlices(int layerIndex, int moduleIndex) const {
+	return getModule(layerIndex, moduleIndex).children().size();
+}
+
+DetElement PolyhedralCalorimeterLayerStack::getSlice(int layerIndex, int moduleIndex, int sliceIndex) const {
+	stringstream sliceName;
+	sliceName << "slice" << sliceIndex;
+	DetElement slice = getModule(layerIndex, moduleIndex).child(sliceName.str());
+	if (not slice.isValid()) {
+		std::cerr << "Invalid slice name " << sliceName.str() << std::endl;
+		return DetElement();
+	}
+	return getModule(layerIndex, moduleIndex).child(sliceName.str());
+}
+
+int PolyhedralCalorimeterLayerStack::getNumberOfSensors(int layerIndex, int moduleIndex) const {
+	int nSensors = 0;
+	for (int sliceIndex = 0; sliceIndex < getNumberOfSlices(layerIndex, moduleIndex); sliceIndex++) {
+		if (getSlice(layerIndex, moduleIndex, sliceIndex+1).volume().isSensitive()) {
+			nSensors++;
+		}
+	}
+	return nSensors;
+}
+
+DetElement PolyhedralCalorimeterLayerStack::getSensor(int layerIndex, int moduleIndex, int sensorIndex) const {
+	int nSensors = 0;
+	for (int sliceIndex = 0; sliceIndex < getNumberOfSlices(layerIndex, moduleIndex); sliceIndex++) {
+		DetElement slice = getSlice(layerIndex, moduleIndex, sliceIndex+1);
+		if (slice.volume().isSensitive()) {
+			nSensors++;
+		}
+		if (nSensors == sensorIndex) {
+			return slice;
+		}
+	}
+	throw OutsideGeometryException("No sensor with index " + sensorIndex);
+}
+
+} /* namespace DDRec */
+} /* namespace DD4hep */
diff --git a/DDRec/src/LayeredSubdetector.cpp b/DDRec/src/LayeredSubdetector.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cccc4c59d7e84c3a52e0d97b9bac50cc7c42695a
--- /dev/null
+++ b/DDRec/src/LayeredSubdetector.cpp
@@ -0,0 +1,23 @@
+#include "LayeredSubdetector.h"
+
+namespace DD4hep {
+namespace DDRec{
+
+LayeredSubdetector::LayeredSubdetector(const DetElement& e) :
+		DetElement(e) {
+	getExtension();
+}
+
+LayeredSubdetector::~LayeredSubdetector() {
+
+}
+
+void LayeredSubdetector::getExtension() {
+	layerStack = isValid() ? extension<LayerStack>() : 0;
+	if (layerStack == 0) {
+		std::cout << "Failed to get the extension" << std::endl;
+	}
+}
+
+} /* namespace DDRec */
+} /* namespace DD4hep */