diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 3a2001b71d..c5b91b723c 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -5931,6 +5931,27 @@ static bool ChangeGRFNumUsedParams(size_t len, ByteReader *buf)
 	return true;
 }
 
+/** Callback function for 'INFO'->'PALS' to set the number of valid parameters. */
+static bool ChangeGRFPalette(size_t len, ByteReader *buf)
+{
+	if (len != 1) {
+		grfmsg(2, "StaticGRFInfo: expected only 1 byte for 'INFO'->'PALS' but got " PRINTF_SIZE ", ignoring this field", len);
+		buf->Skip(len);
+	} else {
+		char data = buf->ReadByte();
+		switch (data) {
+			case '*':
+			case 'A': _cur_grfconfig->palette |= GRFP_GRF_ANY;     break;
+			case 'W': _cur_grfconfig->palette |= GRFP_GRF_WINDOWS; break;
+			case 'D': _cur_grfconfig->palette |= GRFP_GRF_DOS;     break;
+			default:
+				grfmsg(2, "StaticGRFInfo: unexpected value '%02x' for 'INFO'->'PALS', ignoring this field", data);
+				break;
+		}
+	}
+	return true;
+}
+
 typedef bool (*DataHandler)(size_t, ByteReader *);  ///< Type of callback function for binary nodes
 typedef bool (*TextHandler)(byte, const char *str); ///< Type of callback function for text nodes
 typedef bool (*BranchHandler)(ByteReader *);        ///< Type of callback function for branch nodes
@@ -6018,6 +6039,7 @@ AllowedSubtags _tags_info[] = {
 	AllowedSubtags('NAME', ChangeGRFName),
 	AllowedSubtags('DESC', ChangeGRFDescription),
 	AllowedSubtags('NPAR', ChangeGRFNumUsedParams),
+	AllowedSubtags('PALS', ChangeGRFPalette),
 	AllowedSubtags()
 };
 
diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp
index c7a4f01b00..6bdf5117d3 100644
--- a/src/newgrf_config.cpp
+++ b/src/newgrf_config.cpp
@@ -92,7 +92,12 @@ const char *GRFConfig::GetDescription() const
  */
 void GRFConfig::SetSuitablePalette()
 {
-	PaletteType pal = _use_palette;
+	PaletteType pal;
+	switch (this->palette & GRFP_GRF_MASK) {
+		case GRFP_GRF_DOS:     pal = PAL_DOS;      break;
+		case GRFP_GRF_WINDOWS: pal = PAL_WINDOWS;  break;
+		default:               pal = _use_palette; break;
+	}
 	SB(this->palette, GRFP_USE_BIT, 1, pal == PAL_WINDOWS ? GRFP_USE_WINDOWS : GRFP_USE_DOS);
 }
 
diff --git a/src/newgrf_config.h b/src/newgrf_config.h
index c9d2079a01..588d8b8263 100644
--- a/src/newgrf_config.h
+++ b/src/newgrf_config.h
@@ -52,10 +52,18 @@ enum GRFListCompatibility {
 /** Information that can/has to be stored about a GRF's palette. */
 enum GRFPalette {
 	GRFP_USE_BIT     = 0,   ///< The bit used for storing the palette to use.
+	GRFP_GRF_OFFSET  = 2,   ///< The offset of the GRFP_GRF data.
+	GRFP_GRF_SIZE    = 2,   ///< The size of the GRFP_GRF data.
 
 	GRFP_USE_DOS     = 0x0, ///< The palette state is set to use the DOS palette.
 	GRFP_USE_WINDOWS = 0x1, ///< The palette state is set to use the Windows palette.
 	GRFP_USE_MASK    = 0x1, ///< Bitmask to get only the use palette use states.
+
+	GRFP_GRF_UNSET   = 0x0 << GRFP_GRF_OFFSET,          ///< The NewGRF provided no information.
+	GRFP_GRF_DOS     = 0x1 << GRFP_GRF_OFFSET,          ///< The NewGRF says the DOS palette can be used.
+	GRFP_GRF_WINDOWS = 0x2 << GRFP_GRF_OFFSET,          ///< The NewGRF says the Windows palette can be used.
+	GRFP_GRF_ANY     = GRFP_GRF_DOS | GRFP_GRF_WINDOWS, ///< The NewGRF says any palette can be used.
+	GRFP_GRF_MASK    = GRFP_GRF_ANY,                    ///< Bitmask to get only the NewGRF supplied information.
 };