diff --git a/src/pe/raytracing/Raytracer.cpp b/src/pe/raytracing/Raytracer.cpp
index af2b1d638c26e2755a2cefe2c9235d41b56e6806..a464408bbec02cede0906077b5887f5bbf5ba3af 100644
--- a/src/pe/raytracing/Raytracer.cpp
+++ b/src/pe/raytracing/Raytracer.cpp
@@ -89,6 +89,7 @@ Raytracer::Raytracer(const shared_ptr<BlockStorage> forest, const BlockDataID st
    localImageOutputEnabled_(false),
    imageOutputDirectory_("."),
    filenameTimestepWidth_(5),
+   confinePlanesToDomain_(true),
    bodyToShadingParamsFunc_(bodyToShadingParamsFunc),
    isBodyVisibleFunc_(isBodyVisibleFunc),
    raytracingAlgorithm_(RAYTRACE_HASHGRIDS),
@@ -159,6 +160,7 @@ Raytracer::Raytracer(const shared_ptr<BlockStorage> forest, const BlockDataID st
    }
       
    filenameTimestepWidth_ = config.getParameter<uint8_t>("filenameTimestepWidth", uint8_t(5));
+   confinePlanesToDomain_ = config.getParameter<bool>("confinePlanesToDomain", true);
    
    cameraPosition_ = config.getParameter<Vec3>("cameraPosition");
    lookAtPoint_ = config.getParameter<Vec3>("lookAt");
diff --git a/src/pe/raytracing/Raytracer.h b/src/pe/raytracing/Raytracer.h
index 0749b4df1b31f627e00e23af00e078a6d371be3c..f3579d725f61ac2b75a4e1cbd50fb18d5e88bb62 100644
--- a/src/pe/raytracing/Raytracer.h
+++ b/src/pe/raytracing/Raytracer.h
@@ -130,12 +130,13 @@ private:
                                    * Use e.g. 5 for ranges from 1 to 99 999: Will result in
                                    * filenames like image_00001.png up to image_99999.png. */
    uint8_t filenameRankWidth_;  //!< Width of the mpi rank part in a filename.
+   bool confinePlanesToDomain_; //!< Enable to render only the parts of planes within the simulation domain.
    std::function<ShadingParameters (const BodyID)> bodyToShadingParamsFunc_; /*!< Function which returns a
                                                                               * ShadingParameters struct for the
                                                                               * specified body. */
    std::function<bool (const BodyID)> isBodyVisibleFunc_; /*!< Function which returns a boolean indicating if
                                                            * a given body should be visible in the final image. */
-   Algorithm raytracingAlgorithm_;    //!< Algorithm to use while intersection testing.
+   Algorithm raytracingAlgorithm_;  //!< Algorithm to use while intersection testing.
    ReductionMethod reductionMethod_; //!< Reduction method used for assembling the image from all processes.
    
    static uint64_t naiveIntersectionTestCount;
@@ -174,6 +175,7 @@ public:
    inline bool getLocalImageOutputEnabled() const;
    inline const std::string& getImageOutputDirectory() const;
    inline uint8_t getFilenameTimestepWidth() const;
+   inline bool getConfinePlanesToDomain() const;
    //@}
 
    /*!\name Set functions */
@@ -187,6 +189,7 @@ public:
    inline void setFilenameTimestepWidth(uint8_t width);
    inline void setRaytracingAlgorithm(Algorithm algorithm);
    inline void setReductionMethod(ReductionMethod reductionMethod);
+   inline void setConfinePlanesToDomain(bool confinePlanesToOrigin);
    //@}
    
    /*!\name Functions */
@@ -344,6 +347,13 @@ inline uint8_t Raytracer::getFilenameTimestepWidth() const {
    return filenameTimestepWidth_;
 }
 
+/*!\brief Returns whether the rendering of planes gets confined in the simulation domain.
+ * \return True if the rendering of planes gets confined in the simulation domain.
+ */
+inline bool Raytracer::getConfinePlanesToDomain() const {
+   return confinePlanesToDomain_;
+}
+
 /*!\brief Set the background color of the scene.
  *
  * \param color New background color.
@@ -413,7 +423,14 @@ inline void Raytracer::setRaytracingAlgorithm(Algorithm algorithm) {
 inline void Raytracer::setReductionMethod(ReductionMethod reductionMethod) {
    reductionMethod_ = reductionMethod;
 }
-   
+
+/*!\brief Set if the rendering of planes should get confined to the simulation domain.
+ * \param confinePlanesToOrigin True if the rendering of planes should get confined to the simulation domain.
+ */
+inline void Raytracer::setConfinePlanesToDomain(bool confinePlanesToDomain) {
+   confinePlanesToDomain_ = confinePlanesToDomain;
+}
+
 /*!\brief Checks if a plane should get rendered.
  * \param plane Plane to check for visibility.
  * \param ray Ray which is intersected with plane.
@@ -454,7 +471,8 @@ inline void Raytracer::traceRayInGlobalBodyStorage(const Ray& ray, BodyID& body_
             continue;
          }
          
-         if (bodyIt->getTypeID() == Plane::getStaticTypeID()) {
+         bool isPlane = (bodyIt->getTypeID() == Plane::getStaticTypeID());
+         if (isPlane) {
             PlaneID plane = (PlaneID)bodyIt;
             if (!isPlaneVisible(plane, ray)) {
                continue;
@@ -462,8 +480,11 @@ inline void Raytracer::traceRayInGlobalBodyStorage(const Ray& ray, BodyID& body_
          }
          
          bool intersects = SingleCast<BodyTypeTuple, IntersectsFunctor, bool>::execute(bodyIt, func);
-         
          if (intersects && t < t_closest) {
+            Vec3 intersectionPoint = ray.getOrigin()+ray.getDirection()*t;
+            if (!forest_->getDomain().contains(intersectionPoint, 1e-8)) {
+               continue;
+            }
             // body was shot by ray and is currently closest to camera
             t_closest = t;
             body_closest = bodyIt;