diff --git a/mesh_carver.py b/mesh_carver.py
index aa388a1580f979e24714690f9b64df70d5646abc..16308aa4e7c423c832da3ab6381532f95cf74998 100644
--- a/mesh_carver.py
+++ b/mesh_carver.py
@@ -21,37 +21,44 @@ bl_info = {
     "name": "Carver MT",
     "category": "Object",
     "author": "Pixivore, Cedric LEPILLER, Ted Milker",
-    "version": (1, 1, 7),
-    "blender": (2, 77, 0),
+    "version": (1, 1, 8),
+    "blender": (2, 79, 2),
     "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
                 "Scripts/Modeling/Carver",
     "description": "Multiple tools to carve or to create objects",
-    }
+}
 
 import bpy
 import bgl
 import blf
 import math
-import mathutils
 import sys
 import random
 import bmesh
+from mathutils import (
+    Color,
+    Euler,
+    Matrix,
+    Vector,
+    Quaternion,
+)
 import bpy_extras
 from bpy.props import (
-        BoolProperty,
-        EnumProperty,
-        IntProperty,
-        StringProperty,
-        )
+    BoolProperty,
+    IntProperty,
+    PointerProperty,
+    StringProperty,
+)
 from bpy_extras import view3d_utils
 from bpy_extras.view3d_utils import (
-        region_2d_to_vector_3d,
-        region_2d_to_location_3d,
-        )
+    region_2d_to_vector_3d,
+    region_2d_to_location_3d,
+)
+
 
 Profils = [
     ("CTP_4882",
-     mathutils.Vector((2.61824, -5.56469, 0)),
+      Vector((2.61824, -5.56469, 0)),
      [(-1.156501, 0.799282, 0.032334),
       (-0.967583, 0.838861, 0.032334),
       (-1.10386, 0.846403, 0.032334),
@@ -108,7 +115,7 @@ Profils = [
       [38, 39, 47], [34, 32, 35], [39, 46, 47], [43, 34, 35], [35, 38, 47], [47, 42, 35], [32, 33, 35],
       [42, 40, 43], [36, 37, 39], [42, 43, 35], [44, 45, 47], [46, 44, 47]]),
     ("CTP_8354",
-     mathutils.Vector((-0.06267, -2.43829, -0.0)),
+     Vector((-0.06267, -2.43829, -0.0)),
      [(-0.534254, -1.0, 0.032334),
       (-1.0, -0.534254, 0.032334),
       (-0.654798, -0.98413, 0.032334),
@@ -212,7 +219,7 @@ Profils = [
       [48, 71, 80, 47], [67, 37, 38, 83], [82, 83, 87, 86], [81, 82, 86, 85], [80, 81, 85, 84], [47, 80, 84, 46],
       [83, 38, 39, 87]]),
     ("CTP_5585",
-     mathutils.Vector((5.0114, -2.4281, 0.0)),
+     Vector((5.0114, -2.4281, 0.0)),
      [(-0.490711, -1.0, 0.032334),
       (-1.0, -0.490711, 0.032334),
       (1.0, -0.490711, 0.032334),
@@ -233,7 +240,7 @@ Profils = [
      [[11, 12, 13, 14], [9, 8, 4, 1], [10, 9, 1, 0], [11, 10, 0, 3], [12, 11, 3, 2], [13, 12, 2, 7],
       [14, 13, 7, 6], [15, 14, 6, 5], [8, 15, 5, 4], [9, 10, 15, 8], [10, 11, 14, 15]]),
     ("CTP_6960",
-     mathutils.Vector((-0.11417, 2.48371, -0.0)),
+     Vector((-0.11417, 2.48371, -0.0)),
      [(0.0, 1.0, 0.016827),
       (-0.382683, 0.92388, 0.016827),
       (-0.707107, 0.707107, 0.016827),
@@ -271,7 +278,7 @@ Profils = [
       [6, 22, 21, 5], [14, 30, 29, 13], [7, 23, 22, 6], [15, 31, 30, 14], [8, 24, 23, 7], [1, 17, 16, 0],
       [0, 16, 31, 15], [9, 25, 24, 8], [2, 18, 17, 1], [10, 26, 25, 9]]),
     ("CTP_5359",
-     mathutils.Vector((5.50446, 2.41669, -0.0)),
+     Vector((5.50446, 2.41669, -0.0)),
      [(0.0, 0.714247, 0.023261),
       (-0.382683, 0.659879, 0.023261),
       (-0.707107, 0.505049, 0.023261),
@@ -309,7 +316,7 @@ Profils = [
       [6, 22, 21, 5], [14, 30, 29, 13], [7, 23, 22, 6], [15, 31, 30, 14], [8, 24, 23, 7], [1, 17, 16, 0],
       [0, 16, 31, 15], [9, 25, 24, 8], [2, 18, 17, 1], [10, 26, 25, 9]]),
     ("CTP_5424",
-     mathutils.Vector((2.61824, 2.34147, 0.0)),
+     Vector((2.61824, 2.34147, 0.0)),
      [(1.0, -1.0, 0.032334),
       (-1.0, 1.0, 0.032334),
       (1.0, 1.0, 0.032334),
@@ -328,7 +335,7 @@ Profils = [
      [[3, 0, 2], [10, 9, 2], [2, 1, 4], [2, 4, 13], [5, 3, 2], [6, 5, 2], [2, 13, 12], [2, 12, 11], [7, 6, 2],
       [8, 7, 2], [2, 11, 10], [9, 8, 2]]),
     ("CTP_3774",
-     mathutils.Vector((2.61824, -2.52425, 0.0)),
+     Vector((2.61824, -2.52425, 0.0)),
      [(1.0, 0.0, 0.020045),
       (-1.0, 0.0, 0.020045),
       (0.31903, -0.664947, 0.020045),
@@ -367,7 +374,7 @@ Profils = [
       [11, 30, 9, 12], [17, 16, 27, 26], [14, 17, 26, 24], [24, 25, 0, 14], [15, 13, 27, 16], [9, 30, 23, 4],
       [31, 29, 7, 18], [28, 31, 18, 21], [30, 28, 21, 23]]),
     ("CTP_4473",
-     mathutils.Vector((7.31539, 0.0, 0.0)),
+     Vector((7.31539, 0.0, 0.0)),
      [(0.24549, -1.0, 0.022454),
       (-0.24549, -1.0, 0.022454),
       (-0.24549, 1.0, 0.022454),
@@ -383,7 +390,7 @@ Profils = [
       ],
      [[8, 3, 2, 10], [0, 9, 11, 1], [4, 8, 9, 5], [8, 10, 11, 9], [10, 7, 6, 11]]),
     ("CTP_4003",
-     mathutils.Vector((4.91276, 0.0, 0.0)),
+     Vector((4.91276, 0.0, 0.0)),
      [(-1.0, -1.0, 0.026945),
       (1.0, -1.0, 0.026945),
       (-1.0, 1.0, 0.026945),
@@ -424,7 +431,7 @@ Profils = [
       [23, 25, 31, 29], [24, 23, 29, 30], [25, 22, 28, 31], [26, 22, 15, 20], [10, 27, 33, 5], [31, 28, 3, 11],
       [33, 30, 13, 14], [29, 31, 11, 12], [5, 33, 14, 1], [30, 29, 12, 13], [32, 28, 22, 26]]),
     ("CTP_3430",
-     mathutils.Vector((2.61824, 0.0, 0.0)),
+     Vector((2.61824, 0.0, 0.0)),
      [(-1.0, -1.0, 0.032334),
       (1.0, -1.0, 0.032334),
       (-1.0, 1.0, 0.032334),
@@ -432,7 +439,7 @@ Profils = [
       ],
      [[0, 1, 3, 2]]),
     ("CTP_7175",
-     mathutils.Vector((0.0, 0.0, 0.0)),
+     Vector((0.0, 0.0, 0.0)),
      [(-1.0, -1.0, 0.032334),
       (1.0, -1.0, 0.032334),
       (-1.0, 1.0, 0.032334),
@@ -464,33 +471,33 @@ class CarverPrefs(bpy.types.AddonPreferences):
     bl_idname = __name__
 
     Enable_Tab_01 = BoolProperty(
-            name="Info",
-            description="Some general information and settings about the add-on",
-            default=False
-            )
+        name="Info",
+        description="Some general information and settings about the add-on",
+        default=False
+    )
     Enable_Tab_02 = BoolProperty(
-            name="Hotkeys",
-            description="List of the shortcuts used during carving",
-            default=False
-            )
+        name="Hotkeys",
+        description="List of the shortcuts used during carving",
+        default=False
+    )
     bpy.types.Scene.Key_Create = StringProperty(
-            name="Object creation",
-            description="Object creation",
-            maxlen=1,
-            default="C"
-            )
+        name="Object creation",
+        description="Object creation",
+        maxlen=1,
+        default="C"
+    )
     bpy.types.Scene.Key_Update = StringProperty(
-            name="Auto Bevel Update",
-            description="Auto Bevel Update",
-            maxlen=1,
-            default="A",
-            )
+        name="Auto Bevel Update",
+        description="Auto Bevel Update",
+        maxlen=1,
+        default="A",
+    )
     bpy.types.Scene.Key_Bool = StringProperty(
-            name="Boolean type",
-            description="Boolean operation type",
-            maxlen=1,
-            default="T",
-            )
+        name="Boolean type",
+        description="Boolean operation type",
+        maxlen=1,
+        default="T",
+    )
     bpy.types.Scene.Key_Brush = StringProperty(
             name="Brush Mode",
             description="Brush Mode",
@@ -498,167 +505,150 @@ class CarverPrefs(bpy.types.AddonPreferences):
             default="B",
             )
     bpy.types.Scene.Key_Help = StringProperty(
-            name="Help display",
-            description="Help display",
-            maxlen=1,
-            default="H",
-            )
+        name="Help display",
+        description="Help display",
+        maxlen=1,
+        default="H",
+    )
     bpy.types.Scene.Key_Instant = StringProperty(
-            name="Instantiate",
-            description="Instantiate object",
-            maxlen=1,
-            default="I",
-            )
+        name="Instantiate",
+        description="Instantiate object",
+        maxlen=1,
+        default="I",
+    )
     bpy.types.Scene.Key_Close = StringProperty(
-            name="Close polygonal shape",
-            description="Close polygonal shape",
-            maxlen=1,
-            default="X",
-            )
+        name="Close polygonal shape",
+        description="Close polygonal shape",
+        maxlen=1,
+        default="X",
+    )
     bpy.types.Scene.Key_Apply = StringProperty(
-            name="Apply operation",
-            description="Apply operation",
-            maxlen=1,
-            default="Q",
-            )
+        name="Apply operation",
+        description="Apply operation",
+        maxlen=1,
+        default="Q",
+    )
     bpy.types.Scene.Key_Scale = StringProperty(
-            name="Scale object",
-            description="Scale object",
-            maxlen=1,
-            default="S",
-            )
+        name="Scale object",
+        description="Scale object",
+        maxlen=1,
+        default="S",
+    )
     bpy.types.Scene.Key_Gapy = StringProperty(
-            name="Gap rows",
-            description="Scale gap between columns",
-            maxlen=1,
-            default="J",
-            )
+        name="Gap rows",
+        description="Scale gap between columns",
+        maxlen=1,
+        default="J",
+    )
     bpy.types.Scene.Key_Gapx = StringProperty(
-            name="Gap columns",
-            description="Scale gap between columns",
-            maxlen=1,
-            default="U",
-            )
+        name="Gap columns",
+        description="Scale gap between columns",
+        maxlen=1,
+        default="U",
+    )
     bpy.types.Scene.Key_Depth = StringProperty(
-            name="Depth",
-            description="Cursor depth or solidify pattern",
-            maxlen=1,
-            default="D",
-            )
+        name="Depth",
+        description="Cursor depth or solidify pattern",
+        maxlen=1,
+        default="D",
+    )
     bpy.types.Scene.Key_BrushDepth = StringProperty(
-            name="Brush Depth",
-            description="Brush depth",
-            maxlen=1,
-            default="C",
-            )
+        name="Brush Depth",
+        description="Brush depth",
+        maxlen=1,
+        default="C",
+    )
     bpy.types.Scene.Key_Subadd = StringProperty(
-            name="Add subdivision",
-            description="Add subdivision",
-            maxlen=1,
-            default="X",
-            )
+        name="Add subdivision",
+        description="Add subdivision",
+        maxlen=1,
+        default="X",
+    )
     bpy.types.Scene.Key_Subrem = StringProperty(
-            name="Remove subdivision",
-            description="Remove subdivision",
-            maxlen=1,
-            default="W",
-            )
+        name="Remove subdivision",
+        description="Remove subdivision",
+        maxlen=1,
+        default="W",
+    )
     bpy.types.Scene.Key_Randrot = StringProperty(
-            name="Random rotation",
-            description="Random rotation",
-            maxlen=1,
-            default="R",
-            )
-    bpy.types.Scene.Key_Solver = StringProperty(
-            name="Solver",
-            description="Switch between Carve and BMesh Boolean solver\n"
-                        "depending on a specific use case",
-            maxlen=1,
-            default="V",
-            )
+        name="Random rotation",
+        description="Random rotation",
+        maxlen=1,
+        default="R",
+    )
     bpy.types.Scene.ProfilePrefix = StringProperty(
-            name="Profile prefix",
-            description="Prefix to look for profiles with",
-            default="Carver_Profile-"
-            )
-    bpy.types.Scene.CarverSolver = EnumProperty(
-            name="Boolean Solver",
-            description="Boolean solver to use by default\n",
-            default="CARVE",
-            items=(
-                ('CARVE', 'Carve', "Carve solver, as the legacy one, can handle\n"
-                                   "basic coplanar but can often fail with\n"
-                                   "non-closed geometry"),
-                ('BMESH', 'BMesh', "BMesh solver is faster, but cannot handle\n"
-                                   "coplanar and self-intersecting geometry")
-                )
-            )
+        name="Profile prefix",
+        description="Prefix to look for profiles with",
+        default="Carver_Profile-"
+    )
 
     def draw(self, context):
         scene = context.scene
         layout = self.layout
 
