**Ditch the `Enum`.** [![enter image description here][1]][1] AFAIC Using an enum property to list the materials has been superseded by using a pointer property to the ID object type. In this case a material. https://blender.stackexchange.com/questions/199233/custom-search-data-to-uilayout-prop-search https://blender.stackexchange.com/questions/74904/search-custom-properties-in-objects-on-the-scene-python/101303#101303 Have used this option here. Given the property group a `material` property, which is a pointer to blend material, or `None` if not set. An update method on this property sets the objects active material to the sauna specific one chosen. Added a boolean property to material type to flag (poll)) it as a "Sauna Cloud" material. The only materials that poll will have this set as true. A select menu is drawn by the UI using a `UILayout.prop(...)` (commented out) or with the ID template. (_Note_ a custom operator to add material can be set here, I took out the generic add material_) **Other alterations.** Drew the context objects material slots in the panel and an option to add a new one. Further to this would be to define your own `UIList` to add the "Is sauna material" checkbox in the list, add a filter etc. Displayed the is sauna material checkbox, in panel and prepended it to Material Preview panel, by way of example. Set the context members `material` (_`context.material` only exists in the PROPERTIES area, otherwise needs to be set for material operators_) which can used in your addons custom operators, with buttons in this layout, as mat = context.material sc_mat = context.sauna_cloud_material or in hindsight `sc = context.sauna_cloud`. Changed the namespace from `SC` to `SAUNA` and would go as far as to say even `SAUNA_CLOUD` The naming convention, `_PT_` for panel type. is all about limiting name clashes. import bpy from bpy.props import PointerProperty, BoolProperty from bpy.types import PropertyGroup class SaunaCloudPanel: bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = "Sauna" @classmethod def poll(cls, context): ao = context.active_object return ao and ao.type == 'MESH' class SAUNA_PT_Wall(SaunaCloudPanel, bpy.types.Panel): bl_idname = "SAUNA_PT_Wall" bl_label = "Wall" def draw(self, context): layout = self.layout sc = context.scene.saunacloud ob = context.active_object mat = ob.active_material layout.context_pointer_set("material", mat) layout.context_pointer_set("sauna_cloud_material", sc.material) box = layout.box() box.prop(ob, "name") col = box.column() col.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=5) col.operator("object.material_slot_add") if mat: col.prop(mat, "is_sauna_cloud") #col.prop(sc, 'material', text=getattr(sc.material, "name", "None")) col.template_ID(sc, "material") class SAUNA_Global_Props(PropertyGroup): def poll_material(self, material): print("poll", material.name, material.is_sauna_cloud) return material.is_sauna_cloud def update_material(self, context): scene = self.id_data sc = self ob = context.object mat = self.material # debug print print(f"Update object: {ob.name} with material: {mat.name}") ob.active_material = mat material : PointerProperty( type=bpy.types.Material, poll=poll_material, update=update_material, ) classes = ( SAUNA_Global_Props, SAUNA_PT_Wall, ) def draw_sc_material_checkbox(self, context): mat = getattr(context, "material", None) self.layout.label(text=mat.name if mat else "None") if mat: self.layout.prop(mat, "is_sauna_cloud") def register(): for cls in classes: bpy.utils.register_class(cls) bpy.types.Scene.saunacloud = bpy.props.PointerProperty(type=SAUNA_Global_Props) bpy.types.Material.is_sauna_cloud = BoolProperty() bpy.types.MATERIAL_PT_preview.prepend(draw_sc_material_checkbox) def unregister(): for cls in classes: bpy.utils.unregister_class(cls) bpy.types.MATERIAL_PT_preview.remove(draw_sc_material_checkbox) if __name__ == "__main__": register() [1]: https://i.sstatic.net/nRlCW.gif