diff --git a/src/game/game.cpp b/src/game/game.cpp
index 8328f41a0..3b8ca4482 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -294,23 +294,53 @@ static void WriteMapPreview(const char *mapname, CMap &map)
 
 	png_write_info(png_ptr, info_ptr);
 
+	const int rectSize = 5; // size of rectange used for player start spots
 #if defined(USE_OPENGL) || defined(USE_GLES)
 	if (UseOpenGL) {
-		unsigned char *row = new unsigned char[UI.Minimap.W * 3];
-		if (!row) {
+		unsigned char *pixels = new unsigned char[UI.Minimap.W * UI.Minimap.H * 3];
+		if (!pixels) {
 			fprintf(stderr, "Out of memory\n");
 			exit(1);
 		}
+		// Copy GL map surface to pixel array
 		for (int i = 0; i < UI.Minimap.H; ++i) {
 			for (int j = 0; j < UI.Minimap.W; ++j) {
 				Uint32 c = ((Uint32 *)MinimapSurfaceGL)[j + i * UI.Minimap.W];
-				row[j * 3 + 0] = ((c & RMASK) >> RSHIFT);
-				row[j * 3 + 1] = ((c & GMASK) >> GSHIFT);
-				row[j * 3 + 2] = ((c & BMASK) >> BSHIFT);
+				const int offset = (i * UI.Minimap.W + j) * 3;
+				pixels[offset + 0] = ((c & RMASK) >> RSHIFT);
+				pixels[offset + 1] = ((c & GMASK) >> GSHIFT);
+				pixels[offset + 2] = ((c & BMASK) >> BSHIFT);
 			}
-			png_write_row(png_ptr, row);
 		}
-		delete[] row;
+		// Add player start spots
+		for (int i = 0; i < PlayerMax - 1; ++i) {
+			if (Players[i].Type != PlayerNobody) {
+				for (int j = -rectSize / 2; j <= rectSize / 2; ++j) {
+					for (int k = -rectSize / 2; k <= rectSize / 2; ++k) {
+						const int miniMapX = Players[i].StartPos.x * UI.Minimap.W / map.Info.MapWidth;
+						const int miniMapY = Players[i].StartPos.y * UI.Minimap.H / map.Info.MapHeight;
+						if (miniMapX + j < 0 || miniMapX + j >= UI.Minimap.W) {
+							continue;
+						}
+						if (miniMapY + k < 0 || miniMapY + k >= UI.Minimap.H) {
+							continue;
+						}
+						const int offset = ((miniMapX + j) * UI.Minimap.W + miniMapY + k) * 3;
+						pixels[offset + 0] = ((Players[i].Color & RMASK) >> RSHIFT);
+						pixels[offset + 1] = ((Players[i].Color & GMASK) >> GSHIFT);
+						pixels[offset + 2] = ((Players[i].Color & BMASK) >> BSHIFT);
+					}
+				}
+			}
+		}
+		// Write everything in PNG
+		for (int i = 0; i < UI.Minimap.H; ++i) {
+			unsigned char *row = new unsigned char[UI.Minimap.W * 3];
+			memcpy(row, pixels + i * UI.Minimap.W * 3, UI.Minimap.W * 3);
+			png_write_row(png_ptr, row);
+			delete[] row;
+		}
+		delete[] pixels;
 	} else
 #endif
 	{
@@ -323,7 +353,6 @@ static void WriteMapPreview(const char *mapname, CMap &map)
 		SDL_LockSurface(preview);
 
 		SDL_Rect rect;
-		const unsigned int rectSize = 5;
 		for (int i = 0; i < PlayerMax - 1; ++i) {
 			if (Players[i].Type != PlayerNobody) {
 				rect.x = Players[i].StartPos.x * UI.Minimap.W / map.Info.MapWidth - rectSize / 2;