diff --git a/resources/images/filter.svg b/resources/images/filter.svg
new file mode 100644
index 0000000000..c48942073b
--- /dev/null
+++ b/resources/images/filter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index c22b9b64fd..5e502207ef 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -329,6 +329,8 @@ set(SLIC3R_GUI_SOURCES
GUI/Mouse3DController.hpp
GUI/MsgDialog.cpp
GUI/MsgDialog.hpp
+ GUI/MultiChoiceDialog.hpp
+ GUI/MultiChoiceDialog.cpp
GUI/MultiMachine.cpp
GUI/MultiMachine.hpp
GUI/MultiMachineManagerPage.cpp
@@ -496,6 +498,8 @@ set(SLIC3R_GUI_SOURCES
GUI/Widgets/Button.hpp
GUI/Widgets/CheckBox.cpp
GUI/Widgets/CheckBox.hpp
+ GUI/Widgets/CheckList.cpp
+ GUI/Widgets/CheckList.hpp
GUI/Widgets/ComboBox.cpp
GUI/Widgets/ComboBox.hpp
GUI/Widgets/DialogButtons.cpp
diff --git a/src/slic3r/GUI/MultiChoiceDialog.cpp b/src/slic3r/GUI/MultiChoiceDialog.cpp
new file mode 100644
index 0000000000..6bd5412737
--- /dev/null
+++ b/src/slic3r/GUI/MultiChoiceDialog.cpp
@@ -0,0 +1,58 @@
+#include "MultiChoiceDialog.hpp"
+
+#include "GUI_App.hpp"
+#include "MainFrame.hpp"
+
+namespace Slic3r { namespace GUI {
+
+MultiChoiceDialog::MultiChoiceDialog(
+ wxWindow* parent,
+ const wxString& message,
+ const wxString& caption,
+ const wxArrayString& choices
+)
+ : DPIDialog(parent ? parent : static_cast(wxGetApp().mainframe), wxID_ANY, caption, wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX)
+{
+ SetBackgroundColour(*wxWHITE);
+
+ wxBoxSizer* w_sizer = new wxBoxSizer(wxVERTICAL);
+
+ if(!message.IsEmpty()){
+ wxStaticText *msg = new wxStaticText(this, wxID_ANY, message);
+ msg->SetFont(Label::Body_13);
+ msg->Wrap(-1);
+ w_sizer->Add(msg, 0, wxRIGHT | wxLEFT | wxTOP, FromDIP(10));
+ }
+
+ m_check_list = new CheckList(this, choices);
+
+ w_sizer->Add(m_check_list, 1, wxRIGHT | wxLEFT | wxTOP | wxEXPAND, FromDIP(10));
+
+ auto dlg_btns = new DialogButtons(this, {"OK", "Cancel"});
+
+ dlg_btns->GetOK()->Bind( wxEVT_BUTTON, [this](wxCommandEvent &e) {EndModal(wxID_OK);});
+ dlg_btns->GetCANCEL()->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {EndModal(wxID_CANCEL);});
+
+ w_sizer->Add(dlg_btns, 0, wxEXPAND);
+
+ SetSizer(w_sizer);
+ Layout();
+ w_sizer->Fit(this);
+ wxGetApp().UpdateDlgDarkUI(this);
+}
+
+wxArrayInt MultiChoiceDialog::GetSelections() const
+{
+ return m_check_list->GetSelections();
+}
+
+void MultiChoiceDialog::SetSelections(wxArrayInt sel_array)
+{
+ m_check_list->SetSelections(sel_array);
+}
+
+MultiChoiceDialog::~MultiChoiceDialog() {}
+
+void MultiChoiceDialog::on_dpi_changed(const wxRect &suggested_rect) {}
+
+}} // namespace Slic3r::GUI
\ No newline at end of file
diff --git a/src/slic3r/GUI/MultiChoiceDialog.hpp b/src/slic3r/GUI/MultiChoiceDialog.hpp
new file mode 100644
index 0000000000..f636bebd3b
--- /dev/null
+++ b/src/slic3r/GUI/MultiChoiceDialog.hpp
@@ -0,0 +1,37 @@
+#ifndef slic3r_GUI_MultiChoiceDialog_hpp_
+#define slic3r_GUI_MultiChoiceDialog_hpp_
+
+#include "Widgets/CheckList.hpp"
+#include "Widgets/DialogButtons.hpp"
+
+#include
+#include
+#include