-        layout.prop(self, "Enable_Tab_01", text="Info and Settings", icon="QUESTION")
+        icon_1 = "TRIA_RIGHT" if not self.Enable_Tab_01 else "TRIA_DOWN"
+        box = layout.box()
+        box.prop(self, "Enable_Tab_01", text="Info and Settings", emboss=False, icon=icon_1)
         if self.Enable_Tab_01:
-            layout.label(text="Carver Operator:", icon="LAYER_ACTIVE")
-            layout.label(text="Select a Mesh Object and press [CTRL]+[SHIFT]+[X] to carve",
+            box.label(text="Carver Operator:", icon="LAYER_ACTIVE")
+            box.label(text="Select a Mesh Object and press [CTRL]+[SHIFT]+[X] to carve",
                          icon="LAYER_USED")
-            layout.label(text="To finish carving press [ESC] or [RIGHT CLICK]",
+            box.label(text="To finish carving press [ESC] or [RIGHT CLICK]",
                          icon="LAYER_USED")
+            box.prop(scene, "ProfilePrefix", text="Profile prefix")
 
-            layout.prop(scene, "ProfilePrefix", text="Profile prefix")
-            layout.prop(scene, "CarverSolver", text="Solver")
-
-        layout.prop(self, "Enable_Tab_02", text="Keys", icon="KEYINGSET")
+        icon_2 = "TRIA_RIGHT" if not self.Enable_Tab_02 else "TRIA_DOWN"
+        box = layout.box()
+        box.prop(self, "Enable_Tab_02", text="Keys", emboss=False, icon=icon_2)
         if self.Enable_Tab_02:
-            split = layout.split()
-            col = split.column()
+            split = box.split(align=True)
+            box = split.box()
+            col = box.column(align=True)
             col.label("Object Creation:")
             col.prop(scene, "Key_Create", text="")
             col.label("Auto bevel update:")
             col.prop(scene, "Key_Update", text="")
             col.label("Boolean operation type:")
             col.prop(scene, "Key_Bool", text="")
-            col.label("Solver:")
-            col.prop(scene, "Key_Solver", text="")
+            col.label("Brush Depth:")
+            col.prop(scene, "Key_BrushDepth", text="")
 
-            col = split.column()
+            box = split.box()
+            col = box.column(align=True)
             col.label("Brush Mode:")
             col.prop(scene, "Key_Brush", text="")
             col.label("Help display:")
             col.prop(scene, "Key_Help", text="")
             col.label("Instantiate object:")
             col.prop(scene, "Key_Instant", text="")
-            col.label("Brush Depth:")
-            col.prop(scene, "Key_BrushDepth", text="")
+            col.label("Random rotation:")
+            col.prop(scene, "Key_Randrot", text="")
 
-            col = split.column()
+            box = split.box()
+            col = box.column(align=True)
             col.label("Close polygonal shape:")
             col.prop(scene, "Key_Close", text="")
             col.label("Apply operation:")
             col.prop(scene, "Key_Apply", text="")
             col.label("Scale object:")
             col.prop(scene, "Key_Scale", text="")
+            col.label("Subdiv add:")
+            col.prop(scene, "Key_Subadd", text="")
 
-            col = split.column()
+            box = split.box()
+            col = box.column(align=True)
             col.label("Gap rows:")
             col.prop(scene, "Key_Gapy", text="")
             col.label("Gap columns:")
             col.prop(scene, "Key_Gapx", text="")
             col.label("Depth / Solidify:")
             col.prop(scene, "Key_Depth", text="")
-
-            col = split.column()
-            col.label("Subdiv add:")
-            col.prop(scene, "Key_Subadd", text="")
             col.label("Subdiv Remove:")
             col.prop(scene, "Key_Subrem", text="")
-            col.label("Random rotation:")
-            col.prop(scene, "Key_Randrot", text="")
 
 
 # Draw Text (Center position)
-def DrawCenterText(text, xt, yt, Size, Color, self):
+def DrawCenterText(text, xt, yt, Size, colors, self):
     font_id = 0
     # Offset Shadow
     Sshadow_x = 2
@@ -670,16 +660,16 @@ def DrawCenterText(text, xt, yt, Size, Color, self):
 
     blf.draw(font_id, text)
     blf.position(font_id, xt - blf.dimensions(font_id, text)[0] / 2, yt, 0)
-    if Color is not None:
-        mColor = mathutils.Color((Color[0], Color[1], Color[2]))
-        bgl.glColor4f(mColor.r, mColor.g, mColor.b, 1.0)
+    if colors is not None:
+        mcolor = Color((colors[0], colors[1], colors[2]))
+        bgl.glColor4f(mcolor.r, mcolor.g, mcolor.b, 1.0)
     else:
         bgl.glColor4f(1.0, 1.0, 1.0, 1.0)
     blf.draw(font_id, text)
 
 
 # Draw text (Left position)
-def DrawLeftText(text, xt, yt, Size, Color, self):
+def DrawLeftText(text, xt, yt, Size, colors, self):
     font_id = 0
     # Offset Shadow
     Sshadow_x = 2
@@ -690,16 +680,16 @@ def DrawLeftText(text, xt, yt, Size, Color, self):
     bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
     blf.draw(font_id, text)
     blf.position(font_id, xt, yt, 0)
-    if Color is not None:
-        mColor = mathutils.Color((Color[0], Color[1], Color[2]))
-        bgl.glColor4f(mColor.r, mColor.g, mColor.b, 1.0)
+    if colors is not None:
+        mcolor = Color((colors[0], colors[1], colors[2]))
+        bgl.glColor4f(mcolor.r, mcolor.g, mcolor.b, 1.0)
     else:
         bgl.glColor4f(1.0, 1.0, 1.0, 1.0)
     blf.draw(font_id, text)
 
 
 # Draw text (Right position)
-def DrawRightText(text, xt, yt, Size, Color, self):
+def DrawRightText(text, xt, yt, Size, colors, self):
     font_id = 0
     # Offset Shadow
     Sshadow_x = 2
@@ -710,9 +700,9 @@ def DrawRightText(text, xt, yt, Size, Color, self):
     bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
     blf.draw(font_id, text)
     blf.position(font_id, xt - blf.dimensions(font_id, text)[0], yt, 0)
-    if Color is not None:
-        mColor = mathutils.Color((Color[0], Color[1], Color[2]))
-        bgl.glColor4f(mColor.r, mColor.g, mColor.b, 1.0)
+    if colors is not None:
+        mcolor = Color((colors[0], colors[1], colors[2]))
+        bgl.glColor4f(mcolor.r, mcolor.g, mcolor.b, 1.0)
     else:
         bgl.glColor4f(1.0, 1.0, 1.0, 1.0)
     blf.draw(font_id, text)
@@ -743,28 +733,18 @@ def draw_callback_px(self, context):
         BooleanMode = "Create"
     else:
         if self.ObjectMode or self.ProfileMode:
-            if self.BoolOps == DIFFERENCE:
-                BooleanType = "Difference) [T]"
-            else:
-                BooleanType = "Union) [T]"
-
-            if self.ObjectMode:
-                BooleanMode = "Object Brush (" + BooleanType
-            else:
-                BooleanMode = "Profil Brush (" + BooleanType
+            BooleanType = "Difference) [T]" if self.BoolOps == DIFFERENCE else "Union) [T]"
+            BooleanMode = \
+                "Object Brush (" + BooleanType if self.ObjectMode else "Profil Brush (" + BooleanType
         else:
-            if (self.shift is False) and (self.ForceRebool is False):
-                BooleanMode = "Difference"
-            else:
-                BooleanMode = "Rebool"
+            BooleanMode = \
+                "Difference" if (self.shift is False) and (self.ForceRebool is False) else "Rebool"
 
     UIColor = (0.992, 0.5518, 0.0, 1.0)
 
     # Display boolean mode
-    if region.width >= 850:
-        DrawCenterText(BooleanMode, xt, yt, 40, UIColor, self)
-    else:
-        DrawCenterText(BooleanMode, xt, yt, 20, UIColor, self)
+    text_size = 40 if region.width >= 850 else 20
+    DrawCenterText(BooleanMode, xt, yt, text_size, UIColor, self)
 
     # Separator (Line)
     LineWidth = 75
@@ -790,12 +770,11 @@ def draw_callback_px(self, context):
     # Variables according to screen size
     IFontSize = 12
     yInterval = 20
-    xCmd = 0
     yCmd = yt - 30
+
     if region.width >= 850:
         IFontSize = 18
         yInterval = 25
-        xCmd = 100
 
     # Color
     Color0 = None
@@ -816,11 +795,9 @@ def draw_callback_px(self, context):
 
         # Depth Cursor
         TypeStr = "Cursor Depth [" + context.scene.Key_Depth + "] : "
-        if self.snapCursor:
-            BoolStr = "(ON)"
-        else:
-            BoolStr = "(OFF)"
+        BoolStr = "(ON)" if self.snapCursor else "(OFF)"
         OpsStr = TypeStr + BoolStr
+
         TotalWidth = blf.dimensions(font_id, OpsStr)[0]
         xLeft = region.width / 2 - TotalWidth / 2
         xLeftP = xLeft + blf.dimensions(font_id, TypeStr)[0]
@@ -830,11 +807,9 @@ def draw_callback_px(self, context):
         if self.CreateMode is False:
             # Apply Booleans
             TypeStr = "Apply Operations [" + context.scene.Key_Apply + "] : "
-            if self.DontApply:
-                BoolStr = "(OFF)"
-            else:
-                BoolStr = "(ON)"
+            BoolStr = "(OFF)" if self.DontApply else "(ON)"
             OpsStr = TypeStr + BoolStr
+
             TotalWidth = blf.dimensions(font_id, OpsStr)[0]
             xLeft = region.width / 2 - TotalWidth / 2
             xLeftP = xLeft + blf.dimensions(font_id, TypeStr)[0]
@@ -843,11 +818,9 @@ def draw_callback_px(self, context):
 
             # Auto update for bevel
             TypeStr = "Bevel Update [" + context.scene.Key_Update + "] : "
-            if self.Auto_BevelUpdate:
-                BoolStr = "(ON)"
-            else:
-                BoolStr = "(OFF)"
+            BoolStr = "(ON)" if self.Auto_BevelUpdate else "(OFF)"
             OpsStr = TypeStr + BoolStr
+
             TotalWidth = blf.dimensions(font_id, OpsStr)[0]
             xLeft = region.width / 2 - TotalWidth / 2
             xLeftP = xLeft + blf.dimensions(font_id, TypeStr)[0]
@@ -856,10 +829,7 @@ def draw_callback_px(self, context):
 
         # Subdivisions
         if self.CutMode == CIRCLE:
-            if self.CreateMode is False:
-                y = yCmd - yInterval * 4
-            else:
-                y = yCmd - yInterval * 2
+            y = yCmd - yInterval * 4 if self.CreateMode is False else yCmd - yInterval * 2
             TypeStr = "Subdivisions [" + context.scene.Key_Subrem + "][" + context.scene.Key_Subadd + "] : "
             BoolStr = str((int(360 / self.stepAngle[self.step])))
             OpsStr = TypeStr + BoolStr
@@ -872,11 +842,9 @@ def draw_callback_px(self, context):
     else:
         # INSTANTIATE:
         TypeStr = "Instantiate [" + context.scene.Key_Instant + "] : "
-        if self.Instantiate:
-            BoolStr = "(ON)"
-        else:
-            BoolStr = "(OFF)"
+        BoolStr = "(ON)" if self.Instantiate else "(OFF)"
         OpsStr = TypeStr + BoolStr
+
         blf.size(font_id, IFontSize, 72)
         TotalWidth = blf.dimensions(font_id, OpsStr)[0]
         xLeft = region.width / 2 - TotalWidth / 2
@@ -887,11 +855,9 @@ def draw_callback_px(self, context):
         # RANDOM ROTATION:
         if self.alt:
             TypeStr = "Random Rotation [" + context.scene.Key_Randrot + "] : "
-            if self.RandomRotation:
-                BoolStr = "(ON)"
-            else:
-                BoolStr = "(OFF)"
+            BoolStr = "(ON)" if self.RandomRotation else "(OFF)"
             OpsStr = TypeStr + BoolStr
+
             blf.size(font_id, IFontSize, 72)
             TotalWidth = blf.dimensions(font_id, OpsStr)[0]
             xLeft = region.width / 2 - TotalWidth / 2
@@ -911,42 +877,38 @@ def draw_callback_px(self, context):
             TotalWidth = blf.dimensions(font_id, OpsStr)[0]
             xLeft = region.width / 2 - TotalWidth / 2
             xLeftP = xLeft + blf.dimensions(font_id, TypeStr)[0]
-            if self.alt:
-                DrawLeftText(TypeStr, xLeft, yCmd - yInterval * 2, IFontSize, Color0, self)
-                DrawLeftText(BoolStr, xLeftP, yCmd - yInterval * 2, IFontSize, Color1, self)
-            else:
-                DrawLeftText(TypeStr, xLeft, yCmd - yInterval, IFontSize, Color0, self)
-                DrawLeftText(BoolStr, xLeftP, yCmd - yInterval, IFontSize, Color1, self)
+
+            self_alt_y = 2 if self.alt else 1
+            DrawLeftText(TypeStr, xLeft, yCmd - yInterval * self_alt_y, IFontSize, Color0, self)
+            DrawLeftText(BoolStr, xLeftP, yCmd - yInterval * self_alt_y, IFontSize, Color1, self)
 
         # BRUSH DEPTH:
         if (self.ObjectMode):
             TypeStr = "Carve Depth [" + context.scene.Key_Depth + "] : "
             BoolStr = str(round(self.ObjectBrush.data.vertices[0].co.z, 2))
             OpsStr = TypeStr + BoolStr
+
             blf.size(font_id, IFontSize, 72)
             TotalWidth = blf.dimensions(font_id, OpsStr)[0]
             xLeft = region.width / 2 - TotalWidth / 2
             xLeftP = xLeft + blf.dimensions(font_id, TypeStr)[0]
-            if self.alt:
-                DrawLeftText(TypeStr, xLeft, yCmd - yInterval * 2, IFontSize, Color0, self)
-                DrawLeftText(BoolStr, xLeftP, yCmd - yInterval * 2, IFontSize, Color1, self)
-            else:
-                DrawLeftText(TypeStr, xLeft, yCmd - yInterval, IFontSize, Color0, self)
-                DrawLeftText(BoolStr, xLeftP, yCmd - yInterval, IFontSize, Color1, self)
+
+            self_alt_y = 2 if self.alt else 1
+            DrawLeftText(TypeStr, xLeft, yCmd - yInterval * self_alt_y, IFontSize, Color0, self)
+            DrawLeftText(BoolStr, xLeftP, yCmd - yInterval * self_alt_y, IFontSize, Color1, self)
 
             TypeStr = "Brush Depth [" + context.scene.Key_BrushDepth + "] : "
             BoolStr = str(round(self.BrushDepthOffset, 2))
             OpsStr = TypeStr + BoolStr
+
             blf.size(font_id, IFontSize, 72)
             TotalWidth = blf.dimensions(font_id, OpsStr)[0]
             xLeft = region.width / 2 - TotalWidth / 2
             xLeftP = xLeft + blf.dimensions(font_id, TypeStr)[0]
-            if self.alt:
-                DrawLeftText(TypeStr, xLeft, yCmd - yInterval * 3, IFontSize, Color0, self)
-                DrawLeftText(BoolStr, xLeftP, yCmd - yInterval * 3, IFontSize, Color1, self)
-            else:
-                DrawLeftText(TypeStr, xLeft, yCmd - yInterval * 2, IFontSize, Color0, self)
-                DrawLeftText(BoolStr, xLeftP, yCmd - yInterval * 2, IFontSize, Color1, self)
+
+            self_alt_y = 3 if self.alt else 2
+            DrawLeftText(TypeStr, xLeft, yCmd - yInterval * self_alt_y, IFontSize, Color0, self)
+            DrawLeftText(BoolStr, xLeftP, yCmd - yInterval * self_alt_y, IFontSize, Color1, self)
 
     bgl.glEnable(bgl.GL_BLEND)
     if region.width >= 850:
@@ -969,21 +931,23 @@ def draw_callback_px(self, context):
             if self.ObjectMode or self.ProfileMode:
                 if self.ProfileMode:
                     DrawLeftText("[" + context.scene.Key_Brush + "]", xHelp, yHelp +
-                                 Help_Interval * 2, Help_FontSize, UIColor, self)
+                                Help_Interval * 2, Help_FontSize, UIColor, self)
                     DrawLeftText(": Object Mode", 150 + t_panel_width, yHelp +
-                                 Help_Interval * 2, Help_FontSize, None, self)
+                                Help_Interval * 2, Help_FontSize, None, self)
                 else:
                     DrawLeftText("[" + context.scene.Key_Brush + "]", xHelp, yHelp +
-                                 Help_Interval * 2, Help_FontSize, UIColor, self)
-                    DrawLeftText(": Return", 150 + t_panel_width, yHelp + Help_Interval * 2, Help_FontSize, None, self)
+                                Help_Interval * 2, Help_FontSize, UIColor, self)
+                    DrawLeftText(": Return", 150 + t_panel_width, yHelp +
+                                Help_Interval * 2, Help_FontSize, None, self)
             else:
                 DrawLeftText("[" + context.scene.Key_Brush + "]", xHelp, yHelp +
-                             Help_Interval * 2, Help_FontSize, UIColor, self)
+                            Help_Interval * 2, Help_FontSize, UIColor, self)
                 DrawLeftText(": Profil Brush", 150 + t_panel_width, yHelp +
-                             Help_Interval * 2, Help_FontSize, None, self)
-                DrawLeftText("[Ctrl + LMB]", xHelp, yHelp - Help_Interval * 6, Help_FontSize, UIColor, self)
+                            Help_Interval * 2, Help_FontSize, None, self)
+                DrawLeftText("[Ctrl + LMB]", xHelp, yHelp - Help_Interval * 6,
+                            Help_FontSize, UIColor, self)
                 DrawLeftText(": Move Cursor", 150 + t_panel_width, yHelp -
-                             Help_Interval * 6, Help_FontSize, None, self)
+                            Help_Interval * 6, Help_FontSize, None, self)
 
             if (self.ObjectMode is False) and (self.ProfileMode is False):
                 if self.CreateMode is False:
