diff --git a/opossum/examples/beam_combine_test.rs b/opossum/examples/beam_combine_test.rs
index 88c10990385122f848639d48a0383c7bf01e8a99..43e9dcf2cc23947443e4daf594e0cdd557ca528a 100644
--- a/opossum/examples/beam_combine_test.rs
+++ b/opossum/examples/beam_combine_test.rs
@@ -7,7 +7,7 @@ use opossum::{
     error::OpmResult,
     lightdata::{DataEnergy, LightData},
     nanometer,
-    nodes::{BeamSplitter, Detector, FilterType, IdealFilter, NodeGroup, Source},
+    nodes::{BeamSplitter, Dummy, FilterType, IdealFilter, NodeGroup, Source},
     ray::SplittingConfig,
     spectrum_helper::{self, create_he_ne_spec, create_nd_glass_spec, generate_filter_spectrum},
     OpmDocument,
@@ -40,7 +40,7 @@ fn main() -> OpmResult<()> {
         "filter",
         &FilterType::Spectrum(filter_spectrum),
     )?)?;
-    let i_d1 = scenery.add_node(&Detector::default())?; // Detector 1
+    let i_d1 = scenery.add_node(&Dummy::default())?;
 
     scenery.connect_nodes(i_s1, "out1", i_bs, "input1", Length::zero())?;
     scenery.connect_nodes(i_s2, "out1", i_bs, "input2", Length::zero())?;
diff --git a/opossum/examples/michaelson.rs b/opossum/examples/michaelson.rs
index cb8f289140dc807723555f19cf181cdf06207119..afaffd5cebb01e3805c8fa692fe6360ef5057d7f 100644
--- a/opossum/examples/michaelson.rs
+++ b/opossum/examples/michaelson.rs
@@ -3,7 +3,7 @@ use opossum::{
     analyzers::AnalyzerType,
     error::OpmResult,
     lightdata::{DataEnergy, LightData},
-    nodes::{BeamSplitter, Detector, Dummy, NodeGroup, NodeReference, Source},
+    nodes::{BeamSplitter, Dummy, NodeGroup, NodeReference, Source},
     spectrum_helper::create_he_ne_spec,
     OpmDocument,
 };
