diff --git a/resources/images/printer_thumbnail_h2d.svg b/resources/images/printer_thumbnail_h2d.svg
new file mode 100644
index 0000000000..9108233afc
--- /dev/null
+++ b/resources/images/printer_thumbnail_h2d.svg
@@ -0,0 +1,531 @@
+
diff --git a/resources/images/printer_thumbnail_h2d_dark.svg b/resources/images/printer_thumbnail_h2d_dark.svg
new file mode 100644
index 0000000000..050c20f449
--- /dev/null
+++ b/resources/images/printer_thumbnail_h2d_dark.svg
@@ -0,0 +1,533 @@
+
diff --git a/resources/printers/O1D.json b/resources/printers/O1D.json
new file mode 100644
index 0000000000..3892481cdd
--- /dev/null
+++ b/resources/printers/O1D.json
@@ -0,0 +1,74 @@
+{
+ "00.00.00.00": {
+ "display_name": "Bambu Lab H2D",
+ "print": {
+ "2D": {
+ "laser": {
+ "power": [ 10, 40 ]
+ }
+ },
+ "ipcam": {
+ "resolution_supported": [ "1080p" ],
+ "virtual_camera": "enabled",
+ "liveview": {
+ "remote": "tutk"
+ },
+ "file": {
+ "local": "local",
+ "remote": "tutk",
+ "model_download": "enabled"
+ }
+ },
+ "nozzle_temp_range": [ 20, 350 ],
+ "bed_temp_range": [ 20, 120 ],
+ "support_motor_noise_cali": false,
+ "support_tunnel_mqtt": true,
+ "support_mqtt_alive": true,
+ "support_command_ams_switch": true,
+ "support_ssl_for_mqtt": true,
+ "support_cloud_print_only": false,
+ "support_1080dpi": true,
+ "support_prompt_sound": false,
+ "support_ams_humidity": true,
+ "support_auto_recovery_step_loss": true,
+ "support_bed_leveling": 2,
+ "support_update_remain": true,
+ "support_timelapse": true,
+ "support_filament_backup": true,
+ "support_chamber_fan": true,
+ "support_aux_fan": true,
+ "support_send_to_sd": true,
+ "support_print_all": true,
+ "support_print_without_sd": true,
+ "support_flow_calibration": true,
+ "support_auto_flow_calibration": true,
+ "support_build_plate_marker_detect": true,
+ "support_build_plate_marker_detect_type": 2,
+ "support_lidar_calibration": false,
+ "support_nozzle_offset_calibration": true,
+ "support_high_tempbed_calibration": true,
+ "support_ai_monitoring": true,
+ "support_first_layer_inspect": false,
+ "support_save_remote_print_file_to_storage": true,
+ "support_chamber_temp_edit": true,
+ "support_chamber_temp_edit_range": [ 20, 65 ],
+ "support_chamber_temp_switch_heating": 40,
+ "support_extrusion_cali": false,
+ "support_user_preset": false
+ },
+ "model_id": "O1D",
+ "printer_modes": [ "fdm", "laser", "cut" ],
+ "compatible_machine": [],
+ "printer_type": "O1D",
+ "printer_thumbnail_image": "printer_thumbnail_h2d",
+ "printer_connect_help_image": "input_access_code_h2d",
+ "printer_use_ams_image": "ams_icon",
+ "printer_ext_image": ["ext_image_o_right", "ext_image_o_left"],
+ "use_ams_type": "generic",
+ "printer_arch": "core_xy",
+ "printer_series": "series_o",
+ "has_cali_line": true,
+ "printer_is_enclosed": true,
+ "enable_set_nozzle_info": false
+ }
+}
\ No newline at end of file
diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp
index 2117481013..fe48163b83 100644
--- a/src/slic3r/GUI/DeviceManager.cpp
+++ b/src/slic3r/GUI/DeviceManager.cpp
@@ -531,7 +531,7 @@ bool MachineObject::is_lan_mode_printer() const
PrinterSeries MachineObject::get_printer_series() const
{
std::string series = DeviceManager::get_printer_series(printer_type);
- if (series == "series_x1")
+ if (series == "series_x1" || series == "series_o")
return PrinterSeries::SERIES_X1;
else if (series == "series_p1p")
return PrinterSeries::SERIES_P1P;
diff --git a/src/slic3r/GUI/UpgradePanel.cpp b/src/slic3r/GUI/UpgradePanel.cpp
index 9241aac4d5..c8463dedb7 100644
--- a/src/slic3r/GUI/UpgradePanel.cpp
+++ b/src/slic3r/GUI/UpgradePanel.cpp
@@ -632,8 +632,10 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj)
{
bool has_hub_model = false;
+ bool is_o_series = DeviceManager::get_printer_series(obj->printer_type) == "series_o";
+
//hub
- if (!obj->online_ahb || obj->module_vers.find("ahb") == obj->module_vers.end())
+ if (!obj->online_ahb || obj->module_vers.find("ahb") == obj->module_vers.end() || is_o_series)
m_ahb_panel->Hide();
else {
has_hub_model = true;
@@ -946,7 +948,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj)
//ext
auto ext_module = obj->module_vers.find("ext");
- if (ext_module == obj->module_vers.end())
+ if (ext_module == obj->module_vers.end() || is_o_series)
show_ext(false);
else {
wxString sn_text = ext_module->second.sn;