@@ -994,235 +958,225 @@ def draw_callback_px(self, context):
                 else:
                     DrawLeftText("[" + context.scene.Key_Create + "]", xHelp,
                                  yHelp + Help_Interval, Help_FontSize, UIColor, self)
-                    DrawLeftText(": Cut", 150 + t_panel_width, yHelp + Help_Interval, Help_FontSize, None, self)
+                    DrawLeftText(": Cut", 150 + t_panel_width, yHelp + Help_Interval,
+                                Help_FontSize, None, self)
 
                 if self.CutMode == RECTANGLE:
                     DrawLeftText("MouseMove", xHelp, yHelp, Help_FontSize, UIColor, self)
                     DrawLeftText("[Alt]", xHelp, yHelp - Help_Interval, Help_FontSize, UIColor, self)
-                    DrawLeftText("[" + context.scene.Key_Solver + "]",
-                                xHelp, yHelp - Help_Interval * 2, Help_FontSize, UIColor, self)
                     DrawLeftText(": Dimension", 150 + t_panel_width, yHelp, Help_FontSize, None, self)
-                    DrawLeftText(": Move all", 150 + t_panel_width, yHelp - Help_Interval, Help_FontSize, None, self)
-                    DrawLeftText(": Solver [" + context.scene.CarverSolver + "]", 150 + t_panel_width,
-                                yHelp - Help_Interval * 2, Help_FontSize, None, self)
+                    DrawLeftText(": Move all", 150 + t_panel_width, yHelp - Help_Interval,
+                                Help_FontSize, None, self)
 
                 if self.CutMode == CIRCLE:
                     DrawLeftText("MouseMove", xHelp, yHelp, Help_FontSize, UIColor, self)
                     DrawLeftText("[Alt]", xHelp, yHelp - Help_Interval, Help_FontSize, UIColor, self)
                     DrawLeftText("[" + context.scene.Key_Subrem + "] [" + context.scene.Key_Subadd + "]",
-                                 xHelp, yHelp - Help_Interval * 2, Help_FontSize, UIColor, self)
+                                xHelp, yHelp - Help_Interval * 2, Help_FontSize, UIColor, self)
                     DrawLeftText("[Ctrl]", xHelp, yHelp - Help_Interval * 3, Help_FontSize, UIColor, self)
-                    DrawLeftText("[" + context.scene.Key_Solver + "]",
-                                xHelp, yHelp - Help_Interval * 4, Help_FontSize, UIColor, self)
                     DrawLeftText(": Rotation and Radius", 150 + t_panel_width, yHelp, Help_FontSize, None, self)
-                    DrawLeftText(": Move all", 150 + t_panel_width, yHelp - Help_Interval, Help_FontSize, None, self)
+                    DrawLeftText(": Move all", 150 + t_panel_width, yHelp - Help_Interval,
+                                Help_FontSize, None, self)
                     DrawLeftText(": Subdivision", 150 + t_panel_width, yHelp -
-                                 Help_Interval * 2, Help_FontSize, None, self)
+                                Help_Interval * 2, Help_FontSize, None, self)
                     DrawLeftText(": Incremental rotation", 150 + t_panel_width,
-                                 yHelp - Help_Interval * 3, Help_FontSize, None, self)
-                    DrawLeftText(": Solver [" + context.scene.CarverSolver + "]",
-                                150 + t_panel_width, yHelp - Help_Interval * 4, Help_FontSize, None, self)
+                                yHelp - Help_Interval * 3, Help_FontSize, None, self)
 
                 if self.CutMode == LINE:
                     DrawLeftText("MouseMove", xHelp, yHelp, Help_FontSize, UIColor, self)
                     DrawLeftText("[Alt]", xHelp, yHelp - Help_Interval, Help_FontSize, UIColor, self)
                     DrawLeftText("[Space]", xHelp, yHelp - Help_Interval * 2, Help_FontSize, UIColor, self)
                     DrawLeftText("[Ctrl]", xHelp, yHelp - Help_Interval * 3, Help_FontSize, UIColor, self)
-                    DrawLeftText("[" + context.scene.Key_Solver + "]",
-                                xHelp, yHelp - Help_Interval * 4, Help_FontSize, UIColor, self)
                     DrawLeftText(": Dimension", 150 + t_panel_width, yHelp, Help_FontSize, None, self)
-                    DrawLeftText(": Move all", 150 + t_panel_width, yHelp - Help_Interval, Help_FontSize, None, self)
+                    DrawLeftText(": Move all", 150 + t_panel_width, yHelp - Help_Interval,
+                                Help_FontSize, None, self)
                     DrawLeftText(": Validate", 150 + t_panel_width, yHelp -
                                  Help_Interval * 2, Help_FontSize, None, self)
                     DrawLeftText(": Incremental", 150 + t_panel_width, yHelp -
-                                 Help_Interval * 3, Help_FontSize, None, self)
-                    DrawLeftText(": Solver [" + context.scene.CarverSolver + "]",
-                                150 + t_panel_width, yHelp - Help_Interval * 4, Help_FontSize, None, self)
+                                Help_Interval * 3, Help_FontSize, None, self)
                     if self.CreateMode:
                         DrawLeftText("[" + context.scene.Key_Subadd + "]", xHelp, yHelp -
-                                     Help_Interval * 4, Help_FontSize, UIColor, self)
+                                    Help_Interval * 4, Help_FontSize, UIColor, self)
                         DrawLeftText(": Close geometry", 150 + t_panel_width, yHelp -
-                                     Help_Interval * 4, Help_FontSize, None, self)
+                                    Help_Interval * 4, Help_FontSize, None, self)
             else:
                 DrawLeftText("[Space]", xHelp, yHelp + Help_Interval, Help_FontSize, UIColor, self)
-                DrawLeftText(": Difference", 150 + t_panel_width, yHelp + Help_Interval, Help_FontSize, None, self)
+                DrawLeftText(": Difference", 150 + t_panel_width, yHelp + Help_Interval,
+                            Help_FontSize, None, self)
                 DrawLeftText("[Shift][Space]", xHelp, yHelp, Help_FontSize, UIColor, self)
                 DrawLeftText(": Rebool", 150 + t_panel_width, yHelp, Help_FontSize, None, self)
                 DrawLeftText("[Alt][Space]", xHelp, yHelp - Help_Interval, Help_FontSize, UIColor, self)
-                DrawLeftText(": Duplicate", 150 + t_panel_width, yHelp - Help_Interval, Help_FontSize, None, self)
+                DrawLeftText(": Duplicate", 150 + t_panel_width, yHelp - Help_Interval,
+                            Help_FontSize, None, self)
                 DrawLeftText("[" + context.scene.Key_Scale + "]", xHelp, yHelp -
-                             Help_Interval * 2, Help_FontSize, UIColor, self)
-                DrawLeftText(": Scale", 150 + t_panel_width, yHelp - Help_Interval * 2, Help_FontSize, None, self)
+                            Help_Interval * 2, Help_FontSize, UIColor, self)
+                DrawLeftText(": Scale", 150 + t_panel_width, yHelp - Help_Interval * 2,
+                            Help_FontSize, None, self)
                 DrawLeftText("[LMB][Move]", xHelp, yHelp - Help_Interval * 3, Help_FontSize, UIColor, self)
-                DrawLeftText(": Rotation", 150 + t_panel_width, yHelp - Help_Interval * 3, Help_FontSize, None, self)
-                DrawLeftText("[Ctrl][LMB][Move]", xHelp, yHelp - Help_Interval * 4, Help_FontSize, UIColor, self)
-                DrawLeftText(": Step Angle", 150 + t_panel_width, yHelp - Help_Interval * 4, Help_FontSize, None, self)
+                DrawLeftText(": Rotation", 150 + t_panel_width, yHelp - Help_Interval * 3,
+                            Help_FontSize, None, self)
+                DrawLeftText("[Ctrl][LMB][Move]", xHelp, yHelp - Help_Interval * 4,
+                            Help_FontSize, UIColor, self)
+                DrawLeftText(": Step Angle", 150 + t_panel_width, yHelp - Help_Interval * 4,
+                            Help_FontSize, None, self)
                 if self.ProfileMode:
                     DrawLeftText("[" + context.scene.Key_Subadd + "][" + context.scene.Key_Subrem + "]",
-                                 xHelp, yHelp - Help_Interval * 5, Help_FontSize, UIColor, self)
+                                xHelp, yHelp - Help_Interval * 5, Help_FontSize, UIColor, self)
                     DrawLeftText(": Previous or Next Profile", 150 + t_panel_width,
                                  yHelp - Help_Interval * 5, Help_FontSize, None, self)
                 DrawLeftText("[ARROWS]", xHelp, yHelp - Help_Interval * 6, Help_FontSize, UIColor, self)
                 DrawLeftText(": Create / Delete rows or columns", 150 + t_panel_width,
-                             yHelp - Help_Interval * 6, Help_FontSize, None, self)
+                            yHelp - Help_Interval * 6, Help_FontSize, None, self)
                 DrawLeftText("[" + context.scene.Key_Gapy + "][" + context.scene.Key_Gapx + "]",
                              xHelp, yHelp - Help_Interval * 7, Help_FontSize, UIColor, self)
                 DrawLeftText(": Gap between rows or columns", 150 + t_panel_width,
-                             yHelp - Help_Interval * 7, Help_FontSize, None, self)
-                DrawLeftText("[" + context.scene.Key_Solver + "]",
-                            xHelp, yHelp - Help_Interval * 8, Help_FontSize, UIColor, self)
-                DrawLeftText(": Solver [" + context.scene.CarverSolver + "]",
-                            150 + t_panel_width, yHelp - Help_Interval * 8, Help_FontSize, None, self)
+                            yHelp - Help_Interval * 7, Help_FontSize, None, self)
 
-    # Opengl Initialise
+    # Opengl Initialize
     bgl.glEnable(bgl.GL_BLEND)
     bgl.glColor4f(0.512, 0.919, 0.04, 1.0)
     bgl.glLineWidth(2)
 
-    # if context.space_data.region_3d.is_perspective is False:
-    if 1:
-        bgl.glEnable(bgl.GL_POINT_SMOOTH)
-
-        bgl.glPointSize(6)
+    bgl.glEnable(bgl.GL_POINT_SMOOTH)
+    bgl.glPointSize(6)
 
-        if self.ProfileMode:
-            xrect = region.width - t_panel_width - 80
-            yrect = 80
-            bgl.glColor4f(0.0, 0.0, 0.0, 0.3)
-            bgl.glRecti(xrect, yrect, xrect + 60, yrect - 60)
-
-            faces = self.Profils[self.nProfil][3]
-            vertices = self.Profils[self.nProfil][2]
-            WidthProfil = 50
-            location = mathutils.Vector((region.width - t_panel_width - WidthProfil, 50, 0))
-            ProfilScale = 20.0
-            bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 0.7)
-            for f in faces:
-                if len(f) == 4:
-                    bgl.glBegin(bgl.GL_QUADS)
-                    bgl.glVertex3f(vertices[f[0]][0] * ProfilScale + location.x, vertices[f[0]][1] *
-                                   ProfilScale + location.y, vertices[f[0]][2] * ProfilScale + location.z)
-                    bgl.glVertex3f(vertices[f[1]][0] * ProfilScale + location.x, vertices[f[1]][1] *
-                                   ProfilScale + location.y, vertices[f[1]][2] * ProfilScale + location.z)
-                    bgl.glVertex3f(vertices[f[2]][0] * ProfilScale + location.x, vertices[f[2]][1] *
-                                   ProfilScale + location.y, vertices[f[2]][2] * ProfilScale + location.z)
-                    bgl.glVertex3f(vertices[f[3]][0] * ProfilScale + location.x, vertices[f[3]][1] *
-                                   ProfilScale + location.y, vertices[f[3]][2] * ProfilScale + location.z)
-                    bgl.glEnd()
-                if len(f) == 3:
-                    bgl.glBegin(bgl.GL_TRIANGLES)
-                    bgl.glVertex3f(vertices[f[0]][0] * ProfilScale + location.x, vertices[f[0]][1] *
-                                   ProfilScale + location.y, vertices[f[0]][2] * ProfilScale + location.z)
-                    bgl.glVertex3f(vertices[f[1]][0] * ProfilScale + location.x, vertices[f[1]][1] *
-                                   ProfilScale + location.y, vertices[f[1]][2] * ProfilScale + location.z)
-                    bgl.glVertex3f(vertices[f[2]][0] * ProfilScale + location.x, vertices[f[2]][1] *
-                                   ProfilScale + location.y, vertices[f[2]][2] * ProfilScale + location.z)
-                    bgl.glEnd()
-
-        if self.bDone:
-            if len(self.mouse_path) > 1:
-                x0 = self.mouse_path[0][0]
-                y0 = self.mouse_path[0][1]
-                x1 = self.mouse_path[1][0]
-                y1 = self.mouse_path[1][1]
-
-            # Cut Line
-            if self.CutMode == LINE:
-                if (self.shift) or (self.CreateMode and self.Closed):
-                    bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 0.5)
-
-                    bgl.glBegin(bgl.GL_POLYGON)
-                    for x, y in self.mouse_path:
-                        bgl.glVertex2i(x + self.xpos, y + self.ypos)
-                    bgl.glEnd()
-
-                bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 1.0)
-                bgl.glBegin(bgl.GL_LINE_STRIP)
-                for x, y in self.mouse_path:
-                    bgl.glVertex2i(x + self.xpos, y + self.ypos)
+    if self.ProfileMode:
+        xrect = region.width - t_panel_width - 80
+        yrect = 80
+        bgl.glColor4f(0.0, 0.0, 0.0, 0.3)
+        bgl.glRecti(xrect, yrect, xrect + 60, yrect - 60)
+
+        faces = self.Profils[self.nProfil][3]
+        vertices = self.Profils[self.nProfil][2]
+        WidthProfil = 50
+        location = Vector((region.width - t_panel_width - WidthProfil, 50, 0))
+        ProfilScale = 20.0
+        bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 0.7)
+        for f in faces:
+            if len(f) == 4:
+                bgl.glBegin(bgl.GL_QUADS)
+                bgl.glVertex3f(vertices[f[0]][0] * ProfilScale + location.x, vertices[f[0]][1] *
+                               ProfilScale + location.y, vertices[f[0]][2] * ProfilScale + location.z)
+                bgl.glVertex3f(vertices[f[1]][0] * ProfilScale + location.x, vertices[f[1]][1] *
+                               ProfilScale + location.y, vertices[f[1]][2] * ProfilScale + location.z)
+                bgl.glVertex3f(vertices[f[2]][0] * ProfilScale + location.x, vertices[f[2]][1] *
+                               ProfilScale + location.y, vertices[f[2]][2] * ProfilScale + location.z)
+                bgl.glVertex3f(vertices[f[3]][0] * ProfilScale + location.x, vertices[f[3]][1] *
+                               ProfilScale + location.y, vertices[f[3]][2] * ProfilScale + location.z)
                 bgl.glEnd()
-                if (self.CreateMode is False) or (self.CreateMode and self.Closed):
-                    bgl.glBegin(bgl.GL_LINE_STRIP)
-                    bgl.glVertex2i(self.mouse_path[len(self.mouse_path) - 1][0] + self.xpos,
-                                   self.mouse_path[len(self.mouse_path) - 1][1] + self.ypos)
-                    bgl.glVertex2i(self.mouse_path[0][0] + self.xpos, self.mouse_path[0][1] + self.ypos)
-                    bgl.glEnd()
-
-                bgl.glPointSize(6)
-                bgl.glBegin(bgl.GL_POINTS)
-                for x, y in self.mouse_path:
-                    bgl.glVertex2i(x + self.xpos, y + self.ypos)
+            if len(f) == 3:
+                bgl.glBegin(bgl.GL_TRIANGLES)
+                bgl.glVertex3f(vertices[f[0]][0] * ProfilScale + location.x, vertices[f[0]][1] *
+                               ProfilScale + location.y, vertices[f[0]][2] * ProfilScale + location.z)
+                bgl.glVertex3f(vertices[f[1]][0] * ProfilScale + location.x, vertices[f[1]][1] *
+                               ProfilScale + location.y, vertices[f[1]][2] * ProfilScale + location.z)
+                bgl.glVertex3f(vertices[f[2]][0] * ProfilScale + location.x, vertices[f[2]][1] *
+                               ProfilScale + location.y, vertices[f[2]][2] * ProfilScale + location.z)
                 bgl.glEnd()
 
-            # Cut rectangle
-            if self.CutMode == RECTANGLE:
+    if self.bDone:
+        if len(self.mouse_path) > 1:
+            x0 = self.mouse_path[0][0]
+            y0 = self.mouse_path[0][1]
+            x1 = self.mouse_path[1][0]
+            y1 = self.mouse_path[1][1]
+
+        # Cut Line
+        if self.CutMode == LINE:
+            if (self.shift) or (self.CreateMode and self.Closed):
                 bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 0.5)
 
-                # if SHIFT, fill primitive
-                if self.shift or self.CreateMode:
-                    bgl.glBegin(bgl.GL_QUADS)
-                    bgl.glVertex2i(x0 + self.xpos, y0 + self.ypos)
-                    bgl.glVertex2i(x1 + self.xpos, y0 + self.ypos)
-                    bgl.glVertex2i(x1 + self.xpos, y1 + self.ypos)
-                    bgl.glVertex2i(x0 + self.xpos, y1 + self.ypos)
-                    bgl.glEnd()
+                bgl.glBegin(bgl.GL_POLYGON)
+                for x, y in self.mouse_path:
+                    bgl.glVertex2i(x + self.xpos, y + self.ypos)
+                bgl.glEnd()
 
+            bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 1.0)
+            bgl.glBegin(bgl.GL_LINE_STRIP)
+            for x, y in self.mouse_path:
+                bgl.glVertex2i(x + self.xpos, y + self.ypos)
+            bgl.glEnd()
+            if (self.CreateMode is False) or (self.CreateMode and self.Closed):
                 bgl.glBegin(bgl.GL_LINE_STRIP)
-                bgl.glVertex2i(x0 + self.xpos, y0 + self.ypos)
-                bgl.glVertex2i(x1 + self.xpos, y0 + self.ypos)
-                bgl.glVertex2i(x1 + self.xpos, y1 + self.ypos)
-                bgl.glVertex2i(x0 + self.xpos, y1 + self.ypos)
-                bgl.glVertex2i(x0 + self.xpos, y0 + self.ypos)
+                bgl.glVertex2i(self.mouse_path[len(self.mouse_path) - 1][0] + self.xpos,
+                               self.mouse_path[len(self.mouse_path) - 1][1] + self.ypos)
+                bgl.glVertex2i(self.mouse_path[0][0] + self.xpos, self.mouse_path[0][1] + self.ypos)
                 bgl.glEnd()
-                bgl.glPointSize(6)
 
-                bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 1.0)
-                bgl.glBegin(bgl.GL_POINTS)
+            bgl.glPointSize(6)
+            bgl.glBegin(bgl.GL_POINTS)
+            for x, y in self.mouse_path:
+                bgl.glVertex2i(x + self.xpos, y + self.ypos)
+            bgl.glEnd()
+
+        # Cut rectangle
+        if self.CutMode == RECTANGLE:
+            bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 0.5)
+
+            # if SHIFT, fill primitive
+            if self.shift or self.CreateMode:
+                bgl.glBegin(bgl.GL_QUADS)
                 bgl.glVertex2i(x0 + self.xpos, y0 + self.ypos)
                 bgl.glVertex2i(x1 + self.xpos, y0 + self.ypos)
                 bgl.glVertex2i(x1 + self.xpos, y1 + self.ypos)
                 bgl.glVertex2i(x0 + self.xpos, y1 + self.ypos)
                 bgl.glEnd()
 
-            # Circle Cut
-            if self.CutMode == CIRCLE:
-                DEG2RAD = 3.14159 / 180
-                v0 = mathutils.Vector((self.mouse_path[0][0], self.mouse_path[0][1], 0))
-                v1 = mathutils.Vector((self.mouse_path[1][0], self.mouse_path[1][1], 0))
-                v0 -= v1
-                radius = self.mouse_path[1][0] - self.mouse_path[0][0]
-                DEG2RAD = 3.14159 / (180.0 / self.stepAngle[self.step])
-                if self.ctrl:
-                    self.stepR = (self.mouse_path[1][1] - self.mouse_path[0][1]) / 25
-                    shift = (3.14159 / (360.0 / 60.0)) * int(self.stepR)
-                else:
-                    shift = (self.mouse_path[1][1] - self.mouse_path[0][1]) / 50
-
-                if self.shift or self.CreateMode:
-                    bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 0.5)
-                    bgl.glBegin(bgl.GL_TRIANGLE_FAN)
-                    bgl.glVertex2f(x0 + self.xpos, y0 + self.ypos)
-                    for i in range(0, int(360 / self.stepAngle[self.step])):
-                        degInRad = i * DEG2RAD
-                        bgl.glVertex2f(x0 + self.xpos + math.cos(degInRad + shift) * radius,
-                                       y0 + self.ypos + math.sin(degInRad + shift) * radius)
-                    bgl.glVertex2f(x0 + self.xpos + math.cos(0 + shift) * radius,
-                                   y0 + self.ypos + math.sin(0 + shift) * radius)
-                    bgl.glEnd()
-
-                bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 1.0)
-                bgl.glBegin(bgl.GL_LINE_LOOP)
+            bgl.glBegin(bgl.GL_LINE_STRIP)
+            bgl.glVertex2i(x0 + self.xpos, y0 + self.ypos)
+            bgl.glVertex2i(x1 + self.xpos, y0 + self.ypos)
+            bgl.glVertex2i(x1 + self.xpos, y1 + self.ypos)
+            bgl.glVertex2i(x0 + self.xpos, y1 + self.ypos)
+            bgl.glVertex2i(x0 + self.xpos, y0 + self.ypos)
+            bgl.glEnd()
+            bgl.glPointSize(6)
+
+            bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 1.0)
+            bgl.glBegin(bgl.GL_POINTS)
+            bgl.glVertex2i(x0 + self.xpos, y0 + self.ypos)
+            bgl.glVertex2i(x1 + self.xpos, y0 + self.ypos)
+            bgl.glVertex2i(x1 + self.xpos, y1 + self.ypos)
+            bgl.glVertex2i(x0 + self.xpos, y1 + self.ypos)
+            bgl.glEnd()
+
+        # Circle Cut
+        if self.CutMode == CIRCLE:
+            DEG2RAD = 3.14159 / 180
+            v0 = Vector((self.mouse_path[0][0], self.mouse_path[0][1], 0))
+            v1 = Vector((self.mouse_path[1][0], self.mouse_path[1][1], 0))
+            v0 -= v1
+            radius = self.mouse_path[1][0] - self.mouse_path[0][0]
+            DEG2RAD = 3.14159 / (180.0 / self.stepAngle[self.step])
+            if self.ctrl:
+                self.stepR = (self.mouse_path[1][1] - self.mouse_path[0][1]) / 25
+                shift = (3.14159 / (360.0 / 60.0)) * int(self.stepR)
+            else:
+                shift = (self.mouse_path[1][1] - self.mouse_path[0][1]) / 50
+
+            if self.shift or self.CreateMode:
+                bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 0.5)
+                bgl.glBegin(bgl.GL_TRIANGLE_FAN)
+                bgl.glVertex2f(x0 + self.xpos, y0 + self.ypos)
                 for i in range(0, int(360 / self.stepAngle[self.step])):
                     degInRad = i * DEG2RAD
                     bgl.glVertex2f(x0 + self.xpos + math.cos(degInRad + shift) * radius,
                                    y0 + self.ypos + math.sin(degInRad + shift) * radius)
+                bgl.glVertex2f(x0 + self.xpos + math.cos(0 + shift) * radius,
+                               y0 + self.ypos + math.sin(0 + shift) * radius)
                 bgl.glEnd()
 
+            bgl.glColor4f(UIColor[0], UIColor[1], UIColor[2], 1.0)
+            bgl.glBegin(bgl.GL_LINE_LOOP)
+            for i in range(0, int(360 / self.stepAngle[self.step])):
+                degInRad = i * DEG2RAD
+                bgl.glVertex2f(x0 + self.xpos + math.cos(degInRad + shift) * radius,
+                               y0 + self.ypos + math.sin(degInRad + shift) * radius)
+            bgl.glEnd()
+
     if self.ObjectMode or self.ProfileMode:
         if self.ShowCursor:
             region = context.region
             rv3d = context.space_data.region_3d
-            view_width = context.region.width
 
             if self.ObjectMode:
                 ob = self.ObjectBrush
@@ -1233,7 +1187,7 @@ def draw_callback_px(self, context):
             # 50% alpha, 2 pixel width line
             bgl.glEnable(bgl.GL_BLEND)
 
-            bbox = [mat * mathutils.Vector(b) for b in ob.bound_box]
+            bbox = [mat * Vector(b) for b in ob.bound_box]
 
             if self.shift:
                 bgl.glLineWidth(4)
@@ -1260,12 +1214,12 @@ def draw_callback_px(self, context):
             # Object display
             if self.qRot is not None:
                 ob.location = self.CurLoc
-                v = mathutils.Vector()
+                v = Vector()
                 v.x = v.y = 0.0
                 v.z = self.BrushDepthOffset
                 ob.location += self.qRot * v
 
-                e = mathutils.Euler()
+                e = Euler()
                 e.x = 0.0
                 e.y = 0.0
                 e.z = self.aRotZ / 25.0
@@ -1319,10 +1273,10 @@ def isect_line_plane_v3(p0, p1, p_co, p_no, epsilon=1e-6):
         # The segment is parallel to plane
         return None
 
+
 # ----------------------
 # generic math functions
 
-
 def add_v3v3(v0, v1):
     return (
         v0[0] + v1[0],
@@ -1358,21 +1312,19 @@ def mul_v3_fl(v0, f):
         v0[2] * f,
     )
 
-# Cut Square
-
 
+# Cut Square
 def CreateCutSquare(self, context):
     FAR_LIMIT = 10000.0
 
     # New mesh
     me = bpy.data.meshes.new('CMT_Square')
-
     # New object
     ob = bpy.data.objects.new('CMT_Square', me)
     # Save new object
     self.CurrentObj = ob
-    # Scene informations
-    scene = context.scene
+
+    # Scene information
     region = context.region
     rv3d = context.region_data
     coord = self.mouse_path[0][0], self.mouse_path[0][1]
@@ -1382,14 +1334,10 @@ def CreateCutSquare(self, context):
     if self.snapCursor:
         PlanePoint = context.scene.cursor_location
     else:
-        if self.OpsObj is not None:
-            PlanePoint = self.OpsObj.location
-        else:
-            PlanePoint = mathutils.Vector((0.0, 0.0, 0.0))
+        PlanePoint = self.OpsObj.location if self.OpsObj is not None else Vector((0.0, 0.0, 0.0))
 
     PlaneNormal = depthLocation
     PlaneNormalised = PlaneNormal.normalized()
-    d = -PlanePoint.x * PlaneNormalised.x - PlanePoint.y * PlaneNormalised.y - PlanePoint.z * PlaneNormalised.z
 
     # Link object to scene
     context.scene.objects.link(ob)
@@ -1448,20 +1396,15 @@ def CreateCutLine(self, context):
     ob = bpy.data.objects.new('CMT_Line', me)
     self.CurrentObj = ob
 
-    scene = context.scene
     region = context.region
     rv3d = context.region_data
     coord = self.mouse_path[0][0], self.mouse_path[0][1]
     depthLocation = region_2d_to_vector_3d(region, rv3d, coord)
     self.ViewVector = depthLocation
-    if self.snapCursor:
-        PlanePoint = context.scene.cursor_location
-    else:
-        PlanePoint = mathutils.Vector((0.0, 0.0, 0.0))
 
+    PlanePoint = context.scene.cursor_location if self.snapCursor else Vector((0.0, 0.0, 0.0))
     PlaneNormal = depthLocation
     PlaneNormalised = PlaneNormal.normalized()
-    d = -PlanePoint.x * PlaneNormalised.x - PlanePoint.y * PlaneNormalised.y - PlanePoint.z * PlaneNormalised.z
 
     context.scene.objects.link(ob)
 
@@ -1473,8 +1416,9 @@ def CreateCutLine(self, context):
 
     bLine = False
 
-    if (len(self.mouse_path) == 2) or ((len(self.mouse_path) <= 3) and (self.mouse_path[1] == self.mouse_path[2])):
-        PlanePoint = mathutils.Vector((0.0, 0.0, 0.0))
+    if (len(self.mouse_path) == 2) or ((len(self.mouse_path) <= 3) and
+            (self.mouse_path[1] == self.mouse_path[2])):
+        PlanePoint = Vector((0.0, 0.0, 0.0))
         PlaneNormal = depthLocation
         PlaneNormalised = PlaneNormal.normalized()
         # Force rebool
@@ -1496,7 +1440,6 @@ def CreateCutLine(self, context):
                 Index += 1
                 if NbVertices == 1:
                     t_v0 = t_bm.verts.new(loc0)
-                    t_init = t_v0
                     LocInit = loc0
                     t_bm.verts.index_update()
                 else:
@@ -1504,7 +1447,6 @@ def CreateCutLine(self, context):
                     t_edges = t_bm.edges.new([t_v0, t_v1])
                     NbVertices = 1
                     t_v0 = t_v1
-
     else:
         for x, y in self.mouse_path:
             v0 = x + self.xpos, y + self.ypos
@@ -1518,7 +1460,6 @@ def CreateCutLine(self, context):
             NbVertices += 1
             if NbVertices == 1:
                 t_v0 = t_bm.verts.new(loc0)
-                t_init = t_v0
                 LocInit = loc0
                 t_bm.verts.index_update()
                 FacesList.append(t_v0)
@@ -1554,20 +1495,15 @@ def CreateCutCircle(self, context):
     ob = bpy.data.objects.new('CMT_Circle', me)
     self.CurrentObj = ob
 
-    scene = context.scene
     region = context.region
     rv3d = context.region_data
     coord = self.mouse_path[0][0], self.mouse_path[0][1]
     depthLocation = region_2d_to_vector_3d(region, rv3d, coord)
     self.ViewVector = depthLocation
-    if self.snapCursor:
-        PlanePoint = context.scene.cursor_location
-    else:
-        PlanePoint = mathutils.Vector((0.0, 0.0, 0.0))
 
+    PlanePoint = context.scene.cursor_location if self.snapCursor else Vector((0.0, 0.0, 0.0))
     PlaneNormal = depthLocation
     PlaneNormalised = PlaneNormal.normalized()
-    d = -PlanePoint.x * PlaneNormalised.x - PlanePoint.y * PlaneNormalised.y - PlanePoint.z * PlaneNormalised.z
 
     context.scene.objects.link(ob)
 
@@ -1576,11 +1512,9 @@ def CreateCutCircle(self, context):
 
     x0 = self.mouse_path[0][0]
     y0 = self.mouse_path[0][1]
-    x1 = self.mouse_path[1][0]
-    y1 = self.mouse_path[1][1]
 
-    v0 = mathutils.Vector((self.mouse_path[0][0], self.mouse_path[0][1], 0))
-    v1 = mathutils.Vector((self.mouse_path[1][0], self.mouse_path[1][1], 0))
+    v0 = Vector((self.mouse_path[0][0], self.mouse_path[0][1], 0))
+    v1 = Vector((self.mouse_path[1][0], self.mouse_path[1][1], 0))
     v0 -= v1
     radius = self.mouse_path[1][0] - self.mouse_path[0][0]
     DEG2RAD = math.pi / (180.0 / self.stepAngle[self.step])
@@ -1594,7 +1528,8 @@ def CreateCutCircle(self, context):
     FacesList = []
     for i in range(0, int(360.0 / self.stepAngle[self.step])):
         degInRad = i * DEG2RAD
-        v0 = x0 + self.xpos + math.cos(degInRad + shift) * radius, y0 + self.ypos + math.sin(degInRad + shift) * radius
+        v0 = x0 + self.xpos + math.cos(degInRad + shift) * radius, \
+                y0 + self.ypos + math.sin(degInRad + shift) * radius
         vec = region_2d_to_vector_3d(region, rv3d, v0)
         loc0 = region_2d_to_location_3d(region, rv3d, v0, vec)
 
@@ -1607,7 +1542,6 @@ def CreateCutCircle(self, context):
         FacesList.append(t_v0)
 
     t_bm.verts.index_update()
-
     t_face = t_bm.faces.new(FacesList)
 
     t_bm.to_mesh(me)
@@ -1699,9 +1633,8 @@ def update_bevel(context):
         obj.select = True
     context.scene.objects.active = active
 
-# Create bevel
-
 
+# Create bevel
 def CreateBevel(context, CurrentObject):
     # Save active object
     SavActive = context.active_object
@@ -1752,7 +1685,7 @@ def CreateBevel(context, CurrentObject):
     context.object.data.use_auto_smooth = True
     context.object.data.auto_smooth_angle = 1.0471975
 
-    # Remet l'objet actif par défaut
+    # Restore the active object
     context.scene.objects.active = SavActive
 
 
@@ -1767,7 +1700,6 @@ def Picking(context, event):
     # get the ray from the viewport and mouse
     view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
     ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
-
     ray_target = ray_origin + view_vector
 
     def visible_objects_and_duplis():
@@ -1794,8 +1726,7 @@ def Picking(context, event):
         success, location, normal, face_index = obj.ray_cast(ray_origin_obj, ray_direction_obj)
         if success:
             return location, normal, face_index
-        else:
-            return None, None, None
+        return None, None, None
 
     # cast rays and find the closest object
     best_length_squared = -1.0
@@ -1820,7 +1751,6 @@ def Picking(context, event):
 
 
 def CreatePrimitive(self, _AngleStep, _radius):
-    CLRaw = []
     Angle = 0.0
     self.NbPointsInPrimitive = 0
     while(Angle < 360.0):
@@ -1838,7 +1768,7 @@ def CreatePrimitive(self, _AngleStep, _radius):
 def MoveCursor(qRot, location, self):
     if qRot is not None:
         self.CLR_C.clear()
-        vc = mathutils.Vector()
+        vc = Vector()
         idx = 0
         for i in range(int(len(self.CircleListRaw) / 3)):
             vc.x = self.CircleListRaw[idx * 3] * self.CRadius
@@ -1855,12 +1785,12 @@ def RBenVe(Object, Dir):
     ObjectV = Object.normalized()
     DirV = Dir.normalized()
     cosTheta = ObjectV.dot(DirV)
-    rotationAxis = mathutils.Vector((0.0, 0.0, 0.0))
+    rotationAxis = Vector((0.0, 0.0, 0.0))
     if (cosTheta < -1 + 0.001):
-        v = mathutils.Vector((0.0, 1.0, 0.0))
+        v = Vector((0.0, 1.0, 0.0))
         rotationAxis = ObjectV.cross(v)
         rotationAxis = rotationAxis.normalized()
-        q = mathutils.Quaternion()
+        q = Quaternion()
         q.w = 0.0
         q.x = rotationAxis.x
         q.y = rotationAxis.y
@@ -1869,7 +1799,7 @@ def RBenVe(Object, Dir):
     rotationAxis = ObjectV.cross(DirV)
     s = math.sqrt((1.0 + cosTheta) * 2.0)
     invs = 1 / s
-    q = mathutils.Quaternion()
+    q = Quaternion()
     q.w = s * 0.5
     q.x = rotationAxis.x * invs
     q.y = rotationAxis.y * invs
@@ -1878,7 +1808,6 @@ def RBenVe(Object, Dir):
 
 
 def Pick(context, event, self, ray_max=10000.0):
-    scene = context.scene
     region = context.region
     rv3d = context.region_data
     coord = event.mouse_region_x, event.mouse_region_y
@@ -1893,8 +1822,7 @@ def Pick(context, event, self, ray_max=10000.0):
         success, hit, normal, face_index = obj.ray_cast(ray_origin_obj, ray_target_obj)
         if success:
             return hit, normal, face_index
-        else:
-            return None, None, None
+        return None, None, None
 
     best_length_squared = ray_max * ray_max
     best_obj = None
@@ -1914,8 +1842,8 @@ def Pick(context, event, self, ray_max=10000.0):
 
     if best_obj is not None:
         return hits, ns, fs, rotation
-    else:
-        return None, None, None
+
+    return None, None, None
 
 
 def SelectObject(self, copyobj):
@@ -1939,7 +1867,7 @@ def UndoAdd(self, type, OpsObj):
         return
     if type != "DUPLICATE":
         ob = OpsObj
-        # Creation du mesh de 'sauvegarde'
+        # Create the 'backup' mesh
         bm = bmesh.new()
         bm.from_mesh(ob.data)
 
@@ -2011,7 +1939,7 @@ def duplicateObject(self):
     ob_new = bpy.context.active_object
 
     ob_new.location = self.CurLoc
-    v = mathutils.Vector()
+    v = Vector()
     v.x = v.y = 0.0
     v.z = self.BrushDepthOffset
     ob_new.location += self.qRot * v
@@ -2021,7 +1949,7 @@ def duplicateObject(self):
     if self.ProfileMode:
         ob_new.scale = self.ProfileBrush.scale
 
-    e = mathutils.Euler()
+    e = Euler()
     e.x = e.y = 0.0
     e.z = self.aRotZ / 25.0
 
@@ -2075,7 +2003,10 @@ def update_grid(self, context):
 
     # Get the data from the profils or the object
     if self.ProfileMode:
-        brush = bpy.data.objects.new(self.Profils[self.nProfil][0], bpy.data.meshes[self.Profils[self.nProfil][0]])
+        brush = bpy.data.objects.new(
+                    self.Profils[self.nProfil][0],
+                    bpy.data.meshes[self.Profils[self.nProfil][0]]
+                    )
         obj = bpy.data.objects["CT_Profil"]
         obfaces = brush.data.polygons
         obverts = brush.data.vertices
@@ -2107,7 +2038,7 @@ def update_grid(self, context):
 
         # Add random rotation
         if (self.RandomRotation) and not (self.GridScaleX or self.GridScaleY):
-            rotmat = mathutils.Matrix.Rotation(math.radians(360 * random.random()), 4, 'Z')
+            rotmat = Matrix.Rotation(math.radians(360 * random.random()), 4, 'Z')
             for v in obverts:
                 v.co = v.co * rotmat
 
@@ -2124,47 +2055,25 @@ def update_grid(self, context):
     mymesh.update(calc_edges=True)
     # Update data
     obj.data = mymesh
-    # Make the the object the active one to remove double
+    # Make the object active to remove doubles
     context.scene.objects.active = obj
 
 
-def boolean_difference():
+def boolean_operation(bool_type="DIFFERENCE"):
     ActiveObj = bpy.context.active_object
+    sel_index = 0 if bpy.context.selected_objects[0] != bpy.context.active_object else 1
 
-    if bpy.context.selected_objects[0] != bpy.context.active_object:
-        bpy.ops.object.modifier_apply(apply_as='DATA', modifier="CT_SOLIDIFY")
-        BoolMod = ActiveObj.modifiers.new("CT_" + bpy.context.selected_objects[0].name, "BOOLEAN")
-        BoolMod.object = bpy.context.selected_objects[0]
-        BoolMod.operation = "DIFFERENCE"
-        BoolMod.solver = bpy.context.scene.CarverSolver
-        bpy.context.selected_objects[0].draw_type = 'WIRE'
-    else:
-        BoolMod = ActiveObj.modifiers.new("CT_" + bpy.context.selected_objects[1].name, "BOOLEAN")
-        BoolMod.object = bpy.context.selected_objects[1]
-        BoolMod.operation = "DIFFERENCE"
-        BoolMod.solver = bpy.context.scene.CarverSolver
-        bpy.context.selected_objects[1].draw_type = 'WIRE'
-
-
-def boolean_union():
-    ActiveObj = bpy.context.active_object
-
-    if bpy.context.selected_objects[0] != bpy.context.active_object:
-        BoolMod = ActiveObj.modifiers.new("CT_" + bpy.context.selected_objects[0].name, "BOOLEAN")
-        BoolMod.object = bpy.context.selected_objects[0]
-        BoolMod.operation = "UNION"
-        bpy.context.selected_objects[0].draw_type = 'WIRE'
-    else:
-        BoolMod = ActiveObj.modifiers.new("CT_" + bpy.context.selected_objects[1].name, "BOOLEAN")
-        BoolMod.object = bpy.context.selected_objects[1]
-        BoolMod.operation = "UNION"
-        bpy.context.selected_objects[1].draw_type = 'WIRE'
+    bpy.ops.object.modifier_apply(apply_as='DATA', modifier="CT_SOLIDIFY")
+    BoolMod = ActiveObj.modifiers.new(
+                    "CT_" + bpy.context.selected_objects[sel_index].name,
+                    "BOOLEAN"
+                    )
+    BoolMod.object = bpy.context.selected_objects[sel_index]
+    BoolMod.operation = bool_type
+    bpy.context.selected_objects[sel_index].draw_type = 'WIRE'
 
 
 def Rebool(context, self):
-    SelObj_Name = []
-    BoolObj = []
-
     LastObj = context.active_object
 
     Brush = context.selected_objects[0]
@@ -2204,12 +2113,10 @@ def Rebool(context, self):
 
     m = LastObjectCreated.modifiers.new("CT_INTERSECT", "BOOLEAN")
     m.operation = "INTERSECT"
-    m.solver = context.scene.CarverSolver
     m.object = Brush
 
     m = obj.modifiers.new("CT_DIFFERENCE", "BOOLEAN")
     m.operation = "DIFFERENCE"
-    m.solver = context.scene.CarverSolver
     m.object = Brush
 
     for mb in LastObj.modifiers:
@@ -2262,14 +2169,14 @@ def createMeshFromData(self):
 
     if "CT_Profil" not in bpy.data.objects:
         ob = bpy.data.objects.new("CT_Profil", bpy.data.meshes[self.Profils[self.nProfil][0]])
-        ob.location = mathutils.Vector((0.0, 0.0, 0.0))
+        ob.location = Vector((0.0, 0.0, 0.0))
 
         # Link object to scene and make active
         scn = bpy.context.scene
         scn.objects.link(ob)
         scn.objects.active = ob
         ob.select = True
-        ob.location = mathutils.Vector((10000.0, 0.0, 0.0))
+        ob.location = Vector((10000.0, 0.0, 0.0))
         ob.draw_type = "WIRE"
 
         self.SolidifyPossible = True
@@ -2277,25 +2184,38 @@ def createMeshFromData(self):
         bpy.data.objects["CT_Profil"].data = bpy.data.meshes[self.Profils[self.nProfil][0]]
 
 
+def Selection_Save_Restore(self):
+    if "CT_Profil" in bpy.data.objects:
+        Selection_Save(self)
+        bpy.ops.object.select_all(action='DESELECT')
+        bpy.data.objects["CT_Profil"].select = True
+        bpy.context.scene.objects.active = bpy.data.objects["CT_Profil"]
+        if bpy.data.objects["CT_Profil"] in self.SavSel:
+            self.SavSel.remove(bpy.data.objects["CT_Profil"])
+        bpy.ops.object.delete(use_global=False)
+        Selection_Restore(self)
+
+
 def Selection_Save(self):
+    obj_name = getattr(bpy.context.active_object, "name", None)
     self.SavSel = bpy.context.selected_objects.copy()
-    self.Sav_ac = bpy.context.active_object
+    self.Sav_ac = obj_name
 
 
 def Selection_Restore(self):
     for o in self.SavSel:
         o.select = True
-    bpy.context.scene.objects.active = self.Sav_ac
+    if self.Sav_ac:
+        bpy.context.scene.objects.active = bpy.data.objects.get(self.Sav_ac, None)
 
 
 # Modal Operator
 class Carver(bpy.types.Operator):
     bl_idname = "object.carver"
     bl_label = "Carver"
-    bl_description = "Cut or create in object mode"
+    bl_description = "Cut or create Meshes in Object mode"
     bl_options = {'REGISTER', 'UNDO'}
 
-    # --------------------------------------------------------------------------------------------------
     @classmethod
     def poll(cls, context):
         ob = None
@@ -2306,14 +2226,12 @@ class Carver(bpy.types.Operator):
             (ob and ob.type == 'MESH' and context.mode == 'OBJECT') or
             (context.mode == 'OBJECT' and ob is None) or
             (context.mode == 'EDIT_MESH'))
-    # --------------------------------------------------------------------------------------------------
 
-    # --------------------------------------------------------------------------------------------------
     def modal(self, context, event):
         PI = 3.14156
-
         region_types = {'WINDOW', 'UI'}
         win = context.window
+
         for area in win.screen.areas:
             if area.type in ('VIEW_3D'):
                 for region in area.regions:
@@ -2327,14 +2245,10 @@ class Carver(bpy.types.Operator):
             return {'PASS_THROUGH'}
         try:
             # [Shift]
-            self.shift = False
-            if event.shift:
-                self.shift = True
+            self.shift = True if event.shift else False
 
             # [Ctrl]
-            self.ctrl = False
-            if event.ctrl:
-                self.ctrl = True
+            self.ctrl = True if event.ctrl else False
 
             # [Alt]
             self.alt = False
@@ -2349,7 +2263,7 @@ class Carver(bpy.types.Operator):
                 self.alt = True
             # [Alt] release
             if self.InitPosition and self.alt is False:
-                # Update coordonnee
+                # Update coordinates
                 for i in range(0, len(self.mouse_path)):
                     l = list(self.mouse_path[i])
                     l[0] += self.xpos
@@ -2417,15 +2331,14 @@ class Carver(bpy.types.Operator):
                                 self.CreateGeometry()
                                 bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                                 # Cursor Snap
-                                context.scene.DepthCursor = self.snapCursor
+                                context.scene.mesh_carver.DepthCursor = self.snapCursor
                                 # Object Instantiate
-                                context.scene.OInstanciate = self.Instantiate
+                                context.scene.mesh_carver.OInstanciate = self.Instantiate
                                 # Random rotation
-                                context.scene.ORandom = self.RandomRotation
+                                context.scene.mesh_carver.ORandom = self.RandomRotation
 
                                 return {'FINISHED'}
                             else:
-                                # Cut
                                 self.Cut()
                                 UndoListUpdate(self)
 
@@ -2459,28 +2372,13 @@ class Carver(bpy.types.Operator):
                             self.BrushSolidify = False
                             self.CList = self.OB_List
 
-                            if "CT_Profil" in bpy.data.objects:
-                                Selection_Save(self)
-                                bpy.ops.object.select_all(action='DESELECT')
-                                bpy.data.objects["CT_Profil"].select = True
-                                context.scene.objects.active = bpy.data.objects["CT_Profil"]
-                                bpy.ops.object.delete(use_global=False)
-                                Selection_Restore(self)
-
-                            context.scene.nProfile = self.nProfil
-
+                            Selection_Save_Restore(self)
+                            context.scene.mesh_carver.nProfile = self.nProfil
                         else:
                             self.ObjectMode = False
                     else:
                         self.BrushSolidify = False
-
-                        if "CT_Profil" in bpy.data.objects:
-                            Selection_Save(self)
-                            bpy.ops.object.select_all(action='DESELECT')
-                            bpy.data.objects["CT_Profil"].select = True
-                            context.scene.objects.active = bpy.data.objects["CT_Profil"]
-                            bpy.ops.object.delete(use_global=False)
-                            Selection_Restore(self)
+                        Selection_Save_Restore(self)
 
                 if self.ProfileMode:
                     createMeshFromData(self)
@@ -2496,7 +2394,6 @@ class Carver(bpy.types.Operator):
 
                     bpy.ops.object.modifier_add(type='SOLIDIFY')
                     context.object.modifiers["Solidify"].name = "CT_SOLIDIFY"
-
                     context.object.modifiers["CT_SOLIDIFY"].thickness = 0.1
 
                     Selection_Restore(self)
@@ -2525,7 +2422,6 @@ class Carver(bpy.types.Operator):
 
                                 Selection_Restore(self)
                         else:
-
                             if self.Solidify_Active_Start:
                                 Selection_Save(self)
                                 self.BrushSolidify = True
@@ -2556,12 +2452,6 @@ class Carver(bpy.types.Operator):
             if event.type == context.scene.Key_Apply and event.value == 'PRESS':
                 self.DontApply = not self.DontApply
 
-            if event.type == context.scene.Key_Solver and event.value == 'PRESS':
-                if context.scene.CarverSolver == "CARVE":
-                    context.scene.CarverSolver = "BMESH"
-                else:
-                    context.scene.CarverSolver = "CARVE"
-
             # Scale object
             if event.type == context.scene.Key_Scale and event.value == 'PRESS':
                 if self.ObjectScale is False:
@@ -2731,7 +2621,6 @@ class Carver(bpy.types.Operator):
                                     self.ProfileBrush.scale.x -= float(self.ascale) / 150.0
                                     self.ProfileBrush.scale.y -= float(self.ascale) / 150.0
                                     self.ProfileBrush.scale.z -= float(self.ascale) / 150.0
-
                         else:
                             if self.LMB:
                                 if self.ctrl:
@@ -2746,10 +2635,9 @@ class Carver(bpy.types.Operator):
                                 vBack = Pick(context, event, self)
                                 if vBack[0] is not None:
                                     self.ShowCursor = True
-                                    NormalObject = mathutils.Vector((0.0, 0.0, 1.0))
+                                    NormalObject = Vector((0.0, 0.0, 1.0))
                                     qR = RBenVe(NormalObject, vBack[1])
                                     self.qRot = vBack[3] * qR
-                                    Pos = vBack[0]
                                     MoveCursor(qR, vBack[0], self)
                                     self.SavCurLoc = vBack[0]
                                     if self.ctrl:
@@ -2758,13 +2646,13 @@ class Carver(bpy.types.Operator):
                                             yEcart = abs(self.SavMousePos.y - self.SavCurLoc.y)
                                             zEcart = abs(self.SavMousePos.z - self.SavCurLoc.z)
                                             if (xEcart > yEcart) and (xEcart > zEcart):
-                                                self.CurLoc = mathutils.Vector(
+                                                self.CurLoc = Vector(
                                                     (vBack[0].x, self.SavMousePos.y, self.SavMousePos.z))
                                             if (yEcart > xEcart) and (yEcart > zEcart):
-                                                self.CurLoc = mathutils.Vector(
+                                                self.CurLoc = Vector(
                                                     (self.SavMousePos.x, vBack[0].y, self.SavMousePos.z))
                                             if (zEcart > xEcart) and (zEcart > yEcart):
-                                                self.CurLoc = mathutils.Vector(
+                                                self.CurLoc = Vector(
                                                     (self.SavMousePos.x, self.SavMousePos.y, vBack[0].z))
                                             else:
                                                 self.CurLoc = vBack[0]
@@ -2807,7 +2695,7 @@ class Carver(bpy.types.Operator):
                     if self.LMB is False:
                         vBack = Pick(context, event, self)
                         if vBack[0] is not None:
-                            NormalObject = mathutils.Vector((0.0, 0.0, 1.0))
+                            NormalObject = Vector((0.0, 0.0, 1.0))
                             self.aqR = RBenVe(NormalObject, vBack[1])
                             self.qRot = vBack[3] * self.aqR
                         self.am = event.mouse_region_x, event.mouse_region_y
@@ -2871,13 +2759,13 @@ class Carver(bpy.types.Operator):
                                 self.CreateGeometry()
                                 bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                                 # Depth Cursor
-                                context.scene.DepthCursor = self.snapCursor
+                                context.scene.mesh_carver.DepthCursor = self.snapCursor
                                 # Instantiate object
-                                context.scene.OInstanciate = self.Instantiate
+                                context.scene.mesh_carver.OInstanciate = self.Instantiate
                                 # Random rotation
-                                context.scene.ORandom = self.RandomRotation
+                                context.scene.mesh_carver.ORandom = self.RandomRotation
                                 # Apply operation
-                                context.scene.DontApply = self.DontApply
+                                context.scene.mesh_carver.DontApply = self.DontApply
 
                                 # if Object mode, set intiale state
                                 if self.ObjectBrush is not None:
@@ -2900,14 +2788,12 @@ class Carver(bpy.types.Operator):
 
                                     Selection_Restore(self)
 
-                                    context.scene.nProfile = self.nProfil
+                                    context.scene.mesh_carver.nProfile = self.nProfil
 
                                 return {'FINISHED'}
                             else:
-                                # Cut
                                 self.Cut()
                                 UndoListUpdate(self)
-
                         else:
                             # Line
                             self.mouse_path.append((event.mouse_region_x, event.mouse_region_y))
@@ -2941,17 +2827,16 @@ class Carver(bpy.types.Operator):
                     else:
                         if self.step > 0:
                             self.step -= 1
-
             # Quit
             elif event.type in {'RIGHTMOUSE', 'ESC'}:
                 # Depth Cursor
-                context.scene.DepthCursor = self.snapCursor
+                context.scene.mesh_carver.DepthCursor = self.snapCursor
                 # Instantiate object
-                context.scene.OInstanciate = self.Instantiate
+                context.scene.mesh_carver.OInstanciate = self.Instantiate
                 # Random Rotation
-                context.scene.ORandom = self.RandomRotation
+                context.scene.mesh_carver.ORandom = self.RandomRotation
                 # Apply boolean operation
-                context.scene.DontApply = self.DontApply
+                context.scene.mesh_carver.DontApply = self.DontApply
 
                 # Reset Object
                 if self.ObjectBrush is not None:
@@ -2971,24 +2856,16 @@ class Carver(bpy.types.Operator):
                     context.scene.objects.active = self.ObjectBrush
 
                     bpy.ops.object.modifier_remove(modifier="CT_SOLIDIFY")
-
                     bpy.ops.object.select_all(action='TOGGLE')
 
                     Selection_Restore(self)
 
-                if "CT_Profil" in bpy.data.objects:
-                    Selection_Save(self)
-                    bpy.ops.object.select_all(action='DESELECT')
-                    bpy.data.objects["CT_Profil"].select = True
-                    context.scene.objects.active = bpy.data.objects["CT_Profil"]
-                    bpy.ops.object.delete(use_global=False)
-                    Selection_Restore(self)
-
+                Selection_Save_Restore(self)
                 context.scene.objects.active = self.CurrentActive
-
-                context.scene.nProfile = self.nProfil
+                context.scene.mesh_carver.nProfile = self.nProfil
 
                 bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
+
                 # Remove Copy Object Brush
                 if bpy.data.objects.get("CarverBrushCopy") is not None:
                     brush = bpy.data.objects["CarverBrushCopy"]
@@ -3003,7 +2880,6 @@ class Carver(bpy.types.Operator):
 
         except:
             print("\n[Carver MT ERROR]\n")
-
             import traceback
             traceback.print_exc()
 
@@ -3016,242 +2892,246 @@ class Carver(bpy.types.Operator):
 
             return {'FINISHED'}
 
-    # --------------------------------------------------------------------------------------------------
+    def cancel(self, context):
+        # Note: used to prevent memory leaks on quiting Blender while the modal operator
+        # is still running, gets called on return {"CANCELLED"}
+        bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
 
-    # --------------------------------------------------------------------------------------------------
     def invoke(self, context, event):
-        if context.area.type == 'VIEW_3D':
-            if context.mode == 'EDIT_MESH':
-                bpy.ops.object.mode_set(mode='OBJECT')
-
-            win = context.window
-
-            # Get default patterns
-            self.Profils = []
-            for p in Profils:
-                self.Profils.append((p[0], p[1], p[2], p[3]))
+        if context.area.type != 'VIEW_3D':
+            self.report({'WARNING'},
+                        "View3D not found or not currently active. Operation Cancelled")
+            return {'CANCELLED'}
 
-            for o in context.scene.objects:
-                if not o.name.startswith(context.scene.ProfilePrefix):
-                    continue
+        if context.mode == 'EDIT_MESH':
+            bpy.ops.object.mode_set(mode='OBJECT')
 
-                # In-scene profiles may have changed, remove them to refresh
-                for m in bpy.data.meshes:
-                    if m.name.startswith(context.scene.ProfilePrefix):
-                        bpy.data.meshes.remove(m)
+        # test if some other object types are selected that are not meshes
+        test_selection = True
+        for obj in context.selected_objects:
+            if obj.type != "MESH":
+                test_selection = False
+                break
+        if not test_selection:
+            self.report({'WARNING'},
+                        "Some selected objects are not of the Mesh type. Operation Cancelled")
+            return {"CANCELLED"}
+
+        # Get default patterns
+        self.Profils = []
+        for p in Profils:
+            self.Profils.append((p[0], p[1], p[2], p[3]))
+
+        for o in context.scene.objects:
+            if not o.name.startswith(context.scene.ProfilePrefix):
+                continue
+
+            # In-scene profiles may have changed, remove them to refresh
+            for m in bpy.data.meshes:
+                if m.name.startswith(context.scene.ProfilePrefix):
+                    bpy.data.meshes.remove(m)
+
+            vertices = []
+            for v in o.data.vertices:
+                vertices.append((v.co.x, v.co.y, v.co.z))
+
+            faces = []
+            for f in o.data.polygons:
+                face = []
+                for v in f.vertices:
+                    face.append(v)
+
+                faces.append(face)
+
+            self.Profils.append(
+                (o.name,
+                Vector((o.location.x, o.location.y, o.location.z)),
+                vertices, faces)
+            )
 
-                vertices = []
-                for v in o.data.vertices:
-                    vertices.append((v.co.x, v.co.y, v.co.z))
+        self.nProfil = context.scene.mesh_carver.nProfile
+        self.MaxProfil = len(self.Profils)
 
-                faces = []
-                for f in o.data.polygons:
-                    face = []
+        # reset selected profile if last profile exceeds length of array
+        if self.nProfil >= self.MaxProfil:
+            self.nProfil = context.scene.mesh_carver.nProfile = 0
 
-                    for v in f.vertices:
-                        face.append(v)
+        # Save selection
+        self.CurrentSelection = context.selected_objects.copy()
+        self.CurrentActive = context.active_object
+        self.SavSel = context.selected_objects.copy()
+        self.Sav_ac = None
 
-                    faces.append(face)
+        args = (self, context)
 
-                self.Profils.append(
-                            (o.name,
-                            mathutils.Vector((o.location.x, o.location.y, o.location.z)),
-                            vertices, faces)
-                            )
+        self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL')
 
-            self.nProfil = context.scene.nProfile
-            self.MaxProfil = len(self.Profils)
+        self.mouse_path = [(0, 0), (0, 0)]
 
-            # reset selected profile if last profile exceeds length of array
-            if self.nProfil >= self.MaxProfil:
-                self.nProfil = context.scene.nProfile = 0
+        self.shift = False
+        self.ctrl = False
+        self.alt = False
+        self.bDone = False
 
-            # Save selection
-            self.CurrentSelection = context.selected_objects.copy()
-            self.CurrentActive = context.active_object
-            self.SavSel = context.selected_objects.copy()
-            self.Sav_ac = None
+        self.DontApply = context.scene.mesh_carver.DontApply
+        self.Auto_BevelUpdate = True
 
-            args = (self, context)
+        # Cut type (Rectangle, Circle, Line)
+        self.CutMode = 0
+        self.BoolOps = DIFFERENCE
 
-            self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL')
+        # Circle variables
+        self.stepAngle = [2, 4, 5, 6, 9, 10, 15, 20, 30, 40, 45, 60, 72, 90]
+        self.step = 4
+        self.stepRotation = 0
 
-            self.mouse_path = [(0, 0), (0, 0)]
+        # Primitives Position
+        self.xpos = 0
+        self.ypos = 0
+        self.InitPosition = False
 
-            self.shift = False
-            self.ctrl = False
-            self.alt = False
+        # Line Increment
+        self.Increment = 15
+        # Close polygonal shape
+        self.Closed = False
 
-            self.bDone = False
+        # Depth Cursor
+        self.snapCursor = context.scene.mesh_carver.DepthCursor
 
-            self.DontApply = context.scene.DontApply
-            self.Auto_BevelUpdate = True
+        # Help
+        self.AskHelp = False
 
-            # Cut type (Rectangle, Circle, Line)
-            self.CutMode = 0
-            self.BoolOps = DIFFERENCE
+        # Working object
+        self.OpsObj = context.active_object
 
-            # Circle variables
-            self.stepAngle = [2, 4, 5, 6, 9, 10, 15, 20, 30, 40, 45, 60, 72, 90]
-            self.step = 4
-            self.stepRotation = 0
+        # Create mode
+        self.CreateMode = False
+        self.ExclusiveCreateMode = False
+        if len(context.selected_objects) == 0:
+            self.ExclusiveCreateMode = True
+            self.CreateMode = True
 
-            # Primitives Position
-            self.xpos = 0
-            self.ypos = 0
-            self.InitPosition = False
+        # Rebool forced (cut line)
+        self.ForceRebool = False
 
-            # Line Increment
-            self.Increment = 15
-            # Close polygonal shape
-            self.Closed = False
-
-            # Depth Cursor
-            self.snapCursor = context.scene.DepthCursor
-
-            # Help
-            self.AskHelp = False
-
-            # Working object
-            self.OpsObj = context.active_object
-
-            # Create mode
-            self.CreateMode = False
-            self.ExclusiveCreateMode = False
-            if len(context.selected_objects) == 0:
-                self.ExclusiveCreateMode = True
-                self.CreateMode = True
-
-            # Rebool forced (cut line)
-            self.ForceRebool = False
-
-            self.ViewVector = mathutils.Vector()
-
-            self.CurrentObj = None
-
-            # Brush
-            self.BrushSolidify = False
-            self.WidthSolidify = False
-            self.CarveDepth = False
-            self.BrushDepth = False
-            self.BrushDepthOffset = 0.0
-
-            self.ObjectScale = False
-
-            self.CircleListRaw = []
-            self.CLR_C = []
-            self.CurLoc = mathutils.Vector((0.0, 0.0, 0.0))
-            self.SavCurLoc = mathutils.Vector((0.0, 0.0, 0.0))
-            self.CRadius = 1.0
-            CreatePrimitive(self, 10.0, 1.0)
-            self.VertsList = []
-            self.FacesList = []
-
-            self.am = -1, -1
-            self.SavMousePos = None
-            self.xSavMouse = 0
-
-            self.ascale = 0
-            self.aRotZ = 0
-            self.nRotZ = 0
-            self.aqR = None
-            self.qRot = None
-
-            self.RandomRotation = context.scene.ORandom
-
-            self.ShowCursor = True
-
-            self.ObjectMode = False
-            self.ProfileMode = False
-            self.Instantiate = context.scene.OInstanciate
-
-            self.ProfileBrush = None
-            self.ObjectBrush = None
-            self.InitBrushPosition = None
-            self.InitBrushScale = None
-            self.InitBrushQRotation = None
-            self.InitBrushERotation = None
-            self.InitBrushARotation = None
-
-            self.ObjectBrush_DT = "WIRE"
-            self.XRay = False
-
-            # Grid mesh
-            self.nbcol = 1
-            self.nbrow = 1
-            self.gapx = 0
-            self.gapy = 0
-            self.scale_x = 1
-            self.scale_y = 1
-
-            self.GridScaleX = False
-            self.GridScaleY = False
-
-            if len(context.selected_objects) > 1:
-                self.ObjectBrush = context.active_object
-
-                # Copy the brush object
-                ob = bpy.data.objects.new("CarverBrushCopy", context.object.data.copy())
-                ob.location = self.ObjectBrush.location
-                scene = context.scene
-                scene.objects.link(ob)
-                scene.update()
-
-                # Get default variables
-                self.InitBrushPosition = self.ObjectBrush.location.copy()
-                self.InitBrushScale = self.ObjectBrush.scale.copy()
-                self.InitBrushQRotation = self.ObjectBrush.rotation_quaternion.copy()
-                self.InitBrushERotation = self.ObjectBrush.rotation_euler.copy()
-                self.ObjectBrush_DT = self.ObjectBrush.draw_type
-                self.XRay = self.ObjectBrush.show_x_ray
-                # Test if flat object
-                z = self.ObjectBrush.data.vertices[0].co.z
-                ErrorMarge = 0.01
-                self.Solidify_Active_Start = True
-                for v in self.ObjectBrush.data.vertices:
-                    if abs(v.co.z - z) > ErrorMarge:
-                        self.Solidify_Active_Start = False
-                        break
-                self.SolidifyPossible = False
-
-            self.CList = []
-            self.OPList = []
-            self.RList = []
-            self.OB_List = []
-
-            for ent in context.selected_objects:
-                if ent != self.ObjectBrush:
-                    self.OB_List.append(ent)
-
-            # Left button
-            self.LMB = False
-
-            # Undo Variables
-            self.undo_index = 0
-            self.undo_limit = context.user_preferences.edit.undo_steps
-            self.undo_list = []
-
-            # Boolean operations type
-            self.BooleanType = 0
-
-            self.UList = []
-            self.UList_Index = -1
-            self.UndoOps = []
-
-            context.window_manager.modal_handler_add(self)
-            return {'RUNNING_MODAL'}
-        else:
-            self.report({'WARNING'}, "View3D not found, cannot run operator")
-            return {'CANCELLED'}
-    # --------------------------------------------------------------------------------------------------
+        self.ViewVector = Vector()
+        self.CurrentObj = None
+
+        # Brush
+        self.BrushSolidify = False
+        self.WidthSolidify = False
+        self.CarveDepth = False
+        self.BrushDepth = False
+        self.BrushDepthOffset = 0.0
+
+        self.ObjectScale = False
+
+        self.CircleListRaw = []
+        self.CLR_C = []
+        self.CurLoc = Vector((0.0, 0.0, 0.0))
+        self.SavCurLoc = Vector((0.0, 0.0, 0.0))
+        self.CRadius = 1.0
+        CreatePrimitive(self, 10.0, 1.0)
+        self.VertsList = []
+        self.FacesList = []
+
+        self.am = -1, -1
+        self.SavMousePos = None
+        self.xSavMouse = 0
+
+        self.ascale = 0
+        self.aRotZ = 0
+        self.nRotZ = 0
+        self.aqR = None
+        self.qRot = None
+
+        self.RandomRotation = context.scene.mesh_carver.ORandom
+
+        self.ShowCursor = True
+        self.ObjectMode = False
+        self.ProfileMode = False
+        self.Instantiate = context.scene.mesh_carver.OInstanciate
+
+        self.ProfileBrush = None
+        self.ObjectBrush = None
+        self.InitBrushPosition = None
+        self.InitBrushScale = None
+        self.InitBrushQRotation = None
+        self.InitBrushERotation = None
+        self.InitBrushARotation = None
+
+        self.ObjectBrush_DT = "WIRE"
+        self.XRay = False
+
+        # Grid mesh
+        self.nbcol = 1
+        self.nbrow = 1
+        self.gapx = 0
+        self.gapy = 0
+        self.scale_x = 1
+        self.scale_y = 1
+
+        self.GridScaleX = False
+        self.GridScaleY = False
+
+        if len(context.selected_objects) > 1:
+            self.ObjectBrush = context.active_object
+
+            # Copy the brush object
+            ob = bpy.data.objects.new("CarverBrushCopy", context.object.data.copy())
+            ob.location = self.ObjectBrush.location
+            scene = context.scene
+            scene.objects.link(ob)
+            scene.update()
+
+            # Get default variables
+            self.InitBrushPosition = self.ObjectBrush.location.copy()
+            self.InitBrushScale = self.ObjectBrush.scale.copy()
+            self.InitBrushQRotation = self.ObjectBrush.rotation_quaternion.copy()
+            self.InitBrushERotation = self.ObjectBrush.rotation_euler.copy()
+            self.ObjectBrush_DT = self.ObjectBrush.draw_type
+            self.XRay = self.ObjectBrush.show_x_ray
+            # Test if flat object
+            z = self.ObjectBrush.data.vertices[0].co.z
+            ErrorMarge = 0.01
+            self.Solidify_Active_Start = True
+            for v in self.ObjectBrush.data.vertices:
+                if abs(v.co.z - z) > ErrorMarge:
+                    self.Solidify_Active_Start = False
+                    break
+            self.SolidifyPossible = False
+
+        self.CList = []
+        self.OPList = []
+        self.RList = []
+        self.OB_List = []
+
+        for ent in context.selected_objects:
+            if ent != self.ObjectBrush:
+                self.OB_List.append(ent)
+
+        # Left button
+        self.LMB = False
+
+        # Undo Variables
+        self.undo_index = 0
+        self.undo_limit = context.user_preferences.edit.undo_steps
+        self.undo_list = []
+
+        # Boolean operations type
+        self.BooleanType = 0
+
+        self.UList = []
+        self.UList_Index = -1
+        self.UndoOps = []
+
+        context.window_manager.modal_handler_add(self)
+        return {'RUNNING_MODAL'}
 
-    # --------------------------------------------------------------------------------------------------
     def CreateGeometry(self):
         context = bpy.context
-
-        region_id = context.region.id
-
         bLocalView = False
+
         for area in context.screen.areas:
             if area.type == 'VIEW_3D':
                 if area.spaces[0].local_view is not None:
@@ -3309,14 +3189,10 @@ class Carver(bpy.types.Operator):
         self.bDone = False
         self.mouse_path.clear()
         self.mouse_path = [(0, 0), (0, 0)]
-    # --------------------------------------------------------------------------------------------------
 
-    # --------------------------------------------------------------------------------------------------
     def Cut(self):
         context = bpy.context
 
-        UNDO = []
-
         # Local view ?
         bLocalView = False
         for area in context.screen.areas:
@@ -3358,7 +3234,7 @@ class Carver(bpy.types.Operator):
             bpy.ops.mesh.normals_make_consistent()
             bpy.ops.object.mode_set(mode='OBJECT')
         else:
-            # Create liste
+            # Create list
             if self.ObjectMode:
                 for o in self.CurrentSelection:
                     if o != self.ObjectBrush:
@@ -3380,7 +3256,7 @@ class Carver(bpy.types.Operator):
             if len(context.selected_objects) > 0:
                 bpy.ops.object.select_all(action='TOGGLE')
 
-            # Testif intitiale object has bevel
+            # Test if initial object has bevel
             BevelAO = False
             for obj in ActiveObjList:
                 for mb in obj.modifiers:
@@ -3407,14 +3283,11 @@ class Carver(bpy.types.Operator):
             if (self.shift is False) and (self.ForceRebool is False):
                 if self.ObjectMode or self.ProfileMode:
                     if self.BoolOps == UNION:
-                        # Union
-                        boolean_union()
+                        boolean_operation(bool_type="UNION")
                     else:
-                        # Cut object
-                        boolean_difference()
+                        boolean_operation(bool_type="DIFFERENCE")
                 else:
-                    # Cut
-                    boolean_difference()
+                    boolean_operation(bool_type="DIFFERENCE")
 
                 # Apply booleans
                 if self.DontApply is False:
@@ -3487,7 +3360,6 @@ class Carver(bpy.types.Operator):
                 if len(context.selected_objects) > 0:
                     bpy.ops.object.select_all(action='TOGGLE')
                 bpy.data.objects[self.CurrentObj.name].select = True
-                cname = self.CurrentObj.name
                 bpy.ops.object.delete(use_global=False)
             else:
                 if self.ObjectMode:
@@ -3496,7 +3368,7 @@ class Carver(bpy.types.Operator):
         if len(context.selected_objects) > 0:
             bpy.ops.object.select_all(action='TOGGLE')
 
-        # Select cutted objects
+        # Select cut objects
         for obj in lastSelected:
             bpy.data.objects[obj.name].select = True
 
@@ -3508,10 +3380,10 @@ class Carver(bpy.types.Operator):
         if self.Auto_BevelUpdate:
             update_bevel(context)
 
-        # Reselect intiale objects
+        # Re-select initial objects
         bpy.ops.object.select_all(action='TOGGLE')
         if self.ObjectMode:
-            # Reselect brush
+            # Re-select brush
             self.ObjectBrush.select = True
         for ActiveObj in ActiveObjList:
             bpy.data.objects[ActiveObj.name].select = True
@@ -3535,23 +3407,45 @@ class Carver(bpy.types.Operator):
         self.ForceRebool = False
 
 
-classes = (
-    Carver,
+class CarverProperties(bpy.types.PropertyGroup):
+    DepthCursor = BoolProperty(
+        name="DepthCursor",
+        default=False
+    )
+    OInstanciate = BoolProperty(
+        name="Obj_Instantiate",
+        default=False
+    )
+    ORandom = BoolProperty(
+        name="Random_Rotation",
+        default=False
+    )
+    DontApply = BoolProperty(
+        name="Dont_Apply",
+        default=False
     )
+    nProfile = IntProperty(
+        name="Num_Profile",
+        default=0
+    )
+
 
 addon_keymaps = []
 
+classes = (
+    CarverPrefs,
+    CarverProperties,
+    Carver,
+)
 
-def register():
-    bpy.types.Scene.DepthCursor = BoolProperty(name="DepthCursor", default=False)
-    bpy.types.Scene.OInstanciate = BoolProperty(name="Obj_Instantiate", default=False)
-    bpy.types.Scene.ORandom = BoolProperty(name="Random_Rotation", default=False)
-    bpy.types.Scene.DontApply = BoolProperty(name="Dont_Apply", default=False)
-    bpy.types.Scene.nProfile = IntProperty(name="Num_Profile", default=0)
 
-    bpy.utils.register_class(CarverPrefs)
+def register():
+    for cls in classes:
+        bpy.utils.register_class(cls)
 
-    bpy.utils.register_class(Carver)
+    bpy.types.Scene.mesh_carver = PointerProperty(
+        type=CarverProperties
+    )
     # add keymap entry
     kcfg = bpy.context.window_manager.keyconfigs.addon
     if kcfg:
@@ -3561,14 +3455,15 @@ def register():
 
 
 def unregister():
-    bpy.utils.unregister_class(CarverPrefs)
+    for cls in classes:
+        bpy.utils.unregister_class(cls)
 
     # remove keymap entry
     for km, kmi in addon_keymaps:
         km.keymap_items.remove(kmi)
     addon_keymaps.clear()
 
-    bpy.utils.unregister_class(Carver)
+    del bpy.types.Scene.mesh_carver
 
 
 if __name__ == "__main__":