diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index 8b1f90be659916eb1d5e014f198bca484acdb82e..555b64c0bcf3791de0c50d3b038373a65c20792f 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -223,7 +223,7 @@ struct MyBoundaryCrossingProcess
   MyBoundaryCrossingProcess() {}
 
   //~ MyBoundaryCrossingProcess(environment::BaseNodeType const& a,
-  //environment::BaseNodeType const& b) : fA(a), fB(b) {}
+  // environment::BaseNodeType const& b) : fA(a), fB(b) {}
 
   template <typename Particle>
   EProcessReturn DoBoundaryCrossing(Particle& p,
@@ -241,6 +241,19 @@ struct MyBoundaryCrossingProcess
   void Init() {}
 };
 
+template <class T>
+class TheNameModel : public T {
+  std::string const fName;
+
+public:
+  template <typename... Args>
+  TheNameModel(std::string const& name, Args&&... args)
+      : T(std::forward<Args>(args)...)
+      , fName(name) {}
+
+  std::string const& GetName() const override { return fName; }
+};
+
 //
 // The example main program for a particle cascade
 //
@@ -254,24 +267,25 @@ int main() {
   EnvType env;
   auto& universe = *(env.GetUniverse());
 
-  auto outerMedium = environment::Environment<EnvType>::CreateNode<Sphere>(
-      Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
-      1_km * std::numeric_limits<double>::infinity());
+  auto outerMedium =
+      EnvType::CreateNode<Sphere>(Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
+                                  1_km * std::numeric_limits<double>::infinity());
 
   // fraction of oxygen
   const float fox = 0.20946;
-  using MyHomogeneousModel = environment::HomogeneousMedium<setup::IEnvironmentModel>;
-  outerMedium->SetModelProperties<setup::IEnvironmentModel>(
+  outerMedium->SetModelProperties<
+      TheNameModel<environment::HomogeneousMedium<setup::IEnvironmentModel>>>(
       "outer", 1_kg / (1_m * 1_m * 1_m),
       environment::NuclearComposition(
           std::vector<particles::Code>{particles::Code::Nitrogen,
                                        particles::Code::Oxygen},
           std::vector<float>{(float)1. - fox, fox}));
 
-  auto innerMedium = environment::Environment<EnvType>::CreateNode<Sphere>(
+  auto innerMedium = EnvType::CreateNode<Sphere>(
       Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, 2000_m);
 
-  innerMedium->SetModelProperties<setup::IEnvironmentModel>(
+  innerMedium->SetModelProperties<
+      TheNameModel<environment::HomogeneousMedium<setup::IEnvironmentModel>>>(
       "inner", 1_kg / (1_m * 1_m * 1_m),
       environment::NuclearComposition(
           std::vector<particles::Code>{particles::Code::Nitrogen,
@@ -285,17 +299,17 @@ int main() {
   const CoordinateSystem& rootCS = env.GetCoordinateSystem();
 
   // setup processes, decays and interactions
-  tracking_line::TrackingLine<setup::Stack, setup::Trajectory> tracking(env);
+  tracking_line::TrackingLine tracking;
   stack_inspector::StackInspector<setup::Stack> p0(true);
 
   random::RNGManager::GetInstance().RegisterRandomStream("s_rndm");
-  process::sibyll::Interaction sibyll(env);
-  process::sibyll::NuclearInteraction sibyllNuc(env, sibyll);
+  process::sibyll::Interaction sibyll;
+  process::sibyll::NuclearInteraction sibyllNuc(sibyll);
   process::sibyll::Decay decay;
   ProcessCut cut(20_GeV);
 
   random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
-  process::HadronicElasticModel::HadronicElasticInteraction hadronicElastic(env);
+  process::HadronicElasticModel::HadronicElasticInteraction hadronicElastic;
 
   process::TrackWriter::TrackWriter trackWriter("tracks.dat");
 
diff --git a/Environment/NameModel.h b/Environment/NameModel.h
index 29321e5cea6d9820483d5a56b0a328e953af6bad..458c07819e75c6553c6fda4235bd445605218ec6 100644
--- a/Environment/NameModel.h
+++ b/Environment/NameModel.h
@@ -18,16 +18,8 @@ namespace corsika::environment {
 
   template <typename T>
   struct NameModel : public T {
-      
-    template <typename... Args>
-    NameModel(std::string const& name, Args&&... args) : T(std::forward<Args>(args)...), fName(name) {}
-
-    std::string const& GetName() const {
-        return fName;
-    }
-    
-    private:
-      std::string fName;
+    virtual std::string const& GetName() const = 0;
+    virtual ~NameModel() = default;
   };
 
 } // namespace corsika::environment