@@ -26,7 +26,7 @@ fn main() -> OpmResult<()> {
     let m2 = scenery.add_node(&Dummy::new("Mirror"))?;
     let rf = NodeReference::from_node(&scenery.node(bs)?);
     let r_bs = scenery.add_node(&rf)?;
-    let det = scenery.add_node(&Detector::default())?;
+    let det = scenery.add_node(&Dummy::new("Detector"))?;
 
     scenery.connect_nodes(src, "out1", bs, "input1", Length::zero())?;
     scenery.connect_nodes(bs, "out1_trans1_refl2", sample, "front", Length::zero())?;
diff --git a/opossum/src/nodes/detector.rs b/opossum/src/nodes/detector.rs
deleted file mode 100644
index c7f3245d13f2c4eeb27979a3c2000c2c4aa7909f..0000000000000000000000000000000000000000
--- a/opossum/src/nodes/detector.rs
+++ /dev/null
@@ -1,272 +0,0 @@
-#![warn(missing_docs)]
-use super::node_attr::NodeAttr;
-use crate::{
-    analyzers::{
-        energy::AnalysisEnergy, ghostfocus::AnalysisGhostFocus, raytrace::AnalysisRayTrace,
-        Analyzable, RayTraceConfig,
-    },
-    dottable::Dottable,
-    error::{OpmResult, OpossumError},
-    light_result::LightResult,
-    lightdata::LightData,
-    optic_node::{Alignable, OpticNode, LIDT},
-    optic_ports::{OpticPorts, PortType},
-    surface::{OpticalSurface, Plane},
-    utils::geom_transformation::Isometry,
-};
-use log::warn;
-use std::fmt::Debug;
-
-/// A universal detector (so far for testing / debugging purposes).
-///
-/// Any [`LightData`] coming in will be stored internally for later display / export.
-///
-/// ## Optical Ports
-///   - Inputs
-///     - `in1`
-///   - Outputs
-///     - `out1`
-///
-/// ## Properties
-///   - `name`
-///   - `apertures`
-///   - `inverted`
-///
-/// During analysis, the output port contains a replica of the input port similar to a [`Dummy`](crate::nodes::Dummy) node. This way,
-/// different detector nodes can be "stacked" or used somewhere in between arbitrary optic nodes.
-#[derive(Clone)]
-pub struct Detector {
-    light_data: Option<LightData>,
-    node_attr: NodeAttr,
-    surface: OpticalSurface,
-}
-impl Default for Detector {
-    fn default() -> Self {
-        let mut ports = OpticPorts::new();
-        ports.add(&PortType::Input, "in1").unwrap();
-        ports.add(&PortType::Output, "out1").unwrap();
-        let mut node_attr = NodeAttr::new("detector");
-        node_attr.set_ports(ports);
-        Self {
-            light_data: Option::default(),
-            node_attr,
-            surface: OpticalSurface::new(Box::new(Plane::new(&Isometry::identity()))),
-        }
-    }
-}
-impl Detector {
-    /// Creates a new [`Detector`].
-    /// # Attributes
-    /// * `name`: name of the  [`Detector`]
-    ///
-    /// # Panics
-    /// This function panics if
-    /// - the input port name already exists. (Theoretically impossible at this point, as the [`OpticPorts`] are created just before in this function)
-    /// - the output port name already exists. (Theoretically impossible at this point, as the [`OpticPorts`] are created just before in this function)
-    /// - the property `apertures` can not be set.
-    #[must_use]
-    pub fn new(name: &str) -> Self {
-        let mut detector = Self::default();
-        detector.node_attr.set_name(name);
-        detector
-    }
-}
-impl OpticNode for Detector {
-    fn node_attr(&self) -> &NodeAttr {
-        &self.node_attr
-    }
-    fn node_attr_mut(&mut self) -> &mut NodeAttr {
-        &mut self.node_attr
-    }
-    fn reset_data(&mut self) {
-        self.light_data = None;
-        self.surface.reset_hit_map();
-    }
-    fn get_surface_mut(&mut self, _surf_name: &str) -> &mut OpticalSurface {
-        &mut self.surface
-    }
-}
-
-impl Debug for Detector {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        match &self.light_data {
-            Some(data) => write!(f, "{data}"),
-            None => write!(f, "no data"),
-        }
-    }
-}
-impl Dottable for Detector {
-    fn node_color(&self) -> &str {
-        "lemonchiffon"
-    }
-}
-impl LIDT for Detector {}
-
-impl Analyzable for Detector {}
-impl AnalysisGhostFocus for Detector {}
-impl AnalysisEnergy for Detector {
-    fn analyze(&mut self, incoming_data: LightResult) -> OpmResult<LightResult> {
-        let (inport, outport) = if self.inverted() {
-            ("out1", "in1")
-        } else {
-            ("in1", "out1")
-        };
-        let Some(data) = incoming_data.get(inport) else {
-            return Ok(LightResult::default());
-        };
-        let outgoing_data = LightResult::from([(outport.to_string(), data.clone())]);
-        Ok(outgoing_data)
-    }
-}
-impl AnalysisRayTrace for Detector {
-    fn analyze(
-        &mut self,
-        incoming_data: LightResult,
-        config: &RayTraceConfig,
-    ) -> OpmResult<LightResult> {
-        let (in_port, out_port) = if self.inverted() {
-            ("out1", "in1")
-        } else {
-            ("in1", "out1")
-        };
-        let Some(data) = incoming_data.get(in_port) else {
-            return Ok(LightResult::default());
-        };
-        if let LightData::Geometric(rays) = data {
-            let mut rays = rays.clone();
-            if let Some(iso) = self.effective_iso() {
-                self.surface.set_isometry(&iso);
-                rays.refract_on_surface(&mut self.surface, None)?;
-                if let Some(aperture) = self.ports().aperture(&PortType::Input, in_port) {
-                    let rays_apodized = rays.apodize(aperture, &iso)?;
-                    if rays_apodized {
-                        warn!("Rays have been apodized at input aperture of {}. Results might not be accurate.", self as &mut dyn OpticNode);
-                    }
-                    rays.invalidate_by_threshold_energy(config.min_energy_per_ray())?;
-                } else {
-                    return Err(OpossumError::OpticPort("input aperture not found".into()));
-                };
-                self.light_data = Some(LightData::Geometric(rays.clone()));
-                if let Some(aperture) = self.ports().aperture(&PortType::Output, out_port) {
-                    rays.apodize(aperture, &iso)?;
-                    rays.invalidate_by_threshold_energy(config.min_energy_per_ray())?;
-                } else {
-                    return Err(OpossumError::OpticPort("input aperture not found".into()));
-                };
-            } else {
-                return Err(OpossumError::Analysis(
-                    "no location for surface defined. Aborting".into(),
-                ));
-            }
-            Ok(LightResult::from([(
-                out_port.into(),
-                LightData::Geometric(rays),
-            )]))
-        } else {
-            Ok(LightResult::from([(out_port.into(), data.clone())]))
-        }
-    }
-
-    fn get_light_data_mut(&mut self) -> Option<&mut LightData> {
-        self.light_data.as_mut()
-    }
-    fn set_light_data(&mut self, ld: LightData) {
-        self.light_data = Some(ld);
-    }
-}
-impl Alignable for Detector {}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-    use crate::{
-        lightdata::DataEnergy, nodes::test_helper::test_helper::*, optic_ports::PortType,
-        spectrum_helper::create_he_ne_spec,
-    };
-    #[test]
-    fn default() {
-        let mut node = Detector::default();
-        assert_eq!(node.name(), "detector");
-        assert_eq!(node.node_type(), "detector");
-        assert_eq!(node.inverted(), false);
-        assert_eq!(node.node_color(), "lemonchiffon");
-        assert!(node.as_group().is_err());
-    }
-    #[test]
-    fn new() {
-        let node = Detector::new("test");
-        assert_eq!(node.name(), "test");
-    }
-    #[test]
-    fn inverted() {
-        test_inverted::<Detector>()
-    }
-    #[test]
-    fn set_aperture() {
-        test_set_aperture::<Detector>("in1", "out1");
-    }
-    #[test]
-    fn ports() {
-        let node = Detector::default();
-        assert_eq!(node.ports().names(&PortType::Input), vec!["in1"]);
-        assert_eq!(node.ports().names(&PortType::Output), vec!["out1"]);
-    }
-    #[test]
-    fn ports_inverted() {
-        let mut node = Detector::default();
-        node.set_inverted(true).unwrap();
-        assert_eq!(node.ports().names(&PortType::Input), vec!["out1"]);
-        assert_eq!(node.ports().names(&PortType::Output), vec!["in1"]);
-    }
-    #[test]
-    fn analyze_empty() {
-        test_analyze_empty::<Detector>()
-    }
-    #[test]
-    fn analyze_wrong() {
-        let mut node = Detector::default();
-        let mut input = LightResult::default();
-        let input_light = LightData::Energy(DataEnergy {
-            spectrum: create_he_ne_spec(1.0).unwrap(),
-        });
-        input.insert("wrong".into(), input_light.clone());
-        let output = AnalysisEnergy::analyze(&mut node, input).unwrap();
-        assert!(output.is_empty());
-    }
-    #[test]
-    fn analyze_ok() {
-        let mut node = Detector::default();
-        let mut input = LightResult::default();
-        let input_light = LightData::Energy(DataEnergy {
-            spectrum: create_he_ne_spec(1.0).unwrap(),
-        });
-        input.insert("in1".into(), input_light.clone());
-        let output = AnalysisEnergy::analyze(&mut node, input).unwrap();
-        assert!(output.contains_key("out1"));
-        assert_eq!(output.len(), 1);
-        let output = output.get("out1").unwrap();
-        assert_eq!(*output, input_light);
-    }
-    #[test]
-    fn analyze_apodization_warning() {
-        test_analyze_apodization_warning::<Detector>()
-    }
-    #[test]
-    fn analyze_inverse() {
-        let mut node = Detector::default();
-        node.set_inverted(true).unwrap();
-        let mut input = LightResult::default();
-        let input_light = LightData::Energy(DataEnergy {
-            spectrum: create_he_ne_spec(1.0).unwrap(),
-        });
-        input.insert("out1".to_string(), input_light.clone());
-
-        let output = AnalysisEnergy::analyze(&mut node, input).unwrap();
-        assert!(output.contains_key("in1"));
-        assert_eq!(output.len(), 1);
-        let output = output.get("in1");
-        assert!(output.is_some());
-        let output = output.clone().unwrap();
-        assert_eq!(*output, input_light);
-    }
-}
diff --git a/opossum/src/nodes/mod.rs b/opossum/src/nodes/mod.rs
index f463f05b5f6c7aa3ad75472c220ad3f9e1007347..b27ea8b5473a71a01c731f3bdd1c61d3da822e0b 100644
--- a/opossum/src/nodes/mod.rs
+++ b/opossum/src/nodes/mod.rs
@@ -3,7 +3,6 @@
 
 mod beam_splitter;
 mod cylindric_lens;
