diff --git a/archimesh/achm_gltools.py b/archimesh/achm_gltools.py
index c53d7a88f57f82acc96d5b2140ff7a37d0d18520..981082d07568624d286a512da73b098274ed0a9d 100644
--- a/archimesh/achm_gltools.py
+++ b/archimesh/achm_gltools.py
@@ -38,7 +38,7 @@ import bgl
 import gpu
 from gpu_extras.batch import batch_for_shader
 
-shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
+shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR') if not bpy.app.background else None
 
 # -------------------------------------------------------------
 # Handle all draw routines (OpenGL main entry point)
diff --git a/io_coat3D/__init__.py b/io_coat3D/__init__.py
index 7f36a92cd98a248f06e09dd2f0ca051ea3e2b939..37bf1e7d683ee5473445ab440abb71258789320e 100644
--- a/io_coat3D/__init__.py
+++ b/io_coat3D/__init__.py
@@ -31,7 +31,6 @@ bl_info = {
 
 if "bpy" in locals():
     import importlib
-    importlib.reload(coat)
     importlib.reload(tex)
 else:
     from . import tex
@@ -1717,13 +1716,13 @@ class SceneCoat3D(PropertyGroup):
 class MeshCoat3D(PropertyGroup):
     applink_address: StringProperty(
         name="ApplinkAddress",
-        subtype="APPLINK_ADDRESS",
+        # subtype="APPLINK_ADDRESS",
     )
 
 class MaterialCoat3D(PropertyGroup):
     name: BoolProperty(
         name="ApplinkAddress",
-        subtype="APPLINK_ADDRESS",
+        # subtype="APPLINK_ADDRESS",
         default=True
     )
     bring_diffuse: BoolProperty(
diff --git a/io_convert_image_to_mesh_img/mesh/dtm.py b/io_convert_image_to_mesh_img/mesh/dtm.py
index 497ebb2b700447080c079fd776b6d4b16ee4ab35..a6ab6e30fc406622f731c751fbe5a1bb52418e1c 100644
--- a/io_convert_image_to_mesh_img/mesh/dtm.py
+++ b/io_convert_image_to_mesh_img/mesh/dtm.py
@@ -130,7 +130,7 @@ class DTM:
     def _get_data_start(self):
         """Gets the start position of the DTM data block"""
         label_length = self.label['RECORD_BYTES']
-        num_labels = self.label.get(text='LABEL_RECORDS', 1)
+        num_labels = self.label.get('LABEL_RECORDS', 1)
         return int(label_length * num_labels)
 
     def _process_invalid_data(self, data):
diff --git a/io_scene_ms3d/__init__.py b/io_scene_ms3d/__init__.py
index 805b1d830374d045758d9814c0044fe648e1dfe6..02b0e0a2ef81dc4488fa16fea38d3689679e1ed3 100644
--- a/io_scene_ms3d/__init__.py
+++ b/io_scene_ms3d/__init__.py
@@ -59,10 +59,6 @@ else:
 
 
 #import blender stuff
-from bpy.utils import (
-        register_module,
-        unregister_module,
-        )
 from bpy.types import (
         TOPBAR_MT_file_export,
         TOPBAR_MT_file_import,
@@ -81,7 +77,6 @@ def register():
 
     ms3d_ui.register()
 
-    register_module(__name__)
     TOPBAR_MT_file_export.append(Ms3dExportOperator.menu_func)
     TOPBAR_MT_file_import.append(Ms3dImportOperator.menu_func)
 
@@ -89,7 +84,6 @@ def register():
 def unregister():
     ms3d_ui.unregister()
 
-    unregister_module(__name__)
     TOPBAR_MT_file_export.remove(Ms3dExportOperator.menu_func)
     TOPBAR_MT_file_import.remove(Ms3dImportOperator.menu_func)
 
diff --git a/io_scene_ms3d/ms3d_ui.py b/io_scene_ms3d/ms3d_ui.py
index 5019506198497e4c86228590205b6014e87ff95c..4db2e5f7125f0b2d3421b987636ce530a67c717d 100644
--- a/io_scene_ms3d/ms3d_ui.py
+++ b/io_scene_ms3d/ms3d_ui.py
@@ -80,7 +80,7 @@ from bpy.types import (
         Mesh,
         Material,
         Action,
-        Group,
+        Collection,
         UIList,
         )
 from bpy.app import (
@@ -1740,7 +1740,7 @@ def inject_properties():
     Bone.ms3d = PointerProperty(type=Ms3dJointProperties)
     Material.ms3d = PointerProperty(type=Ms3dMaterialProperties)
     Action.ms3d = PointerProperty(type=Ms3dArmatureProperties)
-    Group.ms3d = PointerProperty(type=Ms3dGroupProperties)
+    Collection.ms3d = PointerProperty(type=Ms3dGroupProperties)
 
 def delete_properties():
     del Mesh.ms3d
@@ -1748,7 +1748,7 @@ def delete_properties():
     del Bone.ms3d
     del Material.ms3d
     del Action.ms3d
-    del Group.ms3d
+    del Collection.ms3d
 
 ###############################################################################
 
diff --git a/measureit/measureit_geometry.py b/measureit/measureit_geometry.py
index 0ac8bd3754c2d63d418c66799c24d8c21ad83d45..6b20d7139c3cb59147274dfd45f0f39bb3c3acb3 100644
--- a/measureit/measureit_geometry.py
+++ b/measureit/measureit_geometry.py
@@ -39,7 +39,7 @@ import bgl
 import gpu
 from gpu_extras.batch import batch_for_shader
 
-shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
+shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR') if not bpy.app.background else None
 
 # -------------------------------------------------------------
 # Draw segments
diff --git a/mesh_f2.py b/mesh_f2.py
index 12b0ab653543b4374c4e5429db10a683eb839588..ae246f47fe7ba41d7e71502b39ee50cd43258f9a 100644
--- a/mesh_f2.py
+++ b/mesh_f2.py
@@ -367,13 +367,15 @@ def register():
     if kcfg:
         km = kcfg.keymaps.new(name='Mesh', space_type='EMPTY')
         kmi = km.keymap_items.new("mesh.f2", 'F', 'PRESS')
-        addon_keymaps.append((km, kmi))
+        addon_keymaps.append((km, kmi.idname))
 
 
 def unregister():
     # remove keymap entry
-    for km, kmi in addon_keymaps:
-        km.keymap_items.remove(kmi)
+    for km, kmi_idname in addon_keymaps:
+        for kmi in km.keymap_items:
+            if kmi.idname == kmi_idname:
+                km.keymap_items.remove(kmi)
     addon_keymaps.clear()
 
     # remove operator and preferences
diff --git a/mesh_inset/__init__.py b/mesh_inset/__init__.py
index 781b6962c367d4eb515c1f9c92e8a124f60b5053..8702b39041a612199b1346b4aa54f0e77d6ebeb2 100644
--- a/mesh_inset/__init__.py
+++ b/mesh_inset/__init__.py
@@ -63,7 +63,7 @@ HEIGHT_VALUE = 1
 NUM_VALUES = 2
 
 # TODO: make a dooted-line shader
-shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
+shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR') if not bpy.app.background else None
 
 class MESH_OT_InsetStraightSkeleton(bpy.types.Operator):
     bl_idname = "mesh.insetstraightskeleton"
diff --git a/modules/selection_utils.py b/modules/selection_utils.py
index eb85e869241925cb38049f4a719eae1aa035ce03..a1dc04695f48ff8fc5afb84aad500e3a63cf8c10 100644
--- a/modules/selection_utils.py
+++ b/modules/selection_utils.py
@@ -78,4 +78,4 @@ class SelectionOrder(bpy.types.Operator):
         return {'RUNNING_MODAL'}
 
 
-bpy.utils.register_module(__name__)
+bpy.utils.register_class(SelectionOrder)
diff --git a/render_povray/__init__.py b/render_povray/__init__.py
index ebbeebe646181ba4e4a9addf1f8e15ced1c6bd54..fdec7d379c53b79e36c5cbcbd364180a0a3742ab 100644
--- a/render_povray/__init__.py
+++ b/render_povray/__init__.py
@@ -40,7 +40,7 @@ if "bpy" in locals():
 
 else:
     import bpy
-    from bpy.utils import register_class
+    from bpy.utils import register_class, unregister_class
     #import addon_utils # To use some other addons
     import nodeitems_utils #for Nodes
     from nodeitems_utils import NodeCategory, NodeItem #for Nodes
@@ -3633,26 +3633,32 @@ class PovrayPreferences(AddonPreferences):
         layout.prop(self, "docpath_povray")
 
 
+classes = (
+    PovrayPreferences,
+    RenderPovSettingsCamera,
+    RenderPovSettingsWorld,
+    RenderPovSettingsMaterial,
+    MaterialRaytraceMirror, 
+    MaterialSubsurfaceScattering,
+    RenderPovSettingsObject,
+    RenderPovSettingsScene,
+    RenderPovSettingsText,
+    RenderPovSettingsTexture,
+)
+
 
 def register():
 
     #bpy.utils.register_module(__name__) #DEPRECATED Now imported from bpy.utils import register_class
-    
+
+    for cls in classes:
+        register_class(cls)
+ 
     render.register()
     ui.register()
     primitives.register()
     nodes.register()
-    
-    register_class(PovrayPreferences)
-    register_class(RenderPovSettingsCamera)
-    register_class(RenderPovSettingsWorld)
-    register_class(RenderPovSettingsMaterial)
-    register_class(MaterialRaytraceMirror)    
-    register_class(MaterialSubsurfaceScattering)
-    register_class(RenderPovSettingsObject)
-    register_class(RenderPovSettingsScene)
-    register_class(RenderPovSettingsText)
-    register_class(RenderPovSettingsTexture)
+
     '''    
         bpy.types.VIEW3D_MT_add.prepend(ui.menu_func_add)
         bpy.types.TOPBAR_MT_file_import.append(ui.menu_func_import)
@@ -3704,6 +3710,15 @@ def unregister():
     '''
     #bpy.utils.unregister_module(__name__)
 
+    nodes.unregister()
+    primitives.unregister()
+    ui.unregister()
+    render.unregister()
+
+    for cls in reversed(classes):
+        unregister_class(cls)
+ 
+
 
 if __name__ == "__main__":
     register()
diff --git a/render_povray/render.py b/render_povray/render.py
index 7e605f196f0c6f3200ed5b6373c4f1d6a8b9b728..31beb174f488f6f493ea3181666b1021cfff34fd 100644
--- a/render_povray/render.py
+++ b/render_povray/render.py
@@ -4423,5 +4423,5 @@ def register():
 def unregister():
     from bpy.utils import unregister_class
 
-    for cls in classes:
+    for cls in reversed(classes):
         unregister_class(cls)
diff --git a/render_povray/ui.py b/render_povray/ui.py
index fa677524bf7c3a7018315e6c388b9f945dc19f9c..f9064e67f19c1fce2324ed871d50bc83a06e1212 100644
--- a/render_povray/ui.py
+++ b/render_povray/ui.py
@@ -23,7 +23,7 @@ import sys #really import here and in render.py?
 import os #really import here and in render.py?
 from os.path import isfile
 from bl_operators.presets import AddPresetBase
-from bpy.utils import register_class
+from bpy.utils import register_class, unregister_class
 
 # Example of wrapping every class 'as is'
 from bl_ui import properties_output
@@ -2412,9 +2412,6 @@ def register():
 def unregister():
     #from bpy.utils import unregister_class
 
-    for cls in classes:
-        unregister_class(cls)
-        
     #bpy.types.TEXTURE_PT_context_texture.remove(TEXTURE_PT_povray_type)
     #addon_utils.disable("add_mesh_extra_objects", default_set=False)
     #bpy.types.WORLD_PT_POV_world.remove(world_panel_func)
@@ -2422,4 +2419,8 @@ def unregister():
     bpy.types.RENDER_PT_povray_radiosity.remove(rad_panel_func)
     bpy.types.TEXT_MT_templates.remove(menu_func_templates)
     bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
-    bpy.types.VIEW3D_MT_add.remove(menu_func_add)
\ No newline at end of file
+    bpy.types.VIEW3D_MT_add.remove(menu_func_add)
+
+    for cls in reversed(classes):
+        unregister_class(cls)
+
diff --git a/space_view3d_math_vis/draw.py b/space_view3d_math_vis/draw.py
index a31d284b3c9ffce9355bcb04ba3c5fe6489f0ff8..f9777e77879e95047c12621511e62919e4c4d20e 100644
--- a/space_view3d_math_vis/draw.py
+++ b/space_view3d_math_vis/draw.py
@@ -30,8 +30,12 @@ from mathutils import Vector
 SpaceView3D = bpy.types.SpaceView3D
 callback_handle = []
 
-single_color_shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
-smooth_color_shader = gpu.shader.from_builtin('3D_SMOOTH_COLOR')
+if not bpy.app.background:
+    single_color_shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
+    smooth_color_shader = gpu.shader.from_builtin('3D_SMOOTH_COLOR')
+else:
+  single_color_shader = None
+  smooth_color_shader = None
 
 COLOR_POINT = (1.0, 0.0, 1.0, 1)
 COLOR_LINE = (0.5, 0.5, 1, 1)