diff --git a/archimesh/__init__.py b/archimesh/__init__.py
index 533dc8bcd832d242b1a82547aa26a75b2e898a68..a9abe2707fa15c43b4af82996203941738431a84 100644
--- a/archimesh/__init__.py
+++ b/archimesh/__init__.py
@@ -29,8 +29,8 @@ bl_info = {
     "name": "Archimesh",
     "author": "Antonio Vazquez (antonioya)",
     "location": "View3D > Add > Mesh > Archimesh",
-    "version": (1, 1, 4),
-    "blender": (2, 68, 0),
+    "version": (1, 2, 0),
+    "blender": (2, 80, 0),
     "description": "Generate rooms, doors, windows, and other architecture objects",
     "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Add_Mesh/Archimesh",
     "category": "Add Mesh"
@@ -53,7 +53,7 @@ if "bpy" in locals():
     importlib.reload(achm_kitchen_maker)
     importlib.reload(achm_shelves_maker)
     importlib.reload(achm_books_maker)
-    importlib.reload(achm_light_maker)
+    importlib.reload(achm_lamp_maker)
     importlib.reload(achm_curtain_maker)
     importlib.reload(achm_venetian_maker)
     importlib.reload(achm_main_panel)
@@ -66,7 +66,7 @@ else:
     from . import achm_venetian_maker
     from . import achm_door_maker
     from . import achm_kitchen_maker
-    from . import achm_light_maker
+    from . import achm_lamp_maker
     from . import achm_main_panel
     from . import achm_roof_maker
     from . import achm_room_maker
@@ -101,129 +101,89 @@ from bpy.types import (
 # ----------------------------------------------------------
 
 
-class AchmInfoMtMeshDecorationAdd(Menu):
+class ARCHIMESH_MT_MeshDecorationAdd(Menu):
     bl_idname = "VIEW3D_MT_mesh_decoration_add"
     bl_label = "Decoration assets"
 
     # noinspection PyUnusedLocal
     def draw(self, context):
-        self.layout.operator("mesh.archimesh_books", text="Add Books")
-        self.layout.operator("mesh.archimesh_light", text="Add Lamp")
-        self.layout.operator("mesh.archimesh_roller", text="Add Roller curtains")
-        self.layout.operator("mesh.archimesh_venetian", text="Add Venetian blind")
-        self.layout.operator("mesh.archimesh_japan", text="Add Japanese curtains")
+        self.layout.operator("mesh.archimesh_books", text="Books")
+        self.layout.operator("mesh.archimesh_light", text="Lamp")
+        self.layout.operator("mesh.archimesh_roller", text="Roller curtains")
+        self.layout.operator("mesh.archimesh_venetian", text="Venetian blind")
+        self.layout.operator("mesh.archimesh_japan", text="Japanese curtains")
 
 # ----------------------------------------------------------
 # Registration
 # ----------------------------------------------------------
 
 
-class AchmInfoMtMeshCustomMenuAdd(Menu):
+class ARCHIMESH_MT_CustomMenuAdd(Menu):
     bl_idname = "VIEW3D_MT_mesh_custom_menu_add"
     bl_label = "Archimesh"
 
     # noinspection PyUnusedLocal
     def draw(self, context):
         self.layout.operator_context = 'INVOKE_REGION_WIN'
-        self.layout.operator("mesh.archimesh_room", text="Add Room")
-        self.layout.operator("mesh.archimesh_door", text="Add Door")
-        self.layout.operator("mesh.archimesh_window", text="Add Rail Window")
-        self.layout.operator("mesh.archimesh_winpanel", text="Add Panel Window")
-        self.layout.operator("mesh.archimesh_kitchen", text="Add Cabinet")
-        self.layout.operator("mesh.archimesh_shelves", text="Add Shelves")
-        self.layout.operator("mesh.archimesh_column", text="Add Column")
-        self.layout.operator("mesh.archimesh_stairs", text="Add Stairs")
-        self.layout.operator("mesh.archimesh_roof", text="Add Roof")
+        self.layout.operator("mesh.archimesh_room", text="Room")
+        self.layout.operator("mesh.archimesh_door", text="Door")
+        self.layout.operator("mesh.archimesh_window", text="Rail Window")
+        self.layout.operator("mesh.archimesh_winpanel", text="Panel Window")
+        self.layout.operator("mesh.archimesh_kitchen", text="Cabinet")
+        self.layout.operator("mesh.archimesh_shelves", text="Shelves")
+        self.layout.operator("mesh.archimesh_column", text="Column")
+        self.layout.operator("mesh.archimesh_stairs", text="Stairs")
+        self.layout.operator("mesh.archimesh_roof", text="Roof")
         self.layout.menu("VIEW3D_MT_mesh_decoration_add", text="Decoration props", icon="GROUP")
 
 # --------------------------------------------------------------
 # Register all operators and panels
 # --------------------------------------------------------------
 
-
-# Add-ons Preferences Update Panel
-
-# Define Panel classes for updating
-panels = (
-        achm_main_panel.ArchimeshMainPanel,
-        )
-
-
-def update_panel(self, context):
-    message = "Archimesh: Updating Panel locations has failed"
-    try:
-        for panel in panels:
-            if "bl_rna" in panel.__dict__:
-                bpy.utils.unregister_class(panel)
-
-        for panel in panels:
-            panel.bl_category = context.preferences.addons[__name__].preferences.category
-            bpy.utils.register_class(panel)
-
-    except Exception as e:
-        print("\n[{}]\n{}\n\nError:\n{}".format(__name__, message, e))
-        pass
-
-
-class Archi_Pref(AddonPreferences):
-    # this must match the addon name, use '__package__'
-    # when defining this in a submodule of a python package.
-    bl_idname = __name__
-
-    category: StringProperty(
-            name="Tab Category",
-            description="Choose a name for the category of the panel",
-            default="Create",
-            update=update_panel
-            )
-
-    def draw(self, context):
-        layout = self.layout
-
-        row = layout.row()
-        col = row.column()
-        col.label(text="Tab Category:")
-        col.prop(self, "category", text="")
-
-
 # Define menu
 # noinspection PyUnusedLocal
 def AchmMenu_func(self, context):
     self.layout.menu("VIEW3D_MT_mesh_custom_menu_add", icon="GROUP")
 
 
+classes = (
+    ARCHIMESH_MT_CustomMenuAdd,
+    ARCHIMESH_MT_MeshDecorationAdd,
+    achm_room_maker.ARCHIMESH_OT_Room,
+    achm_room_maker.ARCHIMESH_PT_RoomGenerator,
+    achm_room_maker.ARCHIMESH_OT_ExportRoom,
+    achm_room_maker.ARCHIMESH_OT_ImportRoom,
+    achm_door_maker.ARCHIMESH_OT_Door,
+    achm_door_maker.ARCHIMESH_PT_DoorObjectgenerator,
+    achm_window_maker.ARCHIMESH_OT_Windows,
+    achm_window_maker.ARCHIMESH_PT_WindowObjectgenerator,
+    achm_roof_maker.ARCHIMESH_OT_Roof,
+    achm_column_maker.ARCHIMESH_OT_Column,
+    achm_stairs_maker.ARCHIMESH_OT_Stairs,
+    achm_kitchen_maker.ARCHIMESH_OT_Kitchen,
+    achm_kitchen_maker.ARCHIMESH_OT_ExportInventory,
+    achm_shelves_maker.ARCHIMESH_OT_Shelves,
+    achm_books_maker.ARCHIMESH_OT_Books,
+    achm_lamp_maker.ARCHIMESH_PT_Lamp,
+    achm_curtain_maker.ARCHIMESH_OT_Roller,
+    achm_curtain_maker.ARCHIMESH_OT_Japan,
+    achm_venetian_maker.ARCHIMESH_OT_Venetian,
+    achm_venetian_maker.ARCHIMESH_PT_VenetianObjectgenerator,
+    achm_main_panel.ARCHIMESH_PT_Main,
+    achm_main_panel.ARCHIMESH_OT_Hole,
+    achm_main_panel.ARCHIMESH_OT_Pencil,
+    achm_main_panel.ARCHIMESH_OT_HintDisplay,
+    achm_window_panel.ARCHIMESH_PT_Win,
+    achm_window_panel.ARCHIMESH_PT_WindowEdit
+)
+
 def register():
-    bpy.utils.register_class(AchmInfoMtMeshCustomMenuAdd)
-    bpy.utils.register_class(AchmInfoMtMeshDecorationAdd)
-    bpy.utils.register_class(achm_room_maker.AchmRoom)
-    bpy.utils.register_class(achm_room_maker.AchmRoomGeneratorPanel)
-    bpy.utils.register_class(achm_room_maker.AchmExportRoom)
-    bpy.utils.register_class(achm_room_maker.AchmImportRoom)
-    bpy.utils.register_class(achm_door_maker.AchmDoor)
-    bpy.utils.register_class(achm_door_maker.AchmDoorObjectgeneratorpanel)
-    bpy.utils.register_class(achm_window_maker.AchmWindows)
-    bpy.utils.register_class(achm_window_maker.AchmWindowObjectgeneratorpanel)
-    bpy.utils.register_class(achm_roof_maker.AchmRoof)
-    bpy.utils.register_class(achm_column_maker.AchmColumn)
-    bpy.utils.register_class(achm_stairs_maker.AchmStairs)
-    bpy.utils.register_class(achm_kitchen_maker.AchmKitchen)
-    bpy.utils.register_class(achm_kitchen_maker.AchmExportInventory)
-    bpy.utils.register_class(achm_shelves_maker.AchmShelves)
-    bpy.utils.register_class(achm_books_maker.AchmBooks)
-    bpy.utils.register_class(achm_light_maker.AchmLamp)
-    bpy.utils.register_class(achm_curtain_maker.AchmRoller)
-    bpy.utils.register_class(achm_curtain_maker.AchmJapan)
-    bpy.utils.register_class(achm_venetian_maker.AchmVenetian)
-    bpy.utils.register_class(achm_venetian_maker.AchmVenetianObjectgeneratorpanel)
-    bpy.utils.register_class(achm_main_panel.ArchimeshMainPanel)
-    bpy.utils.register_class(achm_main_panel.AchmHoleAction)
-    bpy.utils.register_class(achm_main_panel.AchmPencilAction)
-    bpy.utils.register_class(achm_main_panel.AchmRunHintDisplayButton)
-    bpy.utils.register_class(achm_window_panel.AchmWinPanel)
-    bpy.utils.register_class(achm_window_panel.AchmWindowEditPanel)
-    bpy.utils.register_class(Archi_Pref)
+    from bpy.utils import register_class
+    for cls in classes:
+        register_class(cls)
+
     VIEW3D_MT_mesh_add.append(AchmMenu_func)
-    update_panel(None, bpy.context)
+
     # Define properties
     Scene.archimesh_select_only = BoolProperty(
             name="Only selected",
@@ -304,35 +264,10 @@ def register():
 
 
 def unregister():
-    bpy.utils.unregister_class(AchmInfoMtMeshCustomMenuAdd)
-    bpy.utils.unregister_class(AchmInfoMtMeshDecorationAdd)
-    bpy.utils.unregister_class(achm_room_maker.AchmRoom)
-    bpy.utils.unregister_class(achm_room_maker.AchmRoomGeneratorPanel)
-    bpy.utils.unregister_class(achm_room_maker.AchmExportRoom)
-    bpy.utils.unregister_class(achm_room_maker.AchmImportRoom)
-    bpy.utils.unregister_class(achm_door_maker.AchmDoor)
-    bpy.utils.unregister_class(achm_door_maker.AchmDoorObjectgeneratorpanel)
-    bpy.utils.unregister_class(achm_window_maker.AchmWindows)
-    bpy.utils.unregister_class(achm_window_maker.AchmWindowObjectgeneratorpanel)
-    bpy.utils.unregister_class(achm_roof_maker.AchmRoof)
-    bpy.utils.unregister_class(achm_column_maker.AchmColumn)
-    bpy.utils.unregister_class(achm_stairs_maker.AchmStairs)
-    bpy.utils.unregister_class(achm_kitchen_maker.AchmKitchen)
-    bpy.utils.unregister_class(achm_kitchen_maker.AchmExportInventory)
-    bpy.utils.unregister_class(achm_shelves_maker.AchmShelves)
-    bpy.utils.unregister_class(achm_books_maker.AchmBooks)
-    bpy.utils.unregister_class(achm_light_maker.AchmLamp)
-    bpy.utils.unregister_class(achm_curtain_maker.AchmRoller)
-    bpy.utils.unregister_class(achm_curtain_maker.AchmJapan)
-    bpy.utils.unregister_class(achm_venetian_maker.AchmVenetian)
-    bpy.utils.unregister_class(achm_venetian_maker.AchmVenetianObjectgeneratorpanel)
-    bpy.utils.unregister_class(achm_main_panel.ArchimeshMainPanel)
-    bpy.utils.unregister_class(achm_main_panel.AchmHoleAction)
-    bpy.utils.unregister_class(achm_main_panel.AchmPencilAction)
-    bpy.utils.unregister_class(achm_main_panel.AchmRunHintDisplayButton)
-    bpy.utils.unregister_class(achm_window_panel.AchmWinPanel)
-    bpy.utils.unregister_class(achm_window_panel.AchmWindowEditPanel)
-    bpy.utils.unregister_class(Archi_Pref)
+    from bpy.utils import unregister_class
+    for cls in reversed(classes):
+        unregister_class(cls)
+
     VIEW3D_MT_mesh_add.remove(AchmMenu_func)
 
     # Remove properties
@@ -349,7 +284,7 @@ def unregister():
     del Scene.archimesh_gl_name
     del Scene.archimesh_gl_ghost
     # remove OpenGL data
-    achm_main_panel.AchmRunHintDisplayButton.handle_remove(achm_main_panel.AchmRunHintDisplayButton, bpy.context)
+    achm_main_panel.ARCHIMESH_OT_HintDisplay.handle_remove(achm_main_panel.ARCHIMESH_OT_HintDisplay, bpy.context)
     wm = bpy.context.window_manager
     p = 'archimesh_run_opengl'
     if p in wm:
diff --git a/archimesh/achm_books_maker.py b/archimesh/achm_books_maker.py
index beceaa9ef96aff06a9b479e1c063d1a1bb74ed4f..a3468be986407ad46a1a99d432a12b1c3f7f230e 100644
--- a/archimesh/achm_books_maker.py
+++ b/archimesh/achm_books_maker.py
@@ -38,11 +38,11 @@ from .achm_tools import *
 # Define UI class
 # Books
 # ------------------------------------------------------------------
-class AchmBooks(Operator):
+class ARCHIMESH_OT_Books(Operator):
     bl_idname = "mesh.archimesh_books"
     bl_label = "Books"
     bl_description = "Books Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     width: FloatProperty(
@@ -58,7 +58,7 @@ class AchmBooks(Operator):
             description='Bounding book height',
             )
     num: IntProperty(
-            name='Number of books', min=1, max=100, default=20,
+            name='Number of books', min=1, max=100, default=5,
             description='Number total of books',
             )
 
@@ -137,7 +137,7 @@ class AchmBooks(Operator):
             row.prop(self, 'afn', slider=True)
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
             if self.crt_mat:
@@ -170,7 +170,7 @@ class AchmBooks(Operator):
 def create_book_mesh(self):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
     bpy.ops.object.select_all(False)
     generate_books(self)
@@ -203,7 +203,7 @@ def generate_books(self):
         mydata = create_book("Book" + str(x),
                              self.width, self.depth, self.height,
                              lastx, myloc.y, myloc.z,
-                             self.crt_mat if bpy.context.scene.render.engine == 'CYCLES' else False,
+                             self.crt_mat if bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'} else False,
                              self.rX, self.rY, self.rZ, self.rot, ox, oy, oz, ot,
                              self.objcol, self.rC)
         boxes.extend([mydata[0]])
@@ -230,11 +230,11 @@ def generate_books(self):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     boxes[0].select_set(True)
-    bpy.context.scene.objects.active = boxes[0]
+    bpy.context.view_layer.objects.active = boxes[0]
 
     return
 
@@ -361,7 +361,7 @@ def create_book(objname, sx, sy, sz, px, py, pz, mat, frx,
     mybook.location[0] = px
     mybook.location[1] = py
     mybook.location[2] = pz + sin(radians(rot)) * sx
-    bpy.context.scene.objects.link(mybook)
+    bpy.context.collection.objects.link(mybook)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -369,7 +369,7 @@ def create_book(objname, sx, sy, sz, px, py, pz, mat, frx,
     # ---------------------------------
     # Materials and UV Maps
     # ---------------------------------
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         rgb = objcol
         # External
         mat = create_diffuse_material(objname + "_material", True,
diff --git a/archimesh/achm_column_maker.py b/archimesh/achm_column_maker.py
index ed52ae9c84dcd121fa7072bf07ddf5ca5335d9d5..d1680a9cc503a4adcf65743c4b613dfa47436b09 100644
--- a/archimesh/achm_column_maker.py
+++ b/archimesh/achm_column_maker.py
@@ -26,6 +26,7 @@
 # noinspection PyUnresolvedReferences
 import bpy
 from math import cos, sin, radians, atan, sqrt
+from bpy.props import BoolProperty, IntProperty, FloatProperty, FloatVectorProperty
 from .achm_tools import *
 
 
@@ -33,11 +34,11 @@ from .achm_tools import *
 # Define UI class
 # Columns
 # ------------------------------------------------------------------
-class AchmColumn(bpy.types.Operator):
+class ARCHIMESH_OT_Column(bpy.types.Operator):
     bl_idname = "mesh.archimesh_column"
     bl_label = "Column"
     bl_description = "Columns Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # Define properties
@@ -49,185 +50,185 @@ class AchmColumn(bpy.types.Operator):
                 ),
             description="Type of column",
             )
-    keep_size: bpy.props.BoolProperty(
+    keep_size: BoolProperty(
             name="Keep radius equal",
             description="Keep all radius (top, mid and bottom) to the same size",
             default=True,
             )
 
-    rad_top: bpy.props.FloatProperty(
+    rad_top: FloatProperty(
             name='Top radius',
             min=0.001, max=10, default=0.15, precision=3,
             description='Radius of the column in the top',
             )
-    rad_mid: bpy.props.FloatProperty(
+    rad_mid: FloatProperty(
             name='Middle radius',
             min=0.001, max=10, default=0.15, precision=3,
             description='Radius of the column in the middle',
             )
-    shift: bpy.props.FloatProperty(
+    shift: FloatProperty(
             name='',
             min=-1, max=1, default=0, precision=3,
             description='Middle displacement',
             )
 
-    rad_bottom: bpy.props.FloatProperty(
+    rad_bottom: FloatProperty(
             name='Bottom radius',
             min=0.001, max=10, default=0.15, precision=3,
             description='Radius of the column in the bottom',
             )
 
-    col_height: bpy.props.FloatProperty(
+    col_height: FloatProperty(
             name='Total height',
             min=0.001, max=10, default=2.4, precision=3,
             description='Total height of column, including bases and tops',
             )
-    col_sx: bpy.props.FloatProperty(
+    col_sx: FloatProperty(
             name='X size',
             min=0.001, max=10, default=0.30, precision=3,
             description='Column size for x axis',
             )
-    col_sy: bpy.props.FloatProperty(
+    col_sy: FloatProperty(
             name='Y size',
             min=0.001, max=10, default=0.30, precision=3,
             description='Column size for y axis',
             )
 
-    cir_base: bpy.props.BoolProperty(
+    cir_base: BoolProperty(
             name="Include circular base",
             description="Include a base with circular form",
             default=False,
             )
-    cir_base_r: bpy.props.FloatProperty(
+    cir_base_r: FloatProperty(
             name='Radio',
             min=0.001, max=10, default=0.08, precision=3,
             description='Rise up radio of base',
             )
-    cir_base_z: bpy.props.FloatProperty(
+    cir_base_z: FloatProperty(
             name='Height',
             min=0.001, max=10, default=0.05, precision=3,
             description='Size for z axis',
             )
 
-    cir_top: bpy.props.BoolProperty(
+    cir_top: BoolProperty(
             name="Include circular top",
             description="Include a top with circular form",
             default=False,
             )
-    cir_top_r: bpy.props.FloatProperty(
+    cir_top_r: FloatProperty(
             name='Radio',
             min=0.001, max=10, default=0.08, precision=3,
             description='Rise up radio of top',
             )
-    cir_top_z: bpy.props.FloatProperty(
+    cir_top_z: FloatProperty(
             name='Height',
             min=0.001, max=10, default=0.05, precision=3,
             description='Size for z axis',
             )
 
-    box_base: bpy.props.BoolProperty(
+    box_base: BoolProperty(
             name="Include rectangular base",
             description="Include a base with rectangular form",
             default=True,
             )
-    box_base_x: bpy.props.FloatProperty(
+    box_base_x: FloatProperty(
             name='X size',
             min=0.001, max=10, default=0.40, precision=3,
             description='Size for x axis',
             )
-    box_base_y: bpy.props.FloatProperty(
+    box_base_y: FloatProperty(
             name='Y size',
             min=0.001, max=10, default=0.40, precision=3,
             description='Size for y axis',
             )
-    box_base_z: bpy.props.FloatProperty(
+    box_base_z: FloatProperty(
             name='Height',
             min=0.001, max=10, default=0.05, precision=3,
             description='Size for z axis',
             )
 
-    box_top: bpy.props.BoolProperty(
+    box_top: BoolProperty(
             name="Include rectangular top",
             description="Include a top with rectangular form",
             default=True,
             )
-    box_top_x: bpy.props.FloatProperty(
+    box_top_x: FloatProperty(
             name='X size',
             min=0.001, max=10, default=0.40, precision=3,
             description='Size for x axis',
             )
-    box_top_y: bpy.props.FloatProperty(
+    box_top_y: FloatProperty(
             name='Y size',
             min=0.001, max=10, default=0.40, precision=3,
             description='Size for y axis',
             )
-    box_top_z: bpy.props.FloatProperty(
+    box_top_z: FloatProperty(
             name='Height',
             min=0.001, max=10, default=0.05, precision=3,
             description='Size for z axis',
             )
 
-    arc_top: bpy.props.BoolProperty(
+    arc_top: BoolProperty(
             name="Create top arch",
             description="Include an arch in the top of the column",
             default=False,
             )
-    arc_radio: bpy.props.FloatProperty(
+    arc_radio: FloatProperty(
             name='Arc Radio',
             min=0.001, max=10, default=1, precision=1,
             description='Radio of the arch',
             )
-    arc_width: bpy.props.FloatProperty(
+    arc_width: FloatProperty(
             name='Thickness',
             min=0.01, max=10, default=0.15, precision=2,
             description='Thickness of the arch wall',
             )
-    arc_gap: bpy.props.FloatProperty(
+    arc_gap: FloatProperty(
             name='Arc gap',
             min=0.01, max=10, default=0.25, precision=2,
             description='Size of the gap in the arch sides',
             )
 
-    crt_mat: bpy.props.BoolProperty(
+    crt_mat: BoolProperty(
             name="Create default Cycles materials",
             description="Create default materials for Cycles render",
             default=True,
             )
-    crt_array: bpy.props.BoolProperty(
+    crt_array: BoolProperty(
             name="Create array of elements",
             description="Create a modifier array for all elemnst",
             default=False,
             )
-    array_num_x: bpy.props.IntProperty(
+    array_num_x: IntProperty(
             name='Count X',
             min=0, max=100, default=3,
             description='Number of elements in array',
             )
-    array_space_x: bpy.props.FloatProperty(
+    array_space_x: FloatProperty(
             name='Distance X',
             min=0.000, max=10, default=1, precision=3,
             description='Distance between elements (only arc disabled)',
             )
-    array_num_y: bpy.props.IntProperty(
+    array_num_y: IntProperty(
             name='Count Y',
             min=0, max=100, default=0,
             description='Number of elements in array',
             )
-    array_space_y: bpy.props.FloatProperty(
+    array_space_y: FloatProperty(
             name='Distance Y',
             min=0.000, max=10, default=1, precision=3,
             description='Distance between elements (only arc disabled)',
             )
-    array_space_z: bpy.props.FloatProperty(
+    array_space_z: FloatProperty(
             name='Distance Z',
             min=-10, max=10, default=0, precision=3,
             description='Combined X/Z distance between elements (only arc disabled)',
             )
-    ramp: bpy.props.BoolProperty(
+    ramp: BoolProperty(
             name="Deform",
             description="Deform top base with Z displacement", default=True,
             )
-    array_space_factor: bpy.props.FloatProperty(
+    array_space_factor: FloatProperty(
             name='Move Y center',
             min=0.00, max=1, default=0.0, precision=3,
             description='Move the center of the arch in Y axis. (0 centered)',
@@ -322,7 +323,7 @@ class AchmColumn(bpy.types.Operator):
                     row.prop(self, 'ramp')
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
         else:
@@ -355,7 +356,7 @@ def create_column_mesh(self):
     mycolumn = None
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     bpy.ops.object.select_all(False)
@@ -374,6 +375,7 @@ def create_column_mesh(self):
         height = height - self.box_base_z
     if self.box_top:
         height = height - self.box_top_z
+
     # ------------------------
     # Create circular column
     # ------------------------
@@ -381,7 +383,7 @@ def create_column_mesh(self):
         bpy.ops.object.select_all(False)
         mycolumn = create_circular_column(self, "Column", radio_top, radio_mid, radio_bottom, height)
         mycolumn.select_set(True)
-        bpy.context.scene.objects.active = mycolumn
+        bpy.context.view_layer.objects.active = mycolumn
         # Subsurf
         set_smooth(mycolumn)
         set_modifier_subsurf(mycolumn)
@@ -392,7 +394,7 @@ def create_column_mesh(self):
         mycolumn = create_rectangular_base(self, "Column", self.col_sx, self.col_sy, height)
         bpy.ops.object.select_all(False)
         mycolumn.select_set(True)
-        bpy.context.scene.objects.active = mycolumn
+        bpy.context.view_layer.objects.active = mycolumn
         set_normals(mycolumn)
     # ------------------------
     # Circular base
@@ -401,7 +403,7 @@ def create_column_mesh(self):
         cir_bottom = create_torus("Column_cir_bottom", radio_bottom, self.cir_base_r, self.cir_base_z)
         bpy.ops.object.select_all(False)
         cir_bottom.select_set(True)
-        bpy.context.scene.objects.active = cir_bottom
+        bpy.context.view_layer.objects.active = cir_bottom
         set_modifier_subsurf(cir_bottom)
         set_smooth(cir_bottom)
         cir_bottom.location.x = 0.0
@@ -417,7 +419,7 @@ def create_column_mesh(self):
                                              self.box_base_z)
         bpy.ops.object.select_all(False)
         box_bottom.select_set(True)
-        bpy.context.scene.objects.active = box_bottom
+        bpy.context.view_layer.objects.active = box_bottom
         box_bottom.parent = mycolumn
         set_normals(box_bottom)
         box_bottom.location.x = 0.0
@@ -433,7 +435,7 @@ def create_column_mesh(self):
         cir_top = create_torus("Column_cir_top", radio_top, self.cir_top_r, self.cir_top_z)
         bpy.ops.object.select_all(False)
         cir_top.select_set(True)
-        bpy.context.scene.objects.active = cir_top
+        bpy.context.view_layer.objects.active = cir_top
         set_modifier_subsurf(cir_top)
         set_smooth(cir_top)
         cir_top.parent = mycolumn
@@ -449,7 +451,7 @@ def create_column_mesh(self):
                                           self.box_top_z, self.ramp)
         bpy.ops.object.select_all(False)
         box_top.select_set(True)
-        bpy.context.scene.objects.active = box_top
+        bpy.context.view_layer.objects.active = box_top
         set_normals(box_top)
         box_top.parent = mycolumn
         box_top.location.x = 0.0
@@ -465,7 +467,7 @@ def create_column_mesh(self):
         myarc.parent = mycolumn
         bpy.ops.object.select_all(False)
         myarc.select_set(True)
-        bpy.context.scene.objects.active = myarc
+        bpy.context.view_layer.objects.active = myarc
         set_normals(myarc)
         set_modifier_mirror(myarc, "X")
         myarc.location.x = self.arc_radio + self.arc_gap
@@ -530,7 +532,7 @@ def create_column_mesh(self):
     # ------------------------
     # Create materials
     # ------------------------
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # Column material
         mat = create_diffuse_material("Column_material", False, 0.748, 0.734, 0.392, 0.573, 0.581, 0.318)
         set_material(mycolumn, mat)
@@ -555,7 +557,7 @@ def create_column_mesh(self):
 
     bpy.ops.object.select_all(False)
     mycolumn.select_set(True)
-    bpy.context.scene.objects.active = mycolumn
+    bpy.context.view_layer.objects.active = mycolumn
 
     return
 
@@ -604,7 +606,7 @@ def create_circular_column(self, objname, radio_top, radio_mid, radio_bottom, he
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -676,7 +678,7 @@ def create_torus(objname, radio_inside, radio_outside, height):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -725,7 +727,7 @@ def create_rectangular_base(self, objname, x, y, z, ramp=False):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -791,7 +793,7 @@ def create_arc(objname, radio, gap, thickness, center):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
diff --git a/archimesh/achm_curtain_maker.py b/archimesh/achm_curtain_maker.py
index f8d005f2f922bc60c96dd7ef675ccf153570426a..297405562026ac595e6767e3742f68d8865222ae 100644
--- a/archimesh/achm_curtain_maker.py
+++ b/archimesh/achm_curtain_maker.py
@@ -28,6 +28,7 @@ import bpy
 from copy import copy
 from math import cos, sin, radians
 from bpy.types import Operator
+from bpy.props import BoolProperty, IntProperty, FloatProperty
 from .achm_tools import *
 
 
@@ -35,62 +36,62 @@ from .achm_tools import *
 # Define UI class
 # Japanese curtains
 # ------------------------------------------------------------------
-class AchmJapan(Operator):
+class ARCHIMESH_OT_Japan(Operator):
     bl_idname = "mesh.archimesh_japan"
     bl_label = "Japanese curtains"
     bl_description = "Japanese curtains Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
-    width: bpy.props.FloatProperty(
+    width: FloatProperty(
             name='Width',
             min=0.30, max=4, default=1, precision=3,
             description='Total width',
             )
-    height: bpy.props.FloatProperty(
+    height: FloatProperty(
             name='Height',
             min=0.20, max=50, default=1.8, precision=3,
             description='Total height',
             )
-    num: bpy.props.IntProperty(
+    num: IntProperty(
             name='Rails',
             min=2, max=5, default=2,
             description='Number total of rails',
             )
-    palnum: bpy.props.IntProperty(
+    palnum: IntProperty(
             name='Panels',
             min=1, max=2, default=1,
             description='Panels by rail',
             )
 
-    open01: bpy.props.FloatProperty(
+    open01: FloatProperty(
             name='Position 01',
             min=0, max=1, default=0, precision=3,
             description='Position of the panel',
             )
-    open02: bpy.props.FloatProperty(
+    open02: FloatProperty(
             name='Position 02',
             min=0, max=1, default=0, precision=3,
             description='Position of the panel',
             )
-    open03: bpy.props.FloatProperty(
+    open03: FloatProperty(
             name='Position 03',
             min=0, max=1, default=0, precision=3,
             description='Position of the panel',
             )
-    open04: bpy.props.FloatProperty(
+    open04: FloatProperty(
             name='Position 04',
             min=0, max=1, default=0, precision=3,
             description='Position of the panel',
             )
-    open05: bpy.props.FloatProperty(
+    open05: FloatProperty(
             name='Position 05',
             min=0, max=1, default=0, precision=3,
             description='Position of the panel',
             )
 
     # Materials
-    crt_mat: bpy.props.BoolProperty(
+    crt_mat: BoolProperty(
             name="Create default Cycles materials",
             description="Create default materials for Cycles render",
             default=True,
@@ -134,11 +135,11 @@ class AchmJapan(Operator):
                 row.prop(self, 'open05', slider=True)
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
             if self.crt_mat:
-                box.label("* Remember to verify fabric texture folder")
+                box.label(text="* Remember to verify fabric texture folder")
         else:
             row = layout.row()
             row.label(text="Warning: Operator does not work in local view mode", icon='ERROR')
@@ -163,7 +164,7 @@ class AchmJapan(Operator):
 def create_japan_mesh(self):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
     bpy.ops.object.select_all(False)
     # Create units
@@ -176,26 +177,26 @@ def create_japan_mesh(self):
 # Define UI class
 # Roller curtains
 # ------------------------------------------------------------------
-class AchmRoller(Operator):
+class ARCHIMESH_OT_Roller(Operator):
     bl_idname = "mesh.archimesh_roller"
     bl_label = "Roller curtains"
     bl_description = "Roller_curtains Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
-    width: bpy.props.FloatProperty(
+    width: FloatProperty(
             name='Width',
             min=0.30, max=4, default=1, precision=3,
             description='Total width',
             )
-    height: bpy.props.FloatProperty(
+    height: FloatProperty(
             name='Height',
             min=0.01, max=50, default=1.7, precision=3,
             description='Total height',
             )
 
     # Materials
-    crt_mat: bpy.props.BoolProperty(
+    crt_mat: BoolProperty(
             name="Create default Cycles materials",
             description="Create default materials for Cycles render",
             default=True,
@@ -220,11 +221,11 @@ class AchmRoller(Operator):
             row.prop(self, 'height')
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
             if self.crt_mat:
-                box.label("* Remember to verify fabric texture folder")
+                box.label(text="* Remember to verify fabric texture folder")
         else:
             row = layout.row()
             row.label(text="Warning: Operator does not work in local view mode", icon='ERROR')
@@ -249,7 +250,7 @@ class AchmRoller(Operator):
 def create_roller_mesh(self):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
     bpy.ops.object.select_all(False)
     generate_roller(self)
@@ -356,7 +357,7 @@ def generate_japan(self):
     posz = -0.008
     x = 1
     fabricmat = None
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         fabricmat = create_fabric_material("Fabric_material", False, 0.653, 0.485, 0.265,
                                            0.653, 0.485, 0.265)
 
@@ -396,7 +397,7 @@ def generate_japan(self):
     mycurve2.location.y = -0.01
     mycurve2.location.z = 0.005
 
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("String_material", False, 0.1, 0.1, 0.1,
                                       0.1, 0.1, 0.1, 0.01)
         set_material(mycurve1, mat)
@@ -409,11 +410,11 @@ def generate_japan(self):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     myrail.select_set(True)
-    bpy.context.scene.objects.active = myrail
+    bpy.context.view_layer.objects.active = myrail
 
     return
 
@@ -482,7 +483,7 @@ def create_japan_rail(objname, sx, ways, px, py, pz, mat):
     myobject.location[0] = px
     myobject.location[1] = py
     myobject.location[2] = pz
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -490,7 +491,7 @@ def create_japan_rail(objname, sx, ways, px, py, pz, mat):
     # ---------------------------------
     # Materials
     # ---------------------------------
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # External
         mat = create_diffuse_material(objname + "_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
         set_material(myobject, mat)
@@ -529,7 +530,7 @@ def create_japan_support(objname, sx, px, py, pz, mat):
     myobject.location[0] = px
     myobject.location[1] = py
     myobject.location[2] = pz
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -537,7 +538,7 @@ def create_japan_support(objname, sx, px, py, pz, mat):
     # ---------------------------------
     # Materials
     # ---------------------------------
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # External
         mat = create_diffuse_material(objname + "_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
         set_material(myobject, mat)
@@ -570,7 +571,7 @@ def create_japan_panel(objname, sx, sz, px, py, pz, mat, fabricmat):
     myobject.location[0] = px
     myobject.location[1] = py
     myobject.location[2] = pz
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -578,7 +579,7 @@ def create_japan_panel(objname, sx, sz, px, py, pz, mat, fabricmat):
     # ---------------------------------
     # Materials
     # ---------------------------------
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         unwrap_mesh(myobject, True)
         # remap UV to use all texture
         for uv_loop in myobject.data.uv_layers.active.data:
@@ -603,7 +604,7 @@ def create_bezier(objname, points, origin, depth=0.001, fill='FULL'):
     myobject = bpy.data.objects.new(objname, curvedata)
     myobject.location = origin
 
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     polyline = curvedata.splines.new('BEZIER')
     polyline.bezier_points.add(len(points) - 1)
@@ -631,7 +632,7 @@ def generate_roller(self):
     # Roller Top
     # ------------------
     fabricsolid = None
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         fabricsolid = create_diffuse_material("Fabric_solid_material", False, 0.653, 0.485, 0.265)
 
     myroller = create_roller_rail("Roller",
@@ -647,7 +648,7 @@ def generate_roller(self):
     # Sides
     # --------------------------------------------------------------------------------
     plastic = None
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         plastic = create_diffuse_material("Plastic_roller_material", False, 0.653, 0.485, 0.265, 0.653, 0.485, 0.265,
                                           0.2)
 
@@ -669,7 +670,7 @@ def generate_roller(self):
     # Panel
     # --------------------------------------------------------------------------------
     fabricmat = None
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         fabricmat = create_fabric_material("Fabric_translucent_material", False, 0.653, 0.485, 0.265, 0.653, 0.485,
                                            0.265)
 
@@ -707,17 +708,17 @@ def generate_roller(self):
     mycurve.location.x = self.width + 0.015
     mycurve.location.y = 0
     mycurve.location.z = -0.38
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("String_material", False, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.01)
         set_material(mycurve, mat)
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     myroller.select_set(True)
-    bpy.context.scene.objects.active = myroller
+    bpy.context.view_layer.objects.active = myroller
 
     return
 
@@ -771,7 +772,7 @@ def create_roller_rail(objname, width, radio, px, py, pz, mat, mymaterial):
 
     mymesh = bpy.data.meshes.new(objname)
     myroll = bpy.data.objects.new(objname, mymesh)
-    bpy.context.scene.objects.link(myroll)
+    bpy.context.collection.objects.link(myroll)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -781,7 +782,7 @@ def create_roller_rail(objname, width, radio, px, py, pz, mat, mymaterial):
     myroll.location.z = pz
 
     # Materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(myroll, mymaterial)
 
     # Smooth
@@ -811,7 +812,7 @@ def create_roller_sides(myroller, side, px, py, pz, mat, plastic):
 
     mymesh = bpy.data.meshes.new("Side." + side)
     myside = bpy.data.objects.new("Side." + side, mymesh)
-    bpy.context.scene.objects.link(myside)
+    bpy.context.collection.objects.link(myside)
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
     # Position
@@ -825,7 +826,7 @@ def create_roller_sides(myroller, side, px, py, pz, mat, plastic):
     myside.parent = myroller
 
     # Materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(myside, plastic)
 
     # Smooth
@@ -1103,7 +1104,7 @@ def roller_side():
 # myObject: Curve object
 # --------------------------------------------------------------------
 def set_curve_cycle(myobject):
-    bpy.context.scene.objects.active = myobject
+    bpy.context.view_layer.objects.active = myobject
     # go edit mode
     bpy.ops.object.mode_set(mode='EDIT')
     # select all faces
diff --git a/archimesh/achm_door_maker.py b/archimesh/achm_door_maker.py
index f6238200a9f99fb81ba7435b94e64770c2a0088c..80a7a2410c21df06cf5b61826224699a9407ae3b 100644
--- a/archimesh/achm_door_maker.py
+++ b/archimesh/achm_door_maker.py
@@ -34,11 +34,11 @@ from .achm_tools import *
 # ------------------------------------------------------------------
 # Define operator class to create object
 # ------------------------------------------------------------------
-class AchmDoor(Operator):
+class ARCHIMESH_OT_Door(Operator):
     bl_idname = "mesh.archimesh_door"
     bl_label = "Door"
     bl_description = "Door"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # -----------------------------------------------------
@@ -48,7 +48,7 @@ class AchmDoor(Operator):
     def draw(self, context):
         layout = self.layout
         row = layout.row()
-        row.label("Use Properties panel (N) to define parms", icon='INFO')
+        row.label(text="Use Properties panel (N) to define parms", icon='INFO')
 
     # -----------------------------------------------------
     # Execute
@@ -77,7 +77,7 @@ def create_object(self, context):
     mainmesh = bpy.data.meshes.new("DoorFrane")
     mainobject = bpy.data.objects.new("DoorFrame", mainmesh)
     mainobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(mainobject)
+    bpy.context.collection.objects.link(mainobject)
     mainobject.DoorObjectGenerator.add()
 
     # we shape the main object and create other objects as children
@@ -86,7 +86,7 @@ def create_object(self, context):
 
     # we select, and activate, main object
     mainobject.select_set(True)
-    bpy.context.scene.objects.active = mainobject
+    bpy.context.view_layer.objects.active = mainobject
 
 
 # ------------------------------------------------------------------------------
@@ -121,7 +121,7 @@ def update_object(self, context):
             # noinspection PyBroadException
             try:
                 # clear child data
-                child.hide = False  # must be visible to avoid bug
+                child.hide_viewport = False  # must be visible to avoid bug
                 child.hide_render = False  # must be visible to avoid bug
                 old = child.data
                 child.select_set(True)
@@ -151,7 +151,7 @@ def update_object(self, context):
     tmp_mesh.name = oldname
     # and select, and activate, the main object
     o.select_set(True)
-    bpy.context.scene.objects.active = o
+    bpy.context.view_layer.objects.active = o
 
 
 # ------------------------------------------------------------------------------
@@ -205,7 +205,7 @@ def shape_children(mainobject, update=False):
         mydoor = make_one_door(mp, mainobject, widthr + mp.frame_size, "1")
         mydoor.location.x = mp.frame_width / 2 - mp.frame_size
 
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("Door_material", False, 0.8, 0.8, 0.8)
         set_material(mainobject, mat)
 
@@ -234,9 +234,9 @@ def shape_children(mainobject, update=False):
     myctrl.location.y = -((mp.frame_thick * 3) / 2)
     myctrl.location.z = -gap
     myctrl.display_type = 'BOUNDS'
-    myctrl.hide = False
+    myctrl.hide_viewport = False
     myctrl.hide_render = True
-    if bpy.context.scene.render.engine == 'CYCLES':
+    if bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         myctrl.cycles_visibility.camera = False
         myctrl.cycles_visibility.diffuse = False
         myctrl.cycles_visibility.glossy = False
@@ -257,9 +257,9 @@ def shape_children(mainobject, update=False):
     myctrlbase.location.y = -0.15 - (mp.frame_thick / 3)
     myctrlbase.location.z = -0.10
     myctrlbase.display_type = 'BOUNDS'
-    myctrlbase.hide = False
+    myctrlbase.hide_viewport = False
     myctrlbase.hide_render = True
-    if bpy.context.scene.render.engine == 'CYCLES':
+    if bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         myctrlbase.cycles_visibility.camera = False
         myctrlbase.cycles_visibility.diffuse = False
         myctrlbase.cycles_visibility.glossy = False
@@ -273,7 +273,7 @@ def shape_children(mainobject, update=False):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True and o.name != mainobject.name:
+        if o.select_get() is True and o.name != mainobject.name:
             o.select_set(False)
 
 
@@ -390,18 +390,18 @@ class ObjectProperties(PropertyGroup):
 
 # Register
 bpy.utils.register_class(ObjectProperties)
-Object.DoorObjectGenerator = CollectionProperty(type=ObjectProperties)
+Object.DoorObjectGenerator= CollectionProperty(type=ObjectProperties)
 
 
 # ------------------------------------------------------------------
 # Define panel class to modify object
 # ------------------------------------------------------------------
-class AchmDoorObjectgeneratorpanel(Panel):
+class ARCHIMESH_PT_DoorObjectgenerator(Panel):
     bl_idname = "OBJECT_PT_door_generator"
     bl_label = "Door"
     bl_space_type = 'VIEW_3D'
     bl_region_type = 'UI'
-    bl_category = 'Archimesh'
+    bl_category = 'View'
 
     # -----------------------------------------------------
     # Verify if visible
@@ -459,7 +459,7 @@ class AchmDoorObjectgeneratorpanel(Panel):
                 layout.prop(myobjdat, 'handle')
 
                 box = layout.box()
-                if not context.scene.render.engine == 'CYCLES':
+                if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                     box.enabled = False
                 box.prop(myobjdat, 'crt_mat')
             else:
@@ -536,14 +536,14 @@ def make_one_door(self, myframe, width, openside):
     if self.handle != "0":
         handle1 = create_handle(self, mydoor, "Front", width, openside)
         handle1.select_set(True)
-        bpy.context.scene.objects.active = handle1
+        bpy.context.view_layer.objects.active = handle1
         set_smooth(handle1)
         set_modifier_subsurf(handle1)
         handle2 = create_handle(self, mydoor, "Back", width, openside)
         set_smooth(handle2)
         set_modifier_subsurf(handle2)
     # Create materials
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # Door material
         mat = create_diffuse_material("Door_material", False, 0.8, 0.8, 0.8)
         set_material(mydoor, mat)
@@ -602,7 +602,7 @@ def create_door_data(self, myframe, width, openside):
     myobject = bpy.data.objects.new("Door", mymesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(verts, [], faces)
     mymesh.update(calc_edges=True)
@@ -654,7 +654,7 @@ def create_handle(self, mydoor, pos, frame_width, openside):
     myobject = bpy.data.objects.new("Handle_" + pos, mymesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(verts, [], faces)
     mymesh.update(calc_edges=True)
diff --git a/archimesh/achm_gltools.py b/archimesh/achm_gltools.py
index b2811e50d350bdc61bf814174f809b3f6828c25f..c53d7a88f57f82acc96d5b2140ff7a37d0d18520 100644
--- a/archimesh/achm_gltools.py
+++ b/archimesh/achm_gltools.py
@@ -26,8 +26,6 @@
 # noinspection PyUnresolvedReferences
 import bpy
 # noinspection PyUnresolvedReferences
-import bgl
-# noinspection PyUnresolvedReferences
 import blf
 from math import fabs, sqrt, sin, cos
 # noinspection PyUnresolvedReferences
@@ -35,7 +33,12 @@ from mathutils import Vector
 # noinspection PyUnresolvedReferences
 from bpy_extras import view3d_utils
 from .achm_room_maker import get_wall_points
+# GPU
+import bgl
+import gpu
+from gpu_extras.batch import batch_for_shader
 
+shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
 
 # -------------------------------------------------------------
 # Handle all draw routines (OpenGL main entry point)
@@ -46,68 +49,58 @@ def draw_main(context):
     rv3d = context.space_data.region_3d
     scene = context.scene
 
-    rgb = scene.archimesh_text_color
-    rgbw = scene.archimesh_walltext_color
+    rgba = scene.archimesh_text_color
+    rgbaw = scene.archimesh_walltext_color
     fsize = scene.archimesh_font_size
     wfsize = scene.archimesh_wfont_size
     space = scene.archimesh_hint_space
     measure = scene.archimesh_gl_measure
     dspname = scene.archimesh_gl_name
-    # Get visible layers
-    layers = []
-    for x in range(0, 20):
-        if context.scene.layers[x] is True:
-            layers.extend([x])
 
     bgl.glEnable(bgl.GL_BLEND)
     # Display selected or all
     if scene.archimesh_gl_ghost is False:
         objlist = context.selected_objects
     else:
-        objlist = context.scene.objects
+        objlist = context.view_layer.objects
     # ---------------------------------------
     # Generate all OpenGL calls
     # ---------------------------------------
     for myobj in objlist:
-        if myobj.hide is False:
-            # verify visible layer
-            for x in range(0, 20):
-                if myobj.layers[x] is True:
-                    if x in layers:
-                        # -----------------------------------------------------
-                        # Rooms
-                        # -----------------------------------------------------
-                        if 'RoomGenerator' in myobj:
-                            op = myobj.RoomGenerator[0]
-                            draw_room_data(myobj, op, region, rv3d, rgb, rgbw, fsize, wfsize, space, measure, dspname)
-
-                        # -----------------------------------------------------
-                        # Doors
-                        # -----------------------------------------------------
-                        if 'DoorObjectGenerator' in myobj:
-                            op = myobj.DoorObjectGenerator[0]
-                            draw_door_data(myobj, op, region, rv3d, rgb, fsize, space, measure)
-
-                        # -----------------------------------------------------
-                        # Window (Rail)
-                        # -----------------------------------------------------
-                        if 'WindowObjectGenerator' in myobj:
-                            op = myobj.WindowObjectGenerator[0]
-                            draw_window_rail_data(myobj, op, region, rv3d, rgb, fsize, space, measure)
-
-                        # -----------------------------------------------------
-                        # Window (Panel)
-                        # -----------------------------------------------------
-                        if 'WindowPanelGenerator' in myobj:
-                            op = myobj.WindowPanelGenerator[0]
-                            draw_window_panel_data(myobj, op, region, rv3d, rgb, fsize, space, measure)
-                        break   # avoid unnecessary loops
+        if myobj.visible_get() is True:
+            # -----------------------------------------------------
+            # Rooms
+            # -----------------------------------------------------
+            if 'RoomGenerator' in myobj:
+                op = myobj.RoomGenerator[0]
+                draw_room_data(myobj, op, region, rv3d, rgba, rgbaw, fsize, wfsize, space, measure, dspname)
+
+            # -----------------------------------------------------
+            # Doors
+            # -----------------------------------------------------
+            if 'DoorObjectGenerator' in myobj:
+                op = myobj.DoorObjectGenerator[0]
+                draw_door_data(myobj, op, region, rv3d, rgba, fsize, space, measure)
+
+            # -----------------------------------------------------
+            # Window (Rail)
+            # -----------------------------------------------------
+            if 'WindowObjectGenerator' in myobj:
+                op = myobj.WindowObjectGenerator[0]
+                draw_window_rail_data(myobj, op, region, rv3d, rgba, fsize, space, measure)
+
+            # -----------------------------------------------------
+            # Window (Panel)
+            # -----------------------------------------------------
+            if 'WindowPanelGenerator' in myobj:
+                op = myobj.WindowPanelGenerator[0]
+                draw_window_panel_data(myobj, op, region, rv3d, rgba, fsize, space, measure)
+
     # -----------------------
     # restore opengl defaults
     # -----------------------
     bgl.glLineWidth(1)
     bgl.glDisable(bgl.GL_BLEND)
-    bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
 
 
 # -------------------------------------------------------------
@@ -115,7 +108,7 @@ def draw_main(context):
 #
 # right: Align to right
 # -------------------------------------------------------------
-def draw_text(x_pos, y_pos, display_text, rgb, fsize, right=False):
+def draw_text(x_pos, y_pos, display_text, rgba, fsize, right=False):
     gap = 12
     font_id = 0
     blf.size(font_id, fsize, 72)
@@ -126,7 +119,7 @@ def draw_text(x_pos, y_pos, display_text, rgb, fsize, right=False):
     else:
         newx = x_pos
     blf.position(font_id, newx, y_pos, 0)
-    bgl.glColor4f(rgb[0], rgb[1], rgb[2], rgb[3])
+    blf.color(font_id, rgba[0], rgba[1], rgba[2], rgba[3])
     blf.draw(font_id, display_text)
     return
 
@@ -135,25 +128,26 @@ def draw_text(x_pos, y_pos, display_text, rgb, fsize, right=False):
 # Draw an OpenGL line
 #
 # -------------------------------------------------------------
-def draw_line(v1, v2):
+def draw_line(v1, v2, rgba):
+    coords = [(v1[0], v1[1]), (v2[0], v2[1])]
+    batch = batch_for_shader(shader, 'LINES', {"pos": coords})
+
     # noinspection PyBroadException
     try:
         if v1 is not None and v2 is not None:
-            bgl.glBegin(bgl.GL_LINES)
-            bgl.glVertex2f(*v1)
-            bgl.glVertex2f(*v2)
-            bgl.glEnd()
+            shader.bind()
+            shader.uniform_float("color", rgba)
+            batch.draw(shader)
     except:
         pass
 
-
 # -------------------------------------------------------------
 # Draw room information
 #
-# rgb: Color
+# rgba: Color
 # fsize: Font size
 # -------------------------------------------------------------
-def draw_room_data(myobj, op, region, rv3d, rgb, rgbw, fsize, wfsize, space, measure, dspname):
+def draw_room_data(myobj, op, region, rv3d, rgba, rgbaw, fsize, wfsize, space, measure, dspname):
 
     verts, activefaces, activenormals = get_wall_points(myobj)
 
@@ -201,8 +195,6 @@ def draw_room_data(myobj, op, region, rv3d, rgb, rgbw, fsize, wfsize, space, mea
         # colour + line setup
         bgl.glEnable(bgl.GL_BLEND)
         bgl.glLineWidth(1)
-        bgl.glColor4f(rgb[0], rgb[1], rgb[2], rgb[3])
-
         # --------------------------------
         # Measures
         # --------------------------------
@@ -215,18 +207,18 @@ def draw_room_data(myobj, op, region, rv3d, rgb, rgbw, fsize, wfsize, space, mea
 
             txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
 
-            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
             # Draw horizontal line
-            draw_line(screen_point_a, screen_point_b)
+            draw_line(screen_point_a, screen_point_b, rgba)
             # Draw vertical line 1 (upper vertical)
-            draw_line(screen_point_a1, screen_point_a2)
+            draw_line(screen_point_a1, screen_point_a2, rgba)
             # Draw vertical line 2 (upper vertical)
-            draw_line(screen_point_b1, screen_point_b2)
+            draw_line(screen_point_b1, screen_point_b2, rgba)
             # Draw vertical line 1
-            draw_line(screen_point_a, screen_point_a1)
+            draw_line(screen_point_a, screen_point_a1, rgba)
             # Draw vertical line 2
-            draw_line(screen_point_b, screen_point_b1)
+            draw_line(screen_point_b, screen_point_b1, rgba)
 
         # --------------------------------
         # Wall Number
@@ -247,7 +239,7 @@ def draw_room_data(myobj, op, region, rv3d, rgb, rgbw, fsize, wfsize, space, mea
                 if op.walls[i].curved is True:
                     txt = "Curved: "
 
-                draw_text(txtpoint2d[0], txtpoint2d[1], txt + str(i + 1), rgbw, wfsize)
+                draw_text(txtpoint2d[0], txtpoint2d[1], txt + str(i + 1), rgbaw, wfsize)
 
     return
 
@@ -255,10 +247,10 @@ def draw_room_data(myobj, op, region, rv3d, rgb, rgbw, fsize, wfsize, space, mea
 # -------------------------------------------------------------
 # Draw door information
 #
-# rgb: Color
+# rgba: Color
 # fsize: Font size
 # -------------------------------------------------------------
-def draw_door_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
+def draw_door_data(myobj, op, region, rv3d, rgba, fsize, space, measure):
 
     # Points
     a_p1 = get_point(op.glpoint_a, myobj)
@@ -312,7 +304,6 @@ def draw_door_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
     # colour + line setup
     bgl.glEnable(bgl.GL_BLEND)
     bgl.glLineWidth(1)
-    bgl.glColor4f(rgb[0], rgb[1], rgb[2], rgb[3])
 
     # --------------------------------
     # Measures
@@ -323,43 +314,43 @@ def draw_door_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
         txtpoint3d = interpolate3d(a_p1, t_p1, fabs(dist / 2))
         gap3d = (a_p2[0], txtpoint3d[1], txtpoint3d[2])
         txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize, True)
+        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize, True)
 
-        draw_line(screen_point_ap2, screen_point_tp2)
-        draw_line(screen_point_ap3, screen_point_ap1)
-        draw_line(screen_point_tp3, screen_point_tp1)
+        draw_line(screen_point_ap2, screen_point_tp2, rgba)
+        draw_line(screen_point_ap3, screen_point_ap1, rgba)
+        draw_line(screen_point_tp3, screen_point_tp1, rgba)
 
         # Horizontal
         dist = distance(b_p1, c_p1)
         txtpoint3d = interpolate3d(b_p1, c_p1, fabs(dist / 2))
         gap3d = (txtpoint3d[0], txtpoint3d[1], b_p2[2] + 0.02)
         txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-        draw_line(screen_point_bp2, screen_point_cp2)
-        draw_line(screen_point_bp3, screen_point_bp1)
-        draw_line(screen_point_cp3, screen_point_cp1)
+        draw_line(screen_point_bp2, screen_point_cp2, rgba)
+        draw_line(screen_point_bp3, screen_point_bp1, rgba)
+        draw_line(screen_point_cp3, screen_point_cp1, rgba)
 
         # Door size
         dist = distance(d_p1, e_p1)
         txtpoint3d = interpolate3d(d_p1, e_p1, fabs(dist / 2))
         gap3d = (txtpoint3d[0], txtpoint3d[1], txtpoint3d[2] + 0.02)
         txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-        draw_line(screen_point_dp1, screen_point_ep1)
-        draw_line(screen_point_dp2, screen_point_dp3)
-        draw_line(screen_point_ep2, screen_point_ep3)
+        draw_line(screen_point_dp1, screen_point_ep1, rgba)
+        draw_line(screen_point_dp2, screen_point_dp3, rgba)
+        draw_line(screen_point_ep2, screen_point_ep3, rgba)
     return
 
 
 # -------------------------------------------------------------
 # Draw window rail information
 #
-# rgb: Color
+# rgba: Color
 # fsize: Font size
 # -------------------------------------------------------------
-def draw_window_rail_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
+def draw_window_rail_data(myobj, op, region, rv3d, rgba, fsize, space, measure):
 
     # Points
     a_p1 = get_point(op.glpoint_a, myobj)
@@ -397,7 +388,6 @@ def draw_window_rail_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
     # colour + line setup
     bgl.glEnable(bgl.GL_BLEND)
     bgl.glLineWidth(1)
-    bgl.glColor4f(rgb[0], rgb[1], rgb[2], rgb[3])
 
     # --------------------------------
     # Measures
@@ -408,22 +398,22 @@ def draw_window_rail_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
         txtpoint3d = interpolate3d(a_p1, t_p1, fabs(dist / 2))
         gap3d = (a_p2[0], txtpoint3d[1], txtpoint3d[2])
         txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize, True)
+        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize, True)
 
-        draw_line(screen_point_ap2, screen_point_tp2)
-        draw_line(screen_point_ap3, screen_point_ap1)
-        draw_line(screen_point_tp3, screen_point_tp1)
+        draw_line(screen_point_ap2, screen_point_tp2, rgba)
+        draw_line(screen_point_ap3, screen_point_ap1, rgba)
+        draw_line(screen_point_tp3, screen_point_tp1, rgba)
 
         # Horizontal
         dist = distance(b_p1, c_p1)
         txtpoint3d = interpolate3d(b_p1, c_p1, fabs(dist / 2))
         gap3d = (txtpoint3d[0], txtpoint3d[1], b_p2[2] + 0.02)
         txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-        draw_line(screen_point_bp2, screen_point_cp2)
-        draw_line(screen_point_bp3, screen_point_bp1)
-        draw_line(screen_point_cp3, screen_point_cp1)
+        draw_line(screen_point_bp2, screen_point_cp2, rgba)
+        draw_line(screen_point_bp3, screen_point_bp1, rgba)
+        draw_line(screen_point_cp3, screen_point_cp1, rgba)
 
     return
 
@@ -431,10 +421,10 @@ def draw_window_rail_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
 # -------------------------------------------------------------
 # Draw window panel information
 #
-# rgb: Color
+# rgba: Color
 # fsize: Font size
 # -------------------------------------------------------------
-def draw_window_panel_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
+def draw_window_panel_data(myobj, op, region, rv3d, rgba, fsize, space, measure):
 
     # Points
     a_p1 = get_point(op.glpoint_a, myobj)
@@ -504,7 +494,6 @@ def draw_window_panel_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
     # colour + line setup
     bgl.glEnable(bgl.GL_BLEND)
     bgl.glLineWidth(1)
-    bgl.glColor4f(rgb[0], rgb[1], rgb[2], rgb[3])
 
     # --------------------------------
     # Measures
@@ -515,22 +504,22 @@ def draw_window_panel_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
         txtpoint3d = interpolate3d(a_p1, t_p1, fabs(dist / 2))
         gap3d = (a_p2[0], txtpoint3d[1], txtpoint3d[2])
         txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize, True)
+        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize, True)
 
-        draw_line(screen_point_ap2, screen_point_tp2)
-        draw_line(screen_point_ap3, screen_point_ap1)
-        draw_line(screen_point_tp3, screen_point_tp1)
+        draw_line(screen_point_ap2, screen_point_tp2, rgba)
+        draw_line(screen_point_ap3, screen_point_ap1, rgba)
+        draw_line(screen_point_tp3, screen_point_tp1, rgba)
 
         # Vertical (Left)
         dist = distance(f_p1, d_p1)
         txtpoint3d = interpolate3d(f_p1, d_p1, fabs(dist / 2))
         gap3d = (f_p2[0], txtpoint3d[1], txtpoint3d[2])
         txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+        draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-        draw_line(screen_point_fp2, screen_point_dp2)
-        draw_line(screen_point_fp1, screen_point_fp3)
-        draw_line(screen_point_dp1, screen_point_dp3)
+        draw_line(screen_point_fp2, screen_point_dp2, rgba)
+        draw_line(screen_point_fp1, screen_point_fp3, rgba)
+        draw_line(screen_point_dp1, screen_point_dp3, rgba)
 
         # Horizontal (not triangle nor arch)
         if op.UST != "4" and op.UST != "2":
@@ -538,29 +527,29 @@ def draw_window_panel_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
             txtpoint3d = interpolate3d(b_p2, c_p2, fabs(dist / 2))
             gap3d = (txtpoint3d[0], txtpoint3d[1], txtpoint3d[2] + 0.05)
             txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-            draw_line(screen_point_bp2, screen_point_cp2)
-            draw_line(screen_point_bp3, screen_point_bp1)
-            draw_line(screen_point_cp3, screen_point_cp1)
+            draw_line(screen_point_bp2, screen_point_cp2, rgba)
+            draw_line(screen_point_bp3, screen_point_bp1, rgba)
+            draw_line(screen_point_cp3, screen_point_cp1, rgba)
         else:
             dist = distance(b_p1, g_p3)
             txtpoint3d = interpolate3d(b_p2, g_p4, fabs(dist / 2))
             gap3d = (txtpoint3d[0], txtpoint3d[1], txtpoint3d[2] + 0.05)
             txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize, True)
+            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize, True)
 
             dist = distance(g_p3, c_p1)
             txtpoint3d = interpolate3d(g_p4, c_p2, fabs(dist / 2))
             gap3d = (txtpoint3d[0], txtpoint3d[1], txtpoint3d[2] + 0.05)
             txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-            draw_line(screen_point_bp2, screen_point_gp4)
-            draw_line(screen_point_gp4, screen_point_cp2)
-            draw_line(screen_point_bp3, screen_point_bp1)
-            draw_line(screen_point_cp3, screen_point_cp1)
-            draw_line(screen_point_gp3, screen_point_gp5)
+            draw_line(screen_point_bp2, screen_point_gp4, rgba)
+            draw_line(screen_point_gp4, screen_point_cp2, rgba)
+            draw_line(screen_point_bp3, screen_point_bp1, rgba)
+            draw_line(screen_point_cp3, screen_point_cp1, rgba)
+            draw_line(screen_point_gp3, screen_point_gp5, rgba)
 
         # Only for Triangle or arch
         if op.UST == "2" or op.UST == "4":
@@ -568,9 +557,9 @@ def draw_window_panel_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
             txtpoint3d = interpolate3d(g_p2, g_p3, fabs(dist / 2))
             gap3d = (txtpoint3d[0] + 0.05, txtpoint3d[1], txtpoint3d[2])
             txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-            draw_line(screen_point_gp2, screen_point_gp3)
+            draw_line(screen_point_gp2, screen_point_gp3, rgba)
 
         # Only for Triangle and Inclines or arch
         if op.UST == "3" or op.UST == "4" or op.UST == "2":
@@ -584,11 +573,11 @@ def draw_window_panel_data(myobj, op, region, rv3d, rgb, fsize, space, measure):
             txtpoint3d = interpolate3d(h_p1, h_p3, fabs(dist / 2))
             gap3d = (txtpoint3d[0], txtpoint3d[1], txtpoint3d[2] - space - 0.05)
             txtpoint2d = view3d_utils.location_3d_to_region_2d(region, rv3d, gap3d)
-            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgb, fsize)
+            draw_text(txtpoint2d[0], txtpoint2d[1], "%6.2f" % dist, rgba, fsize)
 
-            draw_line(screen_point_ap1, screen_point_hp2)
-            draw_line(screen_point_hp3, screen_point_hp5)
-            draw_line(screen_point_hp1, screen_point_hp4)
+            draw_line(screen_point_ap1, screen_point_hp2, rgba)
+            draw_line(screen_point_hp3, screen_point_hp5, rgba)
+            draw_line(screen_point_hp1, screen_point_hp4, rgba)
 
     return
 
@@ -636,7 +625,7 @@ def get_point(v1, mainobject):
     # Using World Matrix
     vt = Vector((v1[0], v1[1], v1[2], 1))
     m4 = mainobject.matrix_world
-    vt2 = m4 * vt
+    vt2 = m4 @ vt
     v2 = [vt2[0], vt2[1], vt2[2]]
 
     return v2
diff --git a/archimesh/achm_kitchen_maker.py b/archimesh/achm_kitchen_maker.py
index 3ba7c5f6d45e0e6674c06f15799e2120c45edacd..14860f739f5a62ac0dbb89f4579f99b0f7bca41e 100644
--- a/archimesh/achm_kitchen_maker.py
+++ b/archimesh/achm_kitchen_maker.py
@@ -46,10 +46,10 @@ RotationType_R180 = 3
 # ----------------------------------------------------------
 #    Export menu UI
 # ----------------------------------------------------------
-class AchmExportInventory(Operator, ExportHelper):
+class ARCHIMESH_OT_ExportInventory(Operator, ExportHelper):
     bl_idname = "io_export.kitchen_inventory"
     bl_description = 'Export kitchen inventory (.txt)'
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_label = "Export"
 
     # From ExportHelper. Filter filenames.
@@ -357,11 +357,11 @@ bpy.utils.register_class(CabinetProperties)
 # Define UI class
 # Kitchens
 # ------------------------------------------------------------------
-class AchmKitchen(Operator):
+class ARCHIMESH_OT_Kitchen(Operator):
     bl_idname = "mesh.archimesh_kitchen"
     bl_label = "Cabinets"
     bl_description = "Cabinet Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # Define properties
@@ -371,7 +371,12 @@ class AchmKitchen(Operator):
             name="Type",
             description="Type of cabinets",
             )
-    oldtype = type_cabinet
+    oldtype:  EnumProperty(
+            items=(('1', "Floor", ""),
+                ('2', "Wall", "")),
+            name="Type",
+            description="Type of cabinets",
+            )
 
     thickness: FloatProperty(
             name='Thickness', min=0.001, max=5, default=0.018, precision=3,
@@ -522,7 +527,7 @@ class AchmKitchen(Operator):
                     add_cabinet(self, box, idx + 1, self.cabinets[idx])
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
         else:
@@ -607,7 +612,7 @@ def add_cabinet(self, box, num, cabinet):
 def create_kitchen_mesh(self):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
     bpy.ops.object.select_all(False)
     # Create cabinets
@@ -833,7 +838,7 @@ def generate_cabinets(self):
         set_normals(base)
 
     # Create materials
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("Cabinet_material", False, 0.8, 0.8, 0.8)
         for box in boxes:
             set_material(box, mat)
@@ -908,7 +913,7 @@ def create_box(type_cabinet, objname, thickness, sx, sy, sz, px, py, pz, doortyp
     myobject.location[0] = px
     myobject.location[1] = py
     myobject.location[2] = pz
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1050,13 +1055,13 @@ def create_baseboard(objname, sx, sy, sz, mat, bl, br, depth, doortype, gap):
     mybaseboard.location[0] = 0
     mybaseboard.location[1] = 0
     mybaseboard.location[2] = 0
-    bpy.context.scene.objects.link(mybaseboard)
+    bpy.context.collection.objects.link(mybaseboard)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
 
     # Material
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("Baseboard_material", False, 0.8, 0.8, 0.8)
         set_material(mybaseboard, mat)
 
@@ -1118,13 +1123,13 @@ def create_countertop(objname, sx, sy, sz, over, mat, doortype, depth, edge):
     mycountertop.location[0] = 0
     mycountertop.location[1] = 0
     mycountertop.location[2] = 0
-    bpy.context.scene.objects.link(mycountertop)
+    bpy.context.collection.objects.link(mycountertop)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
 
     # Material
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("countertop_material", False, 0, 0, 0, 0.2, 0.2, 0.2, 0.15)
         set_material(mycountertop, mat)
 
@@ -1196,7 +1201,7 @@ def create_door(type_cabinet, objname, thickness, sx, sz, doortype, gf, mat, han
 
     mydoor.location[1] = 0
     mydoor.location[2] = 0
-    bpy.context.scene.objects.link(mydoor)
+    bpy.context.collection.objects.link(mydoor)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1238,7 +1243,7 @@ def create_door(type_cabinet, objname, thickness, sx, sz, doortype, gf, mat, han
 
         create_handle(handle_model, mydoor, thickness, hpos, mat, handle_x, handle_z)
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # Door material
         mat = create_diffuse_material("Door_material", False, 0.8, 0.8, 0.8, 0.279, 0.337, 0.6, 0.2)
         set_material(mydoor, mat)
@@ -1306,7 +1311,7 @@ def create_drawer(objname, thickness, sx, sy, sz, mat, handle, handle_model, han
     mydrawer.location[0] = 0
     mydrawer.location[1] = 0
     mydrawer.location[2] = 0
-    bpy.context.scene.objects.link(mydrawer)
+    bpy.context.collection.objects.link(mydrawer)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1324,7 +1329,7 @@ def create_drawer(objname, thickness, sx, sy, sz, mat, handle, handle_model, han
         create_handle(model, mydrawer, thickness, "TM", mat, 0, handle_z)  # always in the top area/middle
 
     # Material
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("Drawer_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.2)
         set_material(mydrawer, mat)
 
@@ -1379,7 +1384,7 @@ def create_handle(model, mydoor, thickness, handle_position, mat, handle_x, hand
     mymesh = bpy.data.meshes.new("Handle")
     myhandle = bpy.data.objects.new("Handle", mymesh)
 
-    bpy.context.scene.objects.link(myhandle)
+    bpy.context.collection.objects.link(myhandle)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1447,7 +1452,7 @@ def create_handle(model, mydoor, thickness, handle_position, mat, handle_x, hand
     # parent
     myhandle.parent = mydoor
     # Materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_glossy_material("Handle_material", False, 0.733, 0.779, 0.8, 0.733, 0.779, 0.8, 0.02)
         set_material(myhandle, mat)
 
diff --git a/archimesh/achm_lamp_maker.py b/archimesh/achm_lamp_maker.py
index fd4617abc6f25b1bfaf2d9a519eeadb1c5067e96..ea661d5f752105c3d61fff6e069d0d312699c415 100644
--- a/archimesh/achm_lamp_maker.py
+++ b/archimesh/achm_lamp_maker.py
@@ -129,11 +129,11 @@ def set_preset(self):
 # Define UI class
 # Lamps
 # ------------------------------------------------------------------
-class AchmLamp(Operator):
+class ARCHIMESH_PT_Lamp(Operator):
     bl_idname = "mesh.archimesh_light"
     bl_label = "Lamp"
     bl_description = "Lamp Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
     # preset
     preset: EnumProperty(
@@ -147,7 +147,17 @@ class AchmLamp(Operator):
             name="Predefined",
             description="Apply predefined design",
             )
-    oldpreset = preset
+    oldpreset: EnumProperty(
+            items=(
+                ('0', "None", ""),
+                ('1', "Sphere", ""),
+                ('2', "Pear", ""),
+                ('3', "Vase", ""),
+                ('4', "Rectangular", ""),
+                ),
+            name="Predefined",
+            description="Apply predefined design",
+            )
 
     base_height: FloatProperty(
             name='Height',
@@ -354,7 +364,7 @@ class AchmLamp(Operator):
                 row.prop(self, 'tr03')
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
             if self.crt_mat:
@@ -389,7 +399,7 @@ class AchmLamp(Operator):
 def create_light_mesh(self):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
     bpy.ops.object.select_all(False)
     generate_light(self)
@@ -481,22 +491,22 @@ def generate_light(self):
     # Light bulb
     # ---------------------
     radbulb = 0.02
-    bpy.ops.mesh.primitive_uv_sphere_add(segments=16, size=radbulb)
+    bpy.ops.mesh.primitive_uv_sphere_add(segments=16, radius=radbulb)
     mybulb = bpy.data.objects[bpy.context.active_object.name]
     mybulb.name = "Lamp_Bulb"
     mybulb.parent = myholder
     mybulb.location = (0, 0, radbulb + self.holder + 0.04)
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_emission_material(mybulb.name, True, 0.8, 0.8, 0.8, self.energy)
         set_material(mybulb, mat)
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     mybase.select_set(True)
-    bpy.context.scene.objects.active = mybase
+    bpy.context.view_layer.objects.active = mybase
 
     return
 
@@ -534,7 +544,7 @@ def create_light_base(objname, height, px, py, pz, segments, rings, radios, rati
 
     mymesh = bpy.data.meshes.new(objname)
     mycylinder = bpy.data.objects.new(objname, mymesh)
-    bpy.context.scene.objects.link(mycylinder)
+    bpy.context.collection.objects.link(mycylinder)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -543,7 +553,7 @@ def create_light_base(objname, height, px, py, pz, segments, rings, radios, rati
     mycylinder.location.y = py
     mycylinder.location.z = pz
     # Materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         rgb = objcol
         mymat = create_diffuse_material(mycylinder.name + "_material", True, rgb[0], rgb[1], rgb[2], rgb[0], rgb[1],
                                         rgb[2], 0.1)
@@ -571,7 +581,7 @@ def create_lightholder(objname, height, px, py, pz, mat):
 
     mymesh = bpy.data.meshes.new(objname)
     mycylinder = bpy.data.objects.new(objname, mymesh)
-    bpy.context.scene.objects.link(mycylinder)
+    bpy.context.collection.objects.link(mycylinder)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -581,7 +591,7 @@ def create_lightholder(objname, height, px, py, pz, mat):
     mycylinder.location.z = pz
 
     # Materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material(mycylinder.name + "_material", True, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.1)
         set_material(mycylinder, mat)
 
@@ -609,7 +619,7 @@ def create_lightholder_strings(objname, height, px, py, pz, radio, shadeh, mat):
 
     mymesh = bpy.data.meshes.new(objname)
     mycylinder = bpy.data.objects.new(objname, mymesh)
-    bpy.context.scene.objects.link(mycylinder)
+    bpy.context.collection.objects.link(mycylinder)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -627,7 +637,7 @@ def create_lightholder_strings(objname, height, px, py, pz, radio, shadeh, mat):
     box2.location = (-0.021, 0, height + 0.004)
 
     # Materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material(mycylinder.name + "_material", True, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.1)
         set_material(mycylinder, mat)
         set_material(box1, mat)
@@ -664,7 +674,7 @@ def create_lightshade(objname, height, px, py, pz, segments, radio1, radio2, ple
 
     mymesh = bpy.data.meshes.new(objname)
     mycylinder = bpy.data.objects.new(objname, mymesh)
-    bpy.context.scene.objects.link(mycylinder)
+    bpy.context.collection.objects.link(mycylinder)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -673,7 +683,7 @@ def create_lightshade(objname, height, px, py, pz, segments, radio1, radio2, ple
     mycylinder.location.y = py
     mycylinder.location.z = pz
     # materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mymat = create_translucent_material(mycylinder.name + "_material", True, 0.8, 0.65, 0.45, 0.8, 0.65, 0.45,
                                             opacity)
         set_material(mycylinder, mymat)
@@ -699,7 +709,7 @@ def create_box_segments(objname, height, shift):
 
     mymesh = bpy.data.meshes.new(objname)
     mysegment = bpy.data.objects.new(objname, mymesh)
-    bpy.context.scene.objects.link(mysegment)
+    bpy.context.collection.objects.link(mysegment)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
diff --git a/archimesh/achm_main_panel.py b/archimesh/achm_main_panel.py
index 58de8c746d441cb2eb858115d4cd7db763de8d7d..47287a5806e603924661553d0c8f62030b611e32 100644
--- a/archimesh/achm_main_panel.py
+++ b/archimesh/achm_main_panel.py
@@ -49,11 +49,11 @@ def isboolean(myobject, childobject):
 # ------------------------------------------------------
 # Button: Action to link windows and doors
 # ------------------------------------------------------
-class AchmHoleAction(Operator):
+class ARCHIMESH_OT_Hole(Operator):
     bl_idname = "object.archimesh_cut_holes"
     bl_label = "Auto Holes"
     bl_description = "Enable windows and doors holes for any selected object (needs wall thickness)"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
 
     # ------------------------------
     # Execute
@@ -70,7 +70,7 @@ class AchmHoleAction(Operator):
             # noinspection PyBroadException
             try:
                 if obj["archimesh.hole_enable"]:
-                    if obj.select is True or scene.archimesh_select_only is False:
+                    if obj.select_get() is True or scene.archimesh_select_only is False:
                         listobj.extend([obj])
             except:
                 continue
@@ -149,7 +149,7 @@ class AchmHoleAction(Operator):
                 # noinspection PyBroadException
                 try:
                     if obj["archimesh.ctrl_base"]:
-                        if obj.select is True or scene.archimesh_select_only is False:
+                        if obj.select_get() is True or scene.archimesh_select_only is False:
                             # add boolean modifier
                             if isboolean(mybaseboard, obj) is False:
                                 set_modifier_boolean(mybaseboard, obj)
@@ -170,7 +170,7 @@ class AchmHoleAction(Operator):
                 # noinspection PyBroadException
                 try:
                     if obj["archimesh.ctrl_hole"]:
-                        if obj.select is True or scene.archimesh_select_only is False:
+                        if obj.select_get() is True or scene.archimesh_select_only is False:
                             # add boolean modifier
                             if isboolean(myshell, obj) is False:
                                 set_modifier_boolean(myshell, obj)
@@ -183,11 +183,11 @@ class AchmHoleAction(Operator):
 # ------------------------------------------------------
 # Button: Action to create room from grease pencil
 # ------------------------------------------------------
-class AchmPencilAction(Operator):
+class ARCHIMESH_OT_Pencil(Operator):
     bl_idname = "object.archimesh_pencil_room"
     bl_label = "Room from Draw"
     bl_description = "Create a room base on grease pencil strokes (draw from top view (7 key))"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
 
     # ------------------------------
     # Execute
@@ -387,12 +387,12 @@ class AchmPencilAction(Operator):
 # ------------------------------------------------------------------
 # Define panel class for main functions.
 # ------------------------------------------------------------------
-class ArchimeshMainPanel(Panel):
+class ARCHIMESH_PT_Main(Panel):
     bl_idname = "ARCHIMESH_PT_main"
     bl_label = "Archimesh"
     bl_space_type = "VIEW_3D"
-    bl_region_type = "TOOLS"
-    bl_category = "Create"
+    bl_region_type = "UI"
+    bl_category = "View"
     bl_context = "objectmode"
 
     # ------------------------------
@@ -486,7 +486,7 @@ class ArchimeshMainPanel(Panel):
             txt = 'Hide'
         row.operator("archimesh.runopenglbutton", text=txt, icon=icon)
         row = box.row()
-        row.prop(scene, "archimesh_gl_measure", toggle=True, icon="ALIGN")
+        row.prop(scene, "archimesh_gl_measure", toggle=True, icon="ALIGN_CENTER")
         row.prop(scene, "archimesh_gl_name", toggle=True, icon="OUTLINER_OB_FONT")
         row.prop(scene, "archimesh_gl_ghost", icon='GHOST_ENABLED')
         row = box.row()
@@ -514,11 +514,11 @@ class ArchimeshMainPanel(Panel):
 # Defines button for enable/disable the tip display
 #
 # -------------------------------------------------------------
-class AchmRunHintDisplayButton(Operator):
+class ARCHIMESH_OT_HintDisplay(Operator):
     bl_idname = "archimesh.runopenglbutton"
     bl_label = "Display hint data manager"
     bl_description = "Display additional information in the viewport"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
 
     _handle = None  # keep function handler
 
@@ -527,8 +527,8 @@ class AchmRunHintDisplayButton(Operator):
     # ----------------------------------
     @staticmethod
     def handle_add(self, context):
-        if AchmRunHintDisplayButton._handle is None:
-            AchmRunHintDisplayButton._handle = SpaceView3D.draw_handler_add(draw_callback_px, (self, context),
+        if ARCHIMESH_OT_HintDisplay._handle is None:
+            ARCHIMESH_OT_HintDisplay._handle = SpaceView3D.draw_handler_add(draw_callback_px, (self, context),
                                                                                       'WINDOW',
                                                                                       'POST_PIXEL')
             context.window_manager.archimesh_run_opengl = True
@@ -539,9 +539,9 @@ class AchmRunHintDisplayButton(Operator):
     # noinspection PyUnusedLocal
     @staticmethod
     def handle_remove(self, context):
-        if AchmRunHintDisplayButton._handle is not None:
-            SpaceView3D.draw_handler_remove(AchmRunHintDisplayButton._handle, 'WINDOW')
-        AchmRunHintDisplayButton._handle = None
+        if ARCHIMESH_OT_HintDisplay._handle is not None:
+            SpaceView3D.draw_handler_remove(ARCHIMESH_OT_HintDisplay._handle, 'WINDOW')
+        ARCHIMESH_OT_HintDisplay._handle = None
         context.window_manager.archimesh_run_opengl = False
 
     # ------------------------------
diff --git a/archimesh/achm_roof_maker.py b/archimesh/achm_roof_maker.py
index 6cce3c30fdbea0c8449545849c9d7bcd238ba468..7de38df7755997c1a4a618c3990591381879c21d 100644
--- a/archimesh/achm_roof_maker.py
+++ b/archimesh/achm_roof_maker.py
@@ -35,11 +35,11 @@ from .achm_tools import *
 # Define UI class
 # Rooms
 # ------------------------------------------------------------------
-class AchmRoof(Operator):
+class ARCHIMESH_OT_Roof(Operator):
     bl_idname = "mesh.archimesh_roof"
     bl_label = "Roof"
     bl_description = "Roof Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # Define properties
@@ -124,14 +124,14 @@ class AchmRoof(Operator):
             y = tilesize_y * self.roof_scale * self.roof_height
 
             buf = 'Size: {0:.2f} * {1:.2f} aprox.'.format(x, y)
-            box.label(buf)
+            box.label(text=buf)
 
             box = layout.box()
             box.prop(self, 'roof_thick')
             box.prop(self, 'roof_angle')
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
         else:
@@ -158,7 +158,7 @@ class AchmRoof(Operator):
 def create_roof_mesh(self):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
     bpy.ops.object.select_all(False)
 
@@ -166,10 +166,10 @@ def create_roof_mesh(self):
     myroof = mydata[0]
 
     # active object and deactivate others
-    if bpy.context.scene.objects.active is not None:
-        bpy.context.scene.objects.active.select_set(False)
+    if bpy.context.view_layer.objects.active is not None:
+        bpy.context.view_layer.objects.active.select_set(False)
 
-    bpy.context.scene.objects.active = myroof
+    bpy.context.view_layer.objects.active = myroof
     myroof.select_set(True)
 
     # Thicknes
@@ -205,14 +205,14 @@ def create_roof_mesh(self):
     myroof.rotation_euler = (radians(self.roof_angle), 0.0, 0.0)
 
     # Create materials
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # material
         mat = create_diffuse_material("Roof_material", False, 0.482, 0.061, 0.003, 0.581, 0.105, 0.068, 0.01)
         set_material(myroof, mat)
 
     bpy.ops.object.select_all(False)
     myroof.select_set(True)
-    bpy.context.scene.objects.active = myroof
+    bpy.context.view_layer.objects.active = myroof
     return
 
 
@@ -243,7 +243,7 @@ def create_roof(self):
     myobject = bpy.data.objects.new("Roof", mymesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(verts, [], faces)
     mymesh.update(calc_edges=True)
diff --git a/archimesh/achm_room_maker.py b/archimesh/achm_room_maker.py
index 7061b26a0e345f8a395edc1d15ef930b9fdd2f0c..2cdd1510a97bda936aa9a1aa3707b86d3d953aaf 100644
--- a/archimesh/achm_room_maker.py
+++ b/archimesh/achm_room_maker.py
@@ -40,10 +40,10 @@ from .achm_tools import *
 # ----------------------------------------------------------
 # Export menu UI
 # ----------------------------------------------------------
-class AchmExportRoom(Operator, ExportHelper):
+class ARCHIMESH_OT_ExportRoom(Operator, ExportHelper):
     bl_idname = "io_export.roomdata"
     bl_description = 'Export Room data (.dat)'
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_label = "Export"
 
     # From ExportHelper. Filter filenames.
@@ -152,10 +152,10 @@ class AchmExportRoom(Operator, ExportHelper):
 # ----------------------------------------------------------
 # Import menu UI
 # ----------------------------------------------------------
-class AchmImportRoom(Operator, ImportHelper):
+class ARCHIMESH_OT_ImportRoom(Operator, ImportHelper):
     bl_idname = "io_import.roomdata"
     bl_description = 'Import Room data (.dat)'
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_label = "Import"
 
     # From Helper. Filter filenames.
@@ -312,11 +312,11 @@ class AchmImportRoom(Operator, ImportHelper):
 # ------------------------------------------------------------------
 # Define operator class to create rooms
 # ------------------------------------------------------------------
-class AchmRoom(Operator):
+class ARCHIMESH_OT_Room(Operator):
     bl_idname = "mesh.archimesh_room"
     bl_label = "Room"
     bl_description = "Generate room with walls, baseboard, floor and ceiling"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # -----------------------------------------------------
@@ -326,7 +326,7 @@ class AchmRoom(Operator):
     def draw(self, context):
         layout = self.layout
         row = layout.row()
-        row.label("Use Properties panel (N) to define parms", icon='INFO')
+        row.label(text="Use Properties panel (N) to define parms", icon='INFO')
         row = layout.row(align=False)
         row.operator("io_import.roomdata", text="Import", icon='COPYDOWN')
 
@@ -355,7 +355,7 @@ def create_room(self, context):
     roommesh = bpy.data.meshes.new("Room")
     roomobject = bpy.data.objects.new("Room", roommesh)
     roomobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(roomobject)
+    bpy.context.collection.objects.link(roomobject)
     roomobject.RoomGenerator.add()
     roomobject.RoomGenerator[0].walls.add()
 
@@ -363,8 +363,8 @@ def create_room(self, context):
     shape_walls_and_create_children(roomobject, roommesh)
 
     # we select, and activate, main object for the room.
+    bpy.context.view_layer.objects.active = roomobject
     roomobject.select_set(True)
-    bpy.context.scene.objects.active = roomobject
 
 
 # -----------------------------------------------------
@@ -431,7 +431,7 @@ def update_room(self, context):
     tmp_mesh.name = oldname
     # and select, and activate, the main object of the room.
     o.select_set(True)
-    bpy.context.scene.objects.active = o
+    bpy.context.view_layer.objects.active = o
 
 
 # -----------------------------------------------------
@@ -495,7 +495,7 @@ def shape_walls_and_create_children(myroom, tmp_mesh, update=False):
         baseboardmesh = bpy.data.meshes.new("Baseboard")
         mybase = bpy.data.objects.new("Baseboard", baseboardmesh)
         mybase.location = (0, 0, 0)
-        bpy.context.scene.objects.link(mybase)
+        bpy.context.collection.objects.link(mybase)
         mybase.parent = myroom
         mybase.select_set(True)
         mybase["archimesh.room_object"] = True
@@ -544,7 +544,7 @@ def shape_walls_and_create_children(myroom, tmp_mesh, update=False):
             movetotopsolidify(mybase)
 
     # Create materials
-    if rp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if rp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # Wall material (two faces)
         mat = create_diffuse_material("Wall_material", False, 0.765, 0.650, 0.588, 0.8, 0.621, 0.570, 0.1, True)
         set_material(myroom, mat)
@@ -571,7 +571,7 @@ def shape_walls_and_create_children(myroom, tmp_mesh, update=False):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True and o.name != myroom.name:
+        if o.select_get() is True and o.name != myroom.name:
             o.select_set(False)
 
 
@@ -791,7 +791,7 @@ def make_curved_wall(myvertex, myfaces, size, wall_angle, lastx, lasty, height,
 # ------------------------------------------------------------------------------
 
 def create_floor(rp, typ, myroom):
-    bpy.context.scene.objects.active = myroom
+    bpy.context.view_layer.objects.active = myroom
 
     myvertex = []
     myfaces = []
@@ -823,7 +823,7 @@ def create_floor(rp, typ, myroom):
     myobject = bpy.data.objects.new(typ, mymesh)
 
     myobject.location = (0, 0, 0)
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1144,7 +1144,7 @@ def add_shell(selobject, objname, rp):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = selobject.location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -1615,12 +1615,12 @@ def add_wall(idx, box, wall):
 # ------------------------------------------------------------------
 # Define panel class to modify rooms.
 # ------------------------------------------------------------------
-class AchmRoomGeneratorPanel(Panel):
+class ARCHIMESH_PT_RoomGenerator(Panel):
     bl_idname = "OBJECT_PT_room_generator"
     bl_label = "Room"
     bl_space_type = 'VIEW_3D'
     bl_region_type = 'UI'
-    bl_category = 'Archimesh'
+    bl_category = 'View'
 
     # -----------------------------------------------------
     # Verify if visible
@@ -1692,6 +1692,6 @@ class AchmRoomGeneratorPanel(Panel):
                 row.prop(room, 'shell_bfactor', slider=True)
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(room, 'crt_mat')
diff --git a/archimesh/achm_shelves_maker.py b/archimesh/achm_shelves_maker.py
index e6e01ddb4c4d6bd63696275962a8d88941a980d2..53595da25c1c6263d223b085babab7716f60716e 100644
--- a/archimesh/achm_shelves_maker.py
+++ b/archimesh/achm_shelves_maker.py
@@ -70,11 +70,11 @@ bpy.utils.register_class(ShelvesProperties)
 # Define UI class
 # Shelves
 # ------------------------------------------------------------------
-class AchmShelves(Operator):
+class ARCHIMESH_OT_Shelves(Operator):
     bl_idname = "mesh.archimesh_shelves"
     bl_label = "Shelves"
     bl_description = "Shelves Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     thickness: FloatProperty(
@@ -174,7 +174,7 @@ class AchmShelves(Operator):
                     add_shelves(self, box, idx + 1, self.shelves[idx])
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
         else:
@@ -262,7 +262,7 @@ def add_shelves(self, box, num, sh):
 def create_shelves_mesh(self):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
     bpy.ops.object.select_all(False)
     # Create units
@@ -311,14 +311,14 @@ def generate_shelves(self):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     boxes[0].select_set(True)
-    bpy.context.scene.objects.active = boxes[0]
+    bpy.context.view_layer.objects.active = boxes[0]
 
     # Create materials
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("Shelves_material", False, 0.8, 0.8, 0.8)
         for box in boxes:
             set_material(box, mat)
@@ -462,7 +462,7 @@ def create_unit(stype, objname, thickness, sthickness, sx, sy, sz, px, py, pz, l
     myobject.location[0] = px
     myobject.location[1] = py
     myobject.location[2] = pz
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
diff --git a/archimesh/achm_stairs_maker.py b/archimesh/achm_stairs_maker.py
index 963f3ebd7a99fb2a646da28e1974ad530826661a..9459d5d90f1d1127e0a7731876c80b9da110721c 100644
--- a/archimesh/achm_stairs_maker.py
+++ b/archimesh/achm_stairs_maker.py
@@ -35,11 +35,11 @@ from .achm_tools import *
 # Define UI class
 # Stairs
 # ------------------------------------------------------------------
-class AchmStairs(Operator):
+class ARCHIMESH_OT_Stairs(Operator):
     bl_idname = "mesh.archimesh_stairs"
     bl_label = "Stairs"
     bl_description = "Stairs Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # Define properties
@@ -178,7 +178,7 @@ class AchmStairs(Operator):
                 row.prop(self, 'side_gap')
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(self, 'crt_mat')
         else:
@@ -206,7 +206,7 @@ def create_stairs_mesh(self):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     bpy.ops.object.select_all(False)
@@ -217,7 +217,7 @@ def create_stairs_mesh(self):
     mydata = create_stairs(self, "Stairs")
     mystairs = mydata[0]
     mystairs.select_set(True)
-    bpy.context.scene.objects.active = mystairs
+    bpy.context.view_layer.objects.active = mystairs
     remove_doubles(mystairs)
     set_normals(mystairs)
     set_modifier_mirror(mystairs, "X")
@@ -240,14 +240,14 @@ def create_stairs_mesh(self):
     # ------------------------
     # Create materials
     # ------------------------
-    if self.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         # Stairs material
         mat = create_diffuse_material("Stairs_material", False, 0.8, 0.8, 0.8)
         set_material(mystairs, mat)
 
     bpy.ops.object.select_all(False)
     mystairs.select_set(True)
-    bpy.context.scene.objects.active = mystairs
+    bpy.context.view_layer.objects.active = mystairs
 
     return
 
@@ -274,7 +274,7 @@ def create_stairs(self, objname):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -422,7 +422,7 @@ def create_bezier(objname, points, origin):
     myobject.location = origin
     myobject.rotation_euler[2] = radians(90)
 
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     polyline = curvedata.splines.new('BEZIER')
     polyline.bezier_points.add(len(points) - 1)
diff --git a/archimesh/achm_tools.py b/archimesh/achm_tools.py
index bb75d447b7cc4382715ada67cd897a9a27f12d40..8d44fe0cd353cc2db2186ed3950a624ab475b0f9 100644
--- a/archimesh/achm_tools.py
+++ b/archimesh/achm_tools.py
@@ -44,7 +44,7 @@ def get_blendunits(units):
 # False= faces to outside
 # --------------------------------------------------------------------
 def set_normals(myobject, direction=False):
-    bpy.context.scene.objects.active = myobject
+    bpy.context.view_layer.objects.active = myobject
     # go edit mode
     bpy.ops.object.mode_set(mode='EDIT')
     # select all faces
@@ -59,7 +59,7 @@ def set_normals(myobject, direction=False):
 # Remove doubles
 # --------------------------------------------------------------------
 def remove_doubles(myobject):
-    bpy.context.scene.objects.active = myobject
+    bpy.context.view_layer.objects.active = myobject
     # go edit mode
     bpy.ops.object.mode_set(mode='EDIT')
     # select all faces
@@ -76,12 +76,12 @@ def remove_doubles(myobject):
 def set_smooth(myobject):
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     myobject.select_set(True)
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.shade_smooth()
 
 
@@ -89,8 +89,8 @@ def set_smooth(myobject):
 # Add modifier (subdivision)
 # --------------------------------------------------------------------
 def set_modifier_subsurf(myobject):
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.modifier_add(type='SUBSURF')
         for mod in myobject.modifiers:
             if mod.type == 'SUBSURF':
@@ -103,25 +103,25 @@ def set_modifier_subsurf(myobject):
 def set_modifier_mirror(myobject, axis="Y"):
     bpy.ops.object.select_all(False)
     myobject.select_set(True)
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.modifier_add(type='MIRROR')
         for mod in myobject.modifiers:
             if mod.type == 'MIRROR':
                 if axis == "X":
-                    mod.use_x = True
+                    mod.use_axis[0] = True
                 else:
-                    mod.use_x = False
+                    mod.use__axis[0] = False
 
                 if axis == "Y":
-                    mod.use_y = True
+                    mod.use_axis[1] = True
                 else:
-                    mod.use_y = False
+                    mod.use_axis[1] = False
 
                 if axis == "Z":
-                    mod.use_z = True
+                    mod.use_axis[2] = True
                 else:
-                    mod.use_z = False
+                    mod.use_axis[2] = False
 
                 mod.use_clip = True
 
@@ -132,8 +132,8 @@ def set_modifier_mirror(myobject, axis="Y"):
 def set_modifier_array(myobject, axis, move, repeat, fix=False, fixmove=0, zmove=0):
     bpy.ops.object.select_all(False)
     myobject.select_set(True)
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.modifier_add(type='ARRAY')
         for mod in myobject.modifiers:
             if mod.type == 'ARRAY':
@@ -162,8 +162,8 @@ def set_modifier_array(myobject, axis, move, repeat, fix=False, fixmove=0, zmove
 # Add modifier (curve)
 # --------------------------------------------------------------------
 def set_modifier_curve(myobject, mycurve):
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.modifier_add(type='CURVE')
         for mod in myobject.modifiers:
             if mod.type == 'CURVE':
@@ -175,8 +175,8 @@ def set_modifier_curve(myobject, mycurve):
 # Add modifier (solidify)
 # --------------------------------------------------------------------
 def set_modifier_solidify(myobject, width):
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.modifier_add(type='SOLIDIFY')
         for mod in myobject.modifiers:
             if mod.type == 'SOLIDIFY':
@@ -190,8 +190,8 @@ def set_modifier_solidify(myobject, width):
 # Add modifier (boolean)
 # --------------------------------------------------------------------
 def set_modifier_boolean(myobject, bolobject):
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.modifier_add(type='BOOLEAN')
         mod = myobject.modifiers[len(myobject.modifiers) - 1]
         mod.operation = 'DIFFERENCE'
@@ -202,8 +202,8 @@ def set_modifier_boolean(myobject, bolobject):
 # Set material to object
 # --------------------------------------------------------------------
 def set_material(myobject, mymaterial):
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         myobject.data.materials.append(mymaterial)
 
 
@@ -211,10 +211,10 @@ def set_material(myobject, mymaterial):
 # Set material to selected faces
 # --------------------------------------------------------------------
 def set_material_faces(myobject, idx):
-    bpy.context.scene.objects.active = myobject
+    bpy.context.view_layer.objects.active = myobject
     myobject.select_set(True)
     bpy.context.object.active_material_index = idx
-    if bpy.context.scene.objects.active.name == myobject.name:
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         bpy.ops.object.mode_set(mode='EDIT')
         bpy.ops.object.material_slot_assign()
         # Deselect
@@ -227,8 +227,8 @@ def set_material_faces(myobject, idx):
 # --------------------------------------------------------------------
 def select_faces(myobject, selface, clear):
     myobject.select_set(True)
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         # deselect everything
         if clear:
             bpy.ops.object.mode_set(mode='EDIT')
@@ -244,8 +244,8 @@ def select_faces(myobject, selface, clear):
 # --------------------------------------------------------------------
 def select_vertices(myobject, selvertices, clear=True):
     myobject.select_set(True)
-    bpy.context.scene.objects.active = myobject
-    if bpy.context.scene.objects.active.name == myobject.name:
+    bpy.context.view_layer.objects.active = myobject
+    if bpy.context.view_layer.objects.active.name == myobject.name:
         # deselect everything
         if clear:
             bpy.ops.object.mode_set(mode='EDIT')
@@ -273,8 +273,8 @@ def mark_seam(myobject):
     # noinspection PyBroadException
     try:
         myobject.select_set(True)
-        bpy.context.scene.objects.active = myobject
-        if bpy.context.scene.objects.active.name == myobject.name:
+        bpy.context.view_layer.objects.active = myobject
+        if bpy.context.view_layer.objects.active.name == myobject.name:
             bpy.ops.object.mode_set(mode='EDIT', toggle=False)
             bpy.ops.mesh.mark_seam()
             bpy.ops.object.mode_set(mode='OBJECT')
@@ -289,8 +289,8 @@ def unwrap_mesh(myobject, allfaces=True):
     # noinspection PyBroadException
     try:
         myobject.select_set(True)
-        bpy.context.scene.objects.active = myobject
-        if bpy.context.scene.objects.active.name == myobject.name:
+        bpy.context.view_layer.objects.active = myobject
+        if bpy.context.view_layer.objects.active.name == myobject.name:
             # Unwrap
             bpy.ops.object.mode_set(mode='EDIT', toggle=False)
             if allfaces is True:
@@ -886,7 +886,7 @@ def parentobject(parentobj, childobj):
     # noinspection PyBroadException
     try:
         bpy.ops.object.select_all(action='DESELECT')
-        bpy.context.scene.objects.active = parentobj
+        bpy.context.view_layer.objects.active = parentobj
         parentobj.select_set(True)
         childobj.select_set(True)
         bpy.ops.object.parent_set(type='OBJECT', keep_transform=False)
@@ -923,7 +923,7 @@ def create_control_box(objname, x, y, z, tube=True):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
diff --git a/archimesh/achm_venetian_maker.py b/archimesh/achm_venetian_maker.py
index ba077a80f07553a5d40fa4fe6bdb98209ce4beed..dbf769706d0dcc2dcb07e06d4acc59b0a527a809 100644
--- a/archimesh/achm_venetian_maker.py
+++ b/archimesh/achm_venetian_maker.py
@@ -34,11 +34,11 @@ from .achm_tools import *
 # ------------------------------------------------------------------
 # Define operator class to create object
 # ------------------------------------------------------------------
-class AchmVenetian(Operator):
+class ARCHIMESH_OT_Venetian(Operator):
     bl_idname = "mesh.archimesh_venetian"
     bl_label = "Venetian blind"
     bl_description = "Venetian"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # -----------------------------------------------------
@@ -48,7 +48,7 @@ class AchmVenetian(Operator):
     def draw(self, context):
         layout = self.layout
         row = layout.row()
-        row.label("Use Properties panel (N) to define parms", icon='INFO')
+        row.label(text="Use Properties panel (N) to define parms", icon='INFO')
 
     # -----------------------------------------------------
     # Execute
@@ -77,7 +77,7 @@ def create_object(self, context):
     mainmesh = bpy.data.meshes.new("VenetianFrane")
     mainobject = bpy.data.objects.new("VenetianFrame", mainmesh)
     mainobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(mainobject)
+    bpy.context.collection.objects.link(mainobject)
     mainobject.VenetianObjectGenerator.add()
 
     # we shape the main object and create other objects as children
@@ -85,7 +85,7 @@ def create_object(self, context):
 
     # we select, and activate, main object
     mainobject.select_set(True)
-    bpy.context.scene.objects.active = mainobject
+    bpy.context.view_layer.objects.active = mainobject
 
 
 # ------------------------------------------------------------------------------
@@ -124,7 +124,7 @@ def update_object(self, context):
     tmp_mesh.name = oldname
     # and select, and activate, the main object
     o.select_set(True)
-    bpy.context.scene.objects.active = o
+    bpy.context.view_layer.objects.active = o
 
 
 # ------------------------------------------------------------------------------
@@ -138,7 +138,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     mat = None
     plastic = None
 
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         rgb = mp.objcol
         plastic = create_diffuse_material("Plastic_venetian_material", True, rgb[0], rgb[1], rgb[2], rgb[0], rgb[1],
                                           rgb[2], 0.2)
@@ -149,7 +149,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     create_venetian_top(tmp_mesh, mp.width + 0.002, mp.depth + 0.002, -0.06)
 
     # materials
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mainobject, plastic)
     # --------------------------------------------------------------------------------
     # segments
@@ -169,7 +169,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     set_normals(myslats)
     set_smooth(myslats)
 
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(myslats, plastic)
     # ------------------------
     # Strings (Middle)
@@ -201,7 +201,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     mycurver.location.y = 0
     mycurver.location.z = 0
 
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("String_material", False, 0.674, 0.617, 0.496, 0.1, 0.1, 0.1, 0.01)
         set_material(mycurvel, mat)
         set_material(mycurvec, mat)
@@ -237,7 +237,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     mycurverf.location.y = ((-mp.depth / 2) * cos(radians(mp.angle))) - 0.001
     mycurverf.location.z = 0
 
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mycurvelf, mat)
         set_material(mycurvecf, mat)
         set_material(mycurverf, mat)
@@ -274,7 +274,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     mycurverb.location.y = ((mp.depth / 2) * cos(radians(mp.angle))) + 0.001
     mycurverb.location.z = 0
 
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mycurvelb, mat)
         set_material(mycurvecb, mat)
         set_material(mycurverb, mat)
@@ -290,7 +290,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     mybase.rotation_euler = (radians(angleused), 0, 0)
 
     # materials
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mybase, plastic)
     # ------------------
     # Stick
@@ -301,7 +301,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     mystick.location.y = -mp.depth / 2 - 0.003
     mystick.location.z = -0.03
     # materials
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         matstick = create_diffuse_material("Stick_material", False, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.04)
         set_material(mybase, matstick)
 
@@ -314,11 +314,11 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     mystring.location.y = -mp.depth / 2 - 0.003
     mystring.location.z = -0.03
 
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mystring, mat)
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True and o.name != mainobject.name:
+        if o.select_get() is True and o.name != mainobject.name:
             o.select_set(False)
 
     return
@@ -376,12 +376,12 @@ Object.VenetianObjectGenerator = CollectionProperty(type=ObjectProperties)
 # ------------------------------------------------------------------
 # Define panel class to modify object
 # ------------------------------------------------------------------
-class AchmVenetianObjectgeneratorpanel(Panel):
+class ARCHIMESH_PT_VenetianObjectgenerator(Panel):
     bl_idname = "OBJECT_PT_venetian_generator"
     bl_label = "Venetian"
     bl_space_type = 'VIEW_3D'
     bl_region_type = 'UI'
-    bl_category = 'Archimesh'
+    bl_category = 'View'
 
     # -----------------------------------------------------
     # Verify if visible
@@ -430,7 +430,7 @@ class AchmVenetianObjectgeneratorpanel(Panel):
             row.prop(myobjdat, 'ratio', slider=True)
 
             box = layout.box()
-            if not context.scene.render.engine == 'CYCLES':
+            if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                 box.enabled = False
             box.prop(myobjdat, 'crt_mat')
             if myobjdat.crt_mat:
@@ -518,7 +518,7 @@ def create_slat_mesh(objname, width, depth, height, angle, ratio):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -644,7 +644,7 @@ def create_venetian_base(objname, x, y, z):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -809,7 +809,7 @@ def get_venetian_stick(objname, height):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -1375,7 +1375,7 @@ def get_venetian_strings(objname, height):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -1396,7 +1396,7 @@ def create_bezier(objname, points, origin, depth=0.001, fill='FULL'):
     myobject = bpy.data.objects.new(objname, curvedata)
     myobject.location = origin
 
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     polyline = curvedata.splines.new('BEZIER')
     polyline.bezier_points.add(len(points) - 1)
diff --git a/archimesh/achm_window_maker.py b/archimesh/achm_window_maker.py
index 48a9faa774ce311c90bfb4c61407a1971454fd1a..bf16411d8c2fead4ff6d3810a80fe73ff9817a88 100644
--- a/archimesh/achm_window_maker.py
+++ b/archimesh/achm_window_maker.py
@@ -34,11 +34,11 @@ from .achm_tools import *
 # ------------------------------------------------------------------
 # Define operator class to create object
 # ------------------------------------------------------------------
-class AchmWindows(Operator):
+class ARCHIMESH_OT_Windows(Operator):
     bl_idname = "mesh.archimesh_window"
     bl_label = "Rail Windows"
     bl_description = "Rail Windows Generator"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # -----------------------------------------------------
@@ -48,7 +48,7 @@ class AchmWindows(Operator):
     def draw(self, context):
         layout = self.layout
         row = layout.row()
-        row.label("Use Properties panel (N) to define parms", icon='INFO')
+        row.label(text="Use Properties panel (N) to define parms", icon='INFO')
 
     # -----------------------------------------------------
     # Execute
@@ -77,7 +77,7 @@ def create_object(self, context):
     mainmesh = bpy.data.meshes.new("WindowFrane")
     mainobject = bpy.data.objects.new("WindowFrame", mainmesh)
     mainobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(mainobject)
+    bpy.context.collection.objects.link(mainobject)
     mainobject.WindowObjectGenerator.add()
 
     # we shape the main object and create other objects as children
@@ -85,7 +85,7 @@ def create_object(self, context):
 
     # we select, and activate, main object
     mainobject.select_set(True)
-    bpy.context.scene.objects.active = mainobject
+    bpy.context.view_layer.objects.active = mainobject
 
 
 # ------------------------------------------------------------------------------
@@ -120,7 +120,7 @@ def update_object(self, context):
             # noinspection PyBroadException
             try:
                 # clear child data
-                child.hide = False  # must be visible to avoid bug
+                child.hide_viewport = False  # must be visible to avoid bug
                 child.hide_render = False  # must be visible to avoid bug
                 old = child.data
                 child.select_set(True)
@@ -149,7 +149,7 @@ def update_object(self, context):
     tmp_mesh.name = oldname
     # and select, and activate, the main object
     o.select_set(True)
-    bpy.context.scene.objects.active = o
+    bpy.context.view_layer.objects.active = o
 
 
 # ------------------------------------------------------------------------------
@@ -217,9 +217,9 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
     myctrl.location.y = -mp.depth * 3 / 2
     myctrl.location.z = 0
     myctrl.display_type = 'BOUNDS'
-    myctrl.hide = False
+    myctrl.hide_viewport = False
     myctrl.hide_render = True
-    if bpy.context.scene.render.engine == 'CYCLES':
+    if bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         myctrl.cycles_visibility.camera = False
         myctrl.cycles_visibility.diffuse = False
         myctrl.cycles_visibility.glossy = False
@@ -232,7 +232,7 @@ def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True and o.name != mainobject.name:
+        if o.select_get() is True and o.name != mainobject.name:
             o.select_set(False)
 
     return
@@ -422,12 +422,12 @@ Object.WindowObjectGenerator = CollectionProperty(type=ObjectProperties)
 # ------------------------------------------------------------------
 # Define panel class to modify object
 # ------------------------------------------------------------------
-class AchmWindowObjectgeneratorpanel(Panel):
+class ARCHIMESH_PT_WindowObjectgenerator(Panel):
     bl_idname = "OBJECT_PT_window_generator"
     bl_label = "Window Rail"
     bl_space_type = 'VIEW_3D'
     bl_region_type = 'UI'
-    bl_category = 'Archimesh'
+    bl_category = 'View'
 
     # -----------------------------------------------------
     # Verify if visible
@@ -514,7 +514,7 @@ class AchmWindowObjectgeneratorpanel(Panel):
                         row.prop(myobjdat, 'blind_back')
 
                 box = layout.box()
-                if not context.scene.render.engine == 'CYCLES':
+                if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
                     box.enabled = False
                 box.prop(myobjdat, 'crt_mat')
             else:
@@ -529,7 +529,7 @@ def generate_rail_window(myframe, mp, mymesh):
     myloc = bpy.context.scene.cursor_location
 
     alummat = None
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         alummat = create_diffuse_material("Window_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
 
     # Frame
@@ -620,7 +620,7 @@ def generate_leaf_window(myframe, mp, mymesh):
     myloc = bpy.context.scene.cursor_location
 
     alummat = None
-    if mp.crt_mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         alummat = create_diffuse_material("Window_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
 
     # Frame
@@ -719,11 +719,11 @@ def generate_leaf_window(myframe, mp, mymesh):
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True:
+        if o.select_get() is True:
             o.select_set(False)
 
     myframe.select_set(True)
-    bpy.context.scene.objects.active = myframe
+    bpy.context.view_layer.objects.active = myframe
 
     return myframe
 
@@ -906,7 +906,7 @@ def create_rail_window_frame(mywindow, mymesh, sx, sy, sz, frame, mat, matdata,
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mywindow, matdata)
     # --------------
     # Blind Box
@@ -919,7 +919,7 @@ def create_rail_window_frame(mywindow, mymesh, sx, sy, sz, frame, mat, matdata,
         mybox.location.x = 0
         mybox.location.y = -blind_back - sy
         mybox.location.z = sz
-        if mat and bpy.context.scene.render.engine == 'CYCLES':
+        if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
             set_material(mybox, matdata)
         # Lock
         mybox.lock_location = (True, True, True)
@@ -1030,7 +1030,7 @@ def create_leaf_window_frame(mywindow, mymesh, sx, sy, sz, frame, frame_l, leafr
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mywindow, matdata)
 
     # --------------
@@ -1044,7 +1044,7 @@ def create_leaf_window_frame(mywindow, mymesh, sx, sy, sz, frame, frame_l, leafr
         mybox.location.x = 0
         mybox.location.y = -blind_back - sy
         mybox.location.z = sz
-        if mat and bpy.context.scene.render.engine == 'CYCLES':
+        if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
             set_material(mybox, matdata)
         # Lock
         mybox.lock_location = (True, True, True)
@@ -1200,7 +1200,7 @@ def create_rail_window_leaf(objname, hand, sx, sy, sz, f, px, py, pz, mat, matda
     mywindow.location[0] = px
     mywindow.location[1] = py
     mywindow.location[2] = pz
-    bpy.context.scene.objects.link(mywindow)
+    bpy.context.collection.objects.link(mywindow)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1226,7 +1226,7 @@ def create_rail_window_leaf(objname, hand, sx, sy, sz, f, px, py, pz, mat, matda
         else:
             myhandle.location.z = 1
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mywindow, matdata)
         # Glass
         glass = create_glass_material("Glass_material", False)
@@ -1299,7 +1299,7 @@ def create_leaf_window_leaf(objname, hand, sx, sy, sz, f, px, py, pz, mat, matda
     mywindow.location[0] = px
     mywindow.location[1] = py
     mywindow.location[2] = pz
-    bpy.context.scene.objects.link(mywindow)
+    bpy.context.collection.objects.link(mywindow)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1330,7 +1330,7 @@ def create_leaf_window_leaf(objname, hand, sx, sy, sz, f, px, py, pz, mat, matda
         set_smooth(myhandle)
         set_modifier_subsurf(myhandle)
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(mywindow, matdata)
         # Glass
         glass = create_glass_material("Glass_material", False)
@@ -1751,13 +1751,13 @@ def create_leaf_handle(objname, mat):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
 
     # Create materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         alumat = create_glossy_material("Handle_material", False, 0.733, 0.779, 0.8)
         set_material(myobject, alumat)
 
@@ -2092,13 +2092,13 @@ def create_rail_handle(objname, mat):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
 
     # Create materials
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         plastic = create_diffuse_material("Plastic_Handle_material", False, 0.01, 0.01, 0.01, 0.082, 0.079, 0.02, 0.01)
         set_material(myobject, plastic)
 
@@ -2130,12 +2130,12 @@ def create_sill(objname, x, y, z, mat):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mymat = create_diffuse_material("Sill_material", False, 0.8, 0.8, 0.8)
         set_material(myobject, mymat)
 
@@ -2168,7 +2168,7 @@ def create_blind_box(objname, x, y, z):
     myobject = bpy.data.objects.new(objname, mesh)
 
     myobject.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobject)
+    bpy.context.collection.objects.link(myobject)
 
     mesh.from_pydata(myvertex, [], myfaces)
     mesh.update(calc_edges=True)
@@ -2228,12 +2228,12 @@ def create_blind_rail(objname, sx, sz, px, py, pz, mat, matdata, blind_rail):
     myblind.location[0] = px
     myblind.location[1] = py
     myblind.location[2] = pz
-    bpy.context.scene.objects.link(myblind)
+    bpy.context.collection.objects.link(myblind)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         set_material(myblind, matdata)
 
     return myblind
@@ -2290,14 +2290,14 @@ def create_blind(objname, sx, sz, px, py, pz, mat, blind_ratio):
     myblind.location[0] = px
     myblind.location[1] = py
     myblind.location[2] = pz
-    bpy.context.scene.objects.link(myblind)
+    bpy.context.collection.objects.link(myblind)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
 
     myblind.lock_location = (True, True, False)  # only Z axis
 
-    if mat and bpy.context.scene.render.engine == 'CYCLES':
+    if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         mat = create_diffuse_material("Blind_plastic_material", False, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.15)
         set_material(myblind, mat)
 
diff --git a/archimesh/achm_window_panel.py b/archimesh/achm_window_panel.py
index d8f6460c851a63925362e8d743834ab0a8180beb..faf183853b42d07ea900148e60ddca215ebfe156 100644
--- a/archimesh/achm_window_panel.py
+++ b/archimesh/achm_window_panel.py
@@ -196,11 +196,11 @@ def set_defaults(s):
 # ------------------------------------------------------------------
 # Define operator class to create window panels
 # ------------------------------------------------------------------
-class AchmWinPanel(Operator):
+class ARCHIMESH_PT_Win(Operator):
     bl_idname = "mesh.archimesh_winpanel"
     bl_label = "Panel Window"
     bl_description = "Generate editable flat windows"
-    bl_category = 'Archimesh'
+    bl_category = 'View'
     bl_options = {'REGISTER', 'UNDO'}
 
     # -----------------------------------------------------
@@ -210,7 +210,7 @@ class AchmWinPanel(Operator):
     def draw(self, context):
         layout = self.layout
         row = layout.row()
-        row.label("Use Properties panel (N) to define parms", icon='INFO')
+        row.label(text="Use Properties panel (N) to define parms", icon='INFO')
 
     # -----------------------------------------------------
     # Execute
@@ -237,7 +237,7 @@ def create_window():
     window_object = bpy.data.objects.new("Window", window_mesh)
 
     # Link object to scene
-    bpy.context.scene.objects.link(window_object)
+    bpy.context.collection.objects.link(window_object)
     window_object.WindowPanelGenerator.add()
     window_object.location = bpy.context.scene.cursor_location
 
@@ -246,17 +246,17 @@ def create_window():
 
     # deactivate others
     for o in bpy.data.objects:
-        if o.select is True and o.name != window_object.name:
+        if o.select_get() is True and o.name != window_object.name:
             o.select_set(False)
 
     # Select, and activate object
     window_object.select_set(True)
-    bpy.context.scene.objects.active = window_object
+    bpy.context.view_layer.objects.active = window_object
 
     do_ctrl_box(window_object)
     # Reselect
     window_object.select_set(True)
-    bpy.context.scene.objects.active = window_object
+    bpy.context.view_layer.objects.active = window_object
 
 
 # ------------------------------------------------------------------------------
@@ -291,7 +291,7 @@ def update_window(self, context):
             # noinspection PyBroadException
             try:
                 # clear child data
-                child.hide = False  # must be visible to avoid bug
+                child.hide_viewport = False  # must be visible to avoid bug
                 child.hide_render = False  # must be visible to avoid bug
                 old = child.data
                 child.select_set(True)
@@ -316,17 +316,17 @@ def update_window(self, context):
     tmp_mesh.name = oldname
     # deactivate others
     for ob in bpy.data.objects:
-        if ob.select is True and ob.name != o.name:
+        if ob.select_get() is True and ob.name != o.name:
             ob.select_set(False)
     # and select, and activate, the object.
     o.select_set(True)
-    bpy.context.scene.objects.active = o
+    bpy.context.view_layer.objects.active = o
 
     do_ctrl_box(o)
 
     # Reselect
     o.select_set(True)
-    bpy.context.scene.objects.active = o
+    bpy.context.view_layer.objects.active = o
 
 
 # ------------------------------------------------------------------------------
@@ -395,9 +395,9 @@ def do_ctrl_box(myobject):
     myctrl.location.y = 0
     myctrl.location.z = 0
     myctrl.display_type = 'WIRE'
-    myctrl.hide = False
+    myctrl.hide_viewport = False
     myctrl.hide_render = True
-    if bpy.context.scene.render.engine == 'CYCLES':
+    if bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
         myctrl.cycles_visibility.camera = False
         myctrl.cycles_visibility.diffuse = False
         myctrl.cycles_visibility.glossy = False
@@ -1541,7 +1541,7 @@ def create_ctrl_box(parentobj, objname):
     myobj = bpy.data.objects.new(objname, mymesh)
 
     myobj.location = bpy.context.scene.cursor_location
-    bpy.context.scene.objects.link(myobj)
+    bpy.context.collection.objects.link(myobj)
 
     mymesh.from_pydata(myvertex, [], myfaces)
     mymesh.update(calc_edges=True)
@@ -1568,7 +1568,21 @@ class GeneralPanelProperties(PropertyGroup):
             description='Predefined types',
             update=update_using_default,
             )
-    son = prs
+    son: EnumProperty(
+            items=(
+                ('1', "WINDOW 250X200", ""),
+                ('2', "WINDOW 200X200", ""),
+                ('3', "WINDOW 180X200", ""),
+                ('4', "WINDOW 180X160", ""),
+                ('5', "WINDOW 160X160", ""),
+                ('6', "WINDOW 50X50", ""),
+                ('7', "DOOR 80X250", ""),
+                ('8', "DOOR 80X230", ""),
+                ),
+            name="",
+            description='Predefined types',
+            update=update_using_default,
+            )
     gen: IntProperty(
             name='H Count', min=1, max=8, default=3,
             description='Horizontal Panes',
@@ -1771,12 +1785,12 @@ Object.WindowPanelGenerator = CollectionProperty(type=GeneralPanelProperties)
 # ------------------------------------------------------------------
 # Define panel class to modify myobjects.
 # ------------------------------------------------------------------
-class AchmWindowEditPanel(Panel):
+class ARCHIMESH_PT_WindowEdit(Panel):
     bl_idname = "ARCHIMESH_PT_window_edit"
     bl_label = "Window Panel"
     bl_space_type = 'VIEW_3D'
     bl_region_type = 'UI'
-    bl_category = 'Window'
+    bl_category = 'View'
 
     # -----------------------------------------------------
     # Verify if visible