-mod detector;
 mod dummy;
 mod energy_meter;
 mod ideal_filter;
@@ -27,7 +26,6 @@ pub mod ray_propagation_visualizer;
 pub mod reflective_grating;
 pub use beam_splitter::BeamSplitter;
 pub use cylindric_lens::CylindricLens;
-pub use detector::Detector;
 pub use dummy::Dummy;
 pub use energy_meter::{EnergyMeter, Metertype};
 pub use fluence_detector::{FluenceData, FluenceDetector};
@@ -72,11 +70,6 @@ pub fn create_node_ref(node_type: &str, uuid: Option<Uuid>) -> OpmResult<OpticRe
             uuid,
             None,
         )),
-        "detector" => Ok(OpticRef::new(
-            Rc::new(RefCell::new(Detector::default())),
-            uuid,
-            None,
-        )),
         "beam splitter" => Ok(OpticRef::new(
             Rc::new(RefCell::new(BeamSplitter::default())),
             uuid,
diff --git a/opossum/src/nodes/node_group/mod.rs b/opossum/src/nodes/node_group/mod.rs
index 0ba27cc703b8f058ef7d52530424b10a9de93cec..704c80080db50539a7a4402bf2f7dde301d1894f 100644
--- a/opossum/src/nodes/node_group/mod.rs
+++ b/opossum/src/nodes/node_group/mod.rs
@@ -563,7 +563,7 @@ mod test {
         light_result::LightResult,
         lightdata::LightData,
         millimeter, nanometer,
-        nodes::{test_helper::test_helper::*, Detector, Dummy, EnergyMeter, Source},
+        nodes::{test_helper::test_helper::*, Dummy, EnergyMeter, Source},
         optic_node::OpticNode,
         ray::Ray,
         rays::Rays,
@@ -641,7 +641,7 @@ mod test {
     #[test]
     fn report() {
         let mut scenery = NodeGroup::default();
-        scenery.add_node(&Detector::default()).unwrap();
+        scenery.add_node(&Dummy::default()).unwrap();
         let report = scenery.toplevel_report().unwrap();
         assert!(serde_yaml::to_string(&report).is_ok());
         // How shall we further parse the output?