diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp
index 5124e1a99..54addbd97 100644
--- a/src/libslic3r/GCode/GCodeProcessor.cpp
+++ b/src/libslic3r/GCode/GCodeProcessor.cpp
@@ -541,6 +541,10 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config)
     if (bed_shape != nullptr)
         m_result.bed_shape = bed_shape->values;
 
+    const ConfigOptionString* printer_settings_id = config.option<ConfigOptionString>("printer_settings_id");
+    if (printer_settings_id != nullptr)
+        m_result.printer_settings_id = printer_settings_id->value;
+
     const ConfigOptionFloats* filament_diameters = config.option<ConfigOptionFloats>("filament_diameter");
     if (filament_diameters != nullptr) {
         for (double diam : filament_diameters->values) {
diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp
index 90552e658..22aeed762 100644
--- a/src/libslic3r/GCode/GCodeProcessor.hpp
+++ b/src/libslic3r/GCode/GCodeProcessor.hpp
@@ -261,6 +261,7 @@ namespace Slic3r {
             unsigned int id;
             std::vector<MoveVertex> moves;
             Pointfs bed_shape;
+            std::string printer_settings_id;
             std::vector<std::string> extruder_colors;
             PrintEstimatedTimeStatistics time_statistics;
 
diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp
index 7176ca81a..a5160d2db 100644
--- a/src/libslic3r/Preset.cpp
+++ b/src/libslic3r/Preset.cpp
@@ -1812,6 +1812,26 @@ namespace PresetUtils {
 		}
 		return out;
 	}
+
+#if ENABLE_GCODE_VIEWER
+    std::string system_printer_bed_model(const Preset& preset)
+    {
+        std::string out;
+        const VendorProfile::PrinterModel* pm = PresetUtils::system_printer_model(preset);
+        if (pm != nullptr && !pm->bed_model.empty())
+            out = Slic3r::resources_dir() + "/profiles/" + preset.vendor->id + "/" + pm->bed_model;
+        return out;
+    }
+
+    std::string system_printer_bed_texture(const Preset& preset)
+    {
+        std::string out;
+        const VendorProfile::PrinterModel* pm = PresetUtils::system_printer_model(preset);
+        if (pm != nullptr && !pm->bed_texture.empty())
+            out = Slic3r::resources_dir() + "/profiles/" + preset.vendor->id + "/" + pm->bed_texture;
+        return out;
+    }
+#endif // ENABLE_GCODE_VIEWER
 } // namespace PresetUtils
 
 } // namespace Slic3r
diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp
index e34fca4dd..30edfc859 100644
--- a/src/libslic3r/Preset.hpp
+++ b/src/libslic3r/Preset.hpp
@@ -527,6 +527,10 @@ public:
 namespace PresetUtils {
 	// PrinterModel of a system profile, from which this preset is derived, or null if it is not derived from a system profile.
 	const VendorProfile::PrinterModel* system_printer_model(const Preset &preset);
+#if ENABLE_GCODE_VIEWER
+    std::string system_printer_bed_model(const Preset& preset);
+    std::string system_printer_bed_texture(const Preset& preset);
+#endif // ENABLE_GCODE_VIEWER
 } // namespace PresetUtils
 
 
diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp
index aa9bf3803..8a29d08bd 100644
--- a/src/slic3r/GUI/3DBed.cpp
+++ b/src/slic3r/GUI/3DBed.cpp
@@ -414,6 +414,7 @@ void Bed3D::calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox)
         printf("Unable to create bed grid lines\n");
 }
 
+#if !ENABLE_GCODE_VIEWER
 static std::string system_print_bed_model(const Preset &preset)
 {
 	std::string out;
@@ -431,6 +432,7 @@ static std::string system_print_bed_texture(const Preset &preset)
 		out = Slic3r::resources_dir() + "/profiles/" + preset.vendor->id + "/" + pm->bed_texture;
 	return out;
 }
+#endif // !ENABLE_GCODE_VIEWER
 
 std::tuple<Bed3D::EType, std::string, std::string> Bed3D::detect_type(const Pointfs& shape) const
 {
@@ -440,8 +442,13 @@ std::tuple<Bed3D::EType, std::string, std::string> Bed3D::detect_type(const Poin
         while (curr != nullptr) {
             if (curr->config.has("bed_shape")) {
                 if (shape == dynamic_cast<const ConfigOptionPoints*>(curr->config.option("bed_shape"))->values) {
+#if ENABLE_GCODE_VIEWER
+                    std::string model_filename = PresetUtils::system_printer_bed_model(*curr);
+                    std::string texture_filename = PresetUtils::system_printer_bed_texture(*curr);
+#else
                     std::string model_filename = system_print_bed_model(*curr);
                     std::string texture_filename = system_print_bed_texture(*curr);
+#endif // ENABLE_GCODE_VIEWER
                     if (!model_filename.empty() && !texture_filename.empty())
                         return { System, model_filename, texture_filename };
                 }
diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp
index db126552f..80a5e15ed 100644
--- a/src/slic3r/GUI/GCodeViewer.cpp
+++ b/src/slic3r/GUI/GCodeViewer.cpp
@@ -335,9 +335,21 @@ void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print&
         load_shells(print, initialized);
     else {
         Pointfs bed_shape;
-        if (!gcode_result.bed_shape.empty())
+        std::string texture;
+        std::string model;
+
+        if (!gcode_result.bed_shape.empty()) {
             // bed shape detected in the gcode
             bed_shape = gcode_result.bed_shape;
+            auto bundle = wxGetApp().preset_bundle;
+            if (bundle != nullptr && !gcode_result.printer_settings_id.empty()) {
+                const Preset* preset = bundle->printers.find_preset(gcode_result.printer_settings_id);
+                if (preset != nullptr) {
+                    model = PresetUtils::system_printer_bed_model(*preset);
+                    texture = PresetUtils::system_printer_bed_texture(*preset);
+                }
+            }
+        }
         else {
             // adjust printbed size in dependence of toolpaths bbox
             const double margin = 10.0;
@@ -359,7 +371,8 @@ void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print&
                 { min(0) + 0.442265 * size[0], max(1)},
                 { min(0), max(1) } };
         }
-        wxGetApp().plater()->set_bed_shape(bed_shape, "", "", true);
+
+        wxGetApp().plater()->set_bed_shape(bed_shape, texture, model, gcode_result.bed_shape.empty());
     }
 
 #if GCODE_VIEWER_TIME_ESTIMATE != TIME_ESTIMATE_NONE