diff --git a/Entity.cpp b/Entity.cpp
index df138d4272defbd283e4b612b439cd059546044e..82ad6c39e3e3c900e4f60ce0efdb9c5c1a8f1726 100644
--- a/Entity.cpp
+++ b/Entity.cpp
@@ -39,6 +39,11 @@ float Entity::getTop() const
 	return topleft.Y;
 }
 
+int Entity::getHitPoints() const
+{
+	return hitpoints;
+}
+
 float Entity::getHitTime() const
 {
     return hittime;
diff --git a/Entity.hpp b/Entity.hpp
index 64b1a72392d3c090c8d4ae80bc5fc1e4840d9b44..8fb4f492a4368cdff5aec887ec90c1046693a74a 100644
--- a/Entity.hpp
+++ b/Entity.hpp
@@ -39,6 +39,7 @@ public:
 	float getLeft() const;
 	float getTop() const;
 
+	int getHitPoints() const;
 	float getHitTime() const;
 	/// ----------------
 
diff --git a/Level.cpp b/Level.cpp
index 91893ea2494267c27d34044803efe03a73cad84c..cec0902b5b2e5e035fe6e98a4adf52df6c663602 100644
--- a/Level.cpp
+++ b/Level.cpp
@@ -145,7 +145,8 @@ void Level::enemyVector_PushBack(std::unique_ptr<Enemy> enemy_)
 
 bool Level::doDoSteps(FloatSeconds const &frame_time)
 {
-    if(!player.step(player.getTopLeft(), frame_time, *this)) {
+    player.step(player.getTopLeft(), frame_time, *this);
+    if(player.getHitPoints() == 0) {
         return false;
     }
 
diff --git a/PixelShaders.cpp b/PixelShaders.cpp
index 99000fa77c740240495b8aedfe4d21f314c1bc65..376ec5e68630a9ce9abef6eeeea324296450fd91 100644
--- a/PixelShaders.cpp
+++ b/PixelShaders.cpp
@@ -24,3 +24,28 @@ Color HitShader::peekUnchecked(PixelPoint const &pos) const
 	}
 	return (dist(rng.rng) > 0.95f) ? color : (is_final ? _t : src);
 }
+
+Color DiagonalFadeoutShader::peekUnchecked(PixelPoint const &pos) const
+{
+	// (percent * 1) would only correspond to the top-left triangle.
+	auto src = input.peek(pos);
+	auto edge_right = (input.w() * (percent * 2));
+	auto edge_bottom = (input.h() * (percent * 2));
+	// y = mx + t
+
+	//   Top right point:             0 = m·[edge_right] + t
+	// Bottom left point: [edge_bottom] = m·0            + t
+
+	//              0 = m·[edge_right] + [edge_bottom]
+	// -[edge_bottom] = m·[edge_right]
+	//              m = -[edge_bottom]/[edge_right]
+	auto t = edge_bottom;
+	auto m = (-edge_bottom / edge_right);
+
+	auto x_end = ((pos.y - t) / m);
+
+	if((pos.x & 0x1) ^ ((pos.y & 0x1) == 1)) {
+		return src;
+	}
+	return (pos.x <= x_end) ? _0 : src;
+}
diff --git a/PixelShaders.hpp b/PixelShaders.hpp
index 7dd2d0558e99eed3fecbe56fac5b5a72e74fdb80..bb20dc2de2823d08007dec4422d3ed3790644126 100644
--- a/PixelShaders.hpp
+++ b/PixelShaders.hpp
@@ -21,4 +21,15 @@ public:
 	virtual Color peekUnchecked(PixelPoint const &pos) const;
 };
 
+class DiagonalFadeoutShader : public ShadedPixelBuffer {
+public:
+	float percent;
+
+	DiagonalFadeoutShader(PixelBuffer const &input, float percent) :
+		ShadedPixelBuffer(input), percent(percent) {
+	}
+
+	virtual Color peekUnchecked(PixelPoint const &pos) const;
+};
+
 #endif /* PIXELSHADERS_HPP */
diff --git a/main.cpp b/main.cpp
index ae981af79c49ef0c615e5d218ea7a8bf8f7d916d..d9f5f85d000fa36c5760d31b5f314668b757dc02 100644
--- a/main.cpp
+++ b/main.cpp
@@ -2,6 +2,7 @@
 #include <sstream>
 
 #include "PixelBuffer.hpp" // hoffmanncl72341
+#include "PixelShaders.hpp" // hoffmanncl72341
 #include "Platform_Win32Console.hpp" // hoffmanncl72341
 #include "Level.hpp" // kruegerzo72182
 #include "Enemy.hpp" // hauerch71498
@@ -36,6 +37,7 @@ class GameLoop {
     int frame = 0;
     FloatSeconds time_elapsed{ 0.0f };
     bool GameOverFlag = false; //hauerch71498
+    float GameOverTime = 0.0f;
 
     DynamicPixelBuffer framebuffer = {screenWidth, screenHeigth};
 
@@ -112,22 +114,29 @@ public:
         // <kruegerzo72182
         // player movement
         player_.move(platform, frame_time, level);
+        } else {
+            GameOverTime += frame_time.count();
+        }
 
         // enemy movement
         GameOverFlag = (level.doDoSteps(frame_time) == false);
-        }
-        // Output to the console, Gamelogic should happen before this
-        framebuffer.blit_topleft({ 0, 0 }, level.draw());
-        // kruegerzo72182>
 
+        // Output to the console, Gamelogic should happen before this
+        auto const &levelBuffer = level.draw();
         if(GameOverFlag) {
+            DiagonalFadeoutShader dfs = {levelBuffer, (GameOverTime / 2.0f)};
+            framebuffer.blit_topleft({ 0, 0 }, dfs);
+
             Score Highscore;
             Highscore.SetScoreSprite(level.getScore());
             framebuffer.blit_topleft(Highscore.GameOverPos,Highscore.getGameOverSprite());
             for(auto & i : Highscore.ScoreBoard){
                 framebuffer.blit_topleft(i.ScorePos,i.getScoreSprite());
             }
+        } else {
+            framebuffer.blit_topleft({ 0, 0 }, levelBuffer);
         }
+        // kruegerzo72182>
         // <hoffmanncl72341
         platform.render(framebuffer);