diff --git a/oscurart_tools/__init__.py b/oscurart_tools/__init__.py
index 7c64b462e5b7074a66fa2613525f145f66827014..07beb3fc8ef1bac0a23cb57e5a33c0bdf8d68f0e 100644
--- a/oscurart_tools/__init__.py
+++ b/oscurart_tools/__init__.py
@@ -20,17 +20,28 @@
 
 bl_info = {
     "name": "Oscurart Tools",
-    "author": "Oscurart, CodemanX, Meta-Androcto",
-    "version": (3, 2),
+    "author": "Oscurart, CodemanX",
+    "version": (3, 2, 1),
     "blender": (2, 77, 0),
     "location": "View3D > Tools > Oscurart Tools",
     "description": "Tools for objects, render, shapes, and files.",
     "warning": "",
     "wiki_url":
         "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/3D_interaction/Oscurart_Tools",
+    "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
     "category": "Object",
     }
 
+import bpy
+
+from . import oscurart_files
+from . import oscurart_meshes
+from . import oscurart_objects
+from . import oscurart_shapes
+from . import oscurart_render
+from . import oscurart_overrides
+from . import oscurart_animation
+
 import bpy
 from bpy.types import (
             AddonPreferences,
@@ -44,62 +55,26 @@ from bpy.props import (
             IntProperty,
             )
 
-from . import oscurart_files
-from . import oscurart_meshes
-from . import oscurart_objects
-from . import oscurart_shapes
-from . import oscurart_render
-from . import oscurart_animation
-
-
 class View3DOscPanel(PropertyGroup):
+    bl_space_type = 'VIEW_3D'
+    bl_region_type = 'TOOLS'
+
     # CREA PANELES EN TOOLS
-    osc_object_tools = BoolProperty(default=True)
-    osc_mesh_tools = BoolProperty(default=True)
-    osc_shapes_tools = BoolProperty(default=True)
-    osc_render_tools = BoolProperty(default=True)
-    osc_files_tools = BoolProperty(default=True)
-    osc_animation_tools = BoolProperty(default=True)
-
-    quick_animation_in = IntProperty(
-                        default=1
-                        )
-    quick_animation_out = IntProperty(
-                        default=250
-                        )
-    # SETEO VARIABLE DE ENTORNO
-    SearchAndSelectOt = StringProperty(
-                        default="Object name initials"
-                        )
-    # RENDER CROP
-    rcPARTS = IntProperty(
-                        default=1,
-                        min=2,
-                        max=50,
-                        step=1
-                            )
-    RenameObjectOt = StringProperty(
-                        default="Type here"
-                        )
-
-
-class VarColArchivos(PropertyGroup):
-    filename = bpy.props.StringProperty(
-                        name="",
-                        default=""
-                        )
-    value = bpy.props.IntProperty(
-                        name="",
-                        default=10
-                        )
-    fullpath = bpy.props.StringProperty(
-                        name="",
-                        default=""
-                        )
-    checkbox = bpy.props.BoolProperty(
-                        name="",
-                        default=True
-                        )
+    osc_object_tools = BoolProperty(default=False)
+    osc_mesh_tools = BoolProperty(default=False)
+    osc_shapes_tools = BoolProperty(default=False)
+    osc_render_tools = BoolProperty(default=False)
+    osc_files_tools = BoolProperty(default=False)
+    osc_overrides_tools = BoolProperty(default=False)
+    osc_animation_tools = BoolProperty(default=False)
+
+    # PARA ESCENAS NUEVAS
+    overrides = bpy.props.StringProperty(default="[]")
+
+
+class OscOverridesProp(PropertyGroup):
+    matoverride = bpy.props.StringProperty()
+    grooverride = bpy.props.StringProperty()
 
 
 # PANELES
@@ -123,6 +98,7 @@ class OscPanelControl(Panel):
         col.prop(oscurart, "osc_animation_tools", text="Animation", icon="POSE_DATA")
         col.prop(oscurart, "osc_render_tools", text="Render", icon="SCENE")
         col.prop(oscurart, "osc_files_tools", text="Files", icon="IMASEL")
+        col.prop(oscurart, "osc_overrides_tools", text="Overrides", icon="GREASEPENCIL")
 
 
 class OscPanelObject(Panel):
@@ -149,10 +125,10 @@ class OscPanelObject(Panel):
         colrow = col.row(align=1)
         colrow.operator("object.objects_to_groups", icon="GROUP")
         colrow = col.row(align=1)
-        colrow.prop(bpy.context.scene.oscurart, "SearchAndSelectOt", text="")
+        colrow.prop(bpy.context.scene, "SearchAndSelectOt", text="")
         colrow.operator("object.search_and_select_osc", icon="ZOOM_SELECTED")
         colrow = col.row(align=1)
-        colrow.prop(bpy.context.scene.oscurart, "RenameObjectOt", text="")
+        colrow.prop(bpy.context.scene, "RenameObjectOt", text="")
         colrow.operator("object.rename_objects_osc", icon="SHORTDISPLAY")
         col.operator(
             "object.distribute_osc",
@@ -267,6 +243,14 @@ class OscPanelRender(Panel):
             "render.copy_render_settings_osc",
             icon="LIBRARY_DATA_DIRECT",
             text="Copy Cycles Settings").mode = "cycles"
+        col.operator(
+            "file.create_batch_maker_osc",
+            icon="LINENUMBERS_ON",
+            text="Make Render Batch")
+        col.operator(
+            "file.create_batch_python",
+            icon="LINENUMBERS_ON",
+            text="Make Python Batch")
         colrow = col.row(align=1)
         colrow.operator(
             "render.render_all_scenes_osc",
@@ -286,7 +270,7 @@ class OscPanelRender(Panel):
 
         colrow = col.row(align=1)
         colrow.operator("render.render_crop_osc", icon="RENDER_REGION")
-        colrow.prop(bpy.context.scene.oscurart, "rcPARTS", text="Parts")
+        colrow.prop(bpy.context.scene, "rcPARTS", text="Parts")
 
         boxcol = layout.box().column(align=1)
         colrow = boxcol.row(align=1)
@@ -296,7 +280,7 @@ class OscPanelRender(Panel):
             text="Selected Scenes").frametype = False
         colrow.operator(
             "render.render_selected_scenes_osc",
-            text="> Frame").frametype = True
+            text="> Fame").frametype = True
 
         for sc in bpy.data.scenes[:]:
             boxcol.prop(sc, "use_render_scene", text=sc.name)
@@ -317,8 +301,58 @@ class OscPanelFiles(Panel):
     def draw(self, context):
         layout = self.layout
         col = layout.column(align=1)
+        col.operator("file.save_incremental_osc", icon="NEW")
         col.operator("image.reload_images_osc", icon="IMAGE_COL")
         col.operator("file.sync_missing_groups", icon="LINK_AREA")
+        col = layout.column(align=1)
+        colrow = col.row(align=1)
+        colrow.prop(bpy.context.scene, "oscSearchText", text="")
+        colrow.prop(bpy.context.scene, "oscReplaceText", text="")
+        col.operator("file.replace_file_path_osc", icon="SHORTDISPLAY")
+
+
+class OscPanelOverrides(Panel):
+    bl_idname = "Oscurart Overrides"
+    bl_label = "Overrides Tools"
+    bl_category = "Oscurart Tools"
+    bl_space_type = 'VIEW_3D'
+    bl_region_type = 'TOOLS'
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        return context.scene.oscurart.osc_overrides_tools
+
+    def draw(self, context):
+        layout = self.layout
+        box = layout.box()
+        col = box.column(align=1)
+
+        # col.operator("render.overrides_set_list", text="Create Override
+        # List", icon="GREASEPENCIL")
+        col.label(text="Active Scene: " + bpy.context.scene.name)
+        col.label(text="Example: [[Group,Material]]")
+        col.prop(bpy.context.scene.oscurart, "overrides", text="")
+        col.operator(
+            "render.check_overrides",
+            text="Check List",
+            icon="ZOOM_ALL")
+        col.operator("render.overrides_on", text="On / Off", icon="QUIT")
+        col.label(
+            text=str("OVERRIDES: ON" if bpy.use_overrides else "OVERRIDES: OFF"))
+
+        box = layout.box()
+        boxcol = box.column(align=1)
+        boxcol.label(text="Danger Zone")
+        boxcolrow = boxcol.row(align=1)
+        boxcolrow.operator(
+            "render.apply_overrides",
+            text="Apply Overrides",
+            icon="ERROR")
+        boxcolrow.operator(
+            "render.restore_overrides",
+            text="Restore Overrides",
+            icon="ERROR")
 
 
 class OscPanelAnimation(Panel):
@@ -340,8 +374,43 @@ class OscPanelAnimation(Panel):
 
         col.operator("anim.quick_parent_osc", icon="OUTLINER_DATA_POSE")
         row = col.row(align=1)
-        row.prop(bpy.context.scene.oscurart, "quick_animation_in", text="")
-        row.prop(bpy.context.scene.oscurart, "quick_animation_out", text="")
+        row.prop(bpy.context.scene, "quick_animation_in", text="")
+        row.prop(bpy.context.scene, "quick_animation_out", text="")
+
+
+# Addons Preferences Update Panel
+
+def update_panel(self, context):
+    try:
+        bpy.utils.unregister_class(OscPanelControl)
+        bpy.utils.unregister_class(OscPanelObject)
+        bpy.utils.unregister_class(OscPanelMesh)
+        bpy.utils.unregister_class(OscPanelShapes)
+        bpy.utils.unregister_class(OscPanelRender)
+        bpy.utils.unregister_class(OscPanelFiles)
+        bpy.utils.unregister_class(OscPanelOverrides)
+        bpy.utils.unregister_class(OscPanelAnimation)
+    except:
+        pass
+
+    addon_prefs = context.user_preferences.addons[__name__].preferences
+
+    OscPanelControl.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelControl)
+    OscPanelObject.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelObject)
+    OscPanelMesh.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelMesh)
+    OscPanelShapes.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelShapes)
+    OscPanelRender.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelRender)
+    OscPanelFiles.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelFiles)
+    OscPanelOverrides.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelOverrides)
+    OscPanelAnimation.bl_category = addon_prefs.category
+    bpy.utils.register_class(OscPanelAnimation)
 
 
 class OscurartToolsAddonPreferences(bpy.types.AddonPreferences):
@@ -349,13 +418,15 @@ class OscurartToolsAddonPreferences(bpy.types.AddonPreferences):
     # when defining this in a submodule of a python package.
     bl_idname = __name__
 
-    category = StringProperty(
+    category = bpy.props.StringProperty(
             name="Category",
             description="Choose a name for the category of the panel",
             default="Oscurart Tools",
+            update=update_panel,
             )
 
     def draw(self, context):
+
         layout = self.layout
         row = layout.row()
         col = row.column()
@@ -368,20 +439,23 @@ class OscurartToolsAddonPreferences(bpy.types.AddonPreferences):
 def register():
     bpy.utils.register_module(__name__)
 
-    bpy.types.Scene.oscurart = bpy.props.PointerProperty(
-                                        type=View3DOscPanel
-                                        )
-    bpy.types.Scene.use_render_scene = bpy.props.BoolProperty()
+    bpy.types.Scene.oscurart = bpy.props.PointerProperty(type=View3DOscPanel)
+
+    bpy.types.Scene.ovlist = bpy.props.CollectionProperty(type=OscOverridesProp)
 
-    bpy.types.Scene.broken_files = bpy.props.CollectionProperty(
-                                        type=VarColArchivos
-                                        )
+    bpy.types.Scene.quick_animation_in = bpy.props.IntProperty(default=1)
+    bpy.types.Scene.quick_animation_out = bpy.props.IntProperty(default=250)
+
+    # SETEO VARIABLE DE ENTORNO
+    bpy.types.Scene.SearchAndSelectOt = bpy.props.StringProperty(
+                                               default="Object name initials")
 
 
 def unregister():
     del bpy.types.Scene.oscurart
-    del bpy.types.Scene.use_render_scene
-    del bpy.types.Scene.broken_files
+    del bpy.types.Scene.quick_animation_in
+    del bpy.types.Scene.quick_animation_out
+    del bpy.types.Scene.SearchAndSelectOt
 
     bpy.utils.unregister_module(__name__)
 
diff --git a/oscurart_tools/oscurart_animation.py b/oscurart_tools/oscurart_animation.py
index 8a3e552afbb4797ee002136b52ef2dfb193a7378..bf2095b8c7e2a1419154c2f738336e43d98038b7 100644
--- a/oscurart_tools/oscurart_animation.py
+++ b/oscurart_tools/oscurart_animation.py
@@ -21,16 +21,16 @@
 import bpy
 from mathutils import Matrix
 
-# -------------------------QUICK PARENT------------------
+# ---------------------------QUICK PARENT------------------
 
 
 def DefQuickParent(inf, out):
     if bpy.context.object.type == "ARMATURE":
         ob = bpy.context.object
         target = [object for object in bpy.context.selected_objects if object != ob][0]
-        ob = (bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object)
+        ob = bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object
         target.select = False
-        bpy.context.scene.frame_set(frame=bpy.context.scene.oscurart.quick_animation_in)
+        bpy.context.scene.frame_set(frame=bpy.context.scene.quick_animation_in)
         a = Matrix(target.matrix_world)
         a.invert()
         i = Matrix(ob.matrix)
@@ -41,9 +41,9 @@ def DefQuickParent(inf, out):
     else:
         ob = bpy.context.object
         target = [object for object in bpy.context.selected_objects if object != ob][0]
-        ob = (bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object)
+        ob = bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object
         target.select = False
-        bpy.context.scene.frame_set(frame=bpy.context.scene.oscurart.quick_animation_in)
+        bpy.context.scene.frame_set(frame=bpy.context.scene.quick_animation_in)
         a = Matrix(target.matrix_world)
         a.invert()
         i = Matrix(ob.matrix_world)
@@ -53,18 +53,13 @@ def DefQuickParent(inf, out):
             bpy.ops.anim.keyframe_insert(type="LocRotScale")
 
 
-class QuickParent(bpy.types.Operator):
+class QuickParent (bpy.types.Operator):
     bl_idname = "anim.quick_parent_osc"
     bl_label = "Quick Parent"
     bl_options = {"REGISTER", "UNDO"}
 
-    @classmethod
-    def poll(cls, context):
-        return (context.active_object is not None and
-                len(context.selected_objects) > 1)
-
     def execute(self, context):
         DefQuickParent(
-            bpy.context.scene.oscurart.quick_animation_in,
-            bpy.context.scene.oscurart.quick_animation_out)
+            bpy.context.scene.quick_animation_in,
+            bpy.context.scene.quick_animation_out)
         return {'FINISHED'}
diff --git a/oscurart_tools/oscurart_files.py b/oscurart_tools/oscurart_files.py
index c3a82d7f41cfe93a6a6db8ac0418e3e22caec56c..b829e8d9b49bed119d7aa64f25936dcb7442a685 100644
--- a/oscurart_tools/oscurart_files.py
+++ b/oscurart_tools/oscurart_files.py
@@ -22,9 +22,10 @@ import bpy
 from bpy.types import Operator
 
 
-# ---------------------RELOAD IMAGES------------------
+# ---------------------------RELOAD IMAGES------------------
 
-class reloadImages(Operator):
+
+class reloadImages (Operator):
     bl_idname = "image.reload_images_osc"
     bl_label = "Reload Images"
     bl_options = {"REGISTER", "UNDO"}
@@ -35,7 +36,54 @@ class reloadImages(Operator):
         return {'FINISHED'}
 
 
-# --------------- SYNC MISSING GROUPS -----------------
+# ------------------------ SAVE INCREMENTAL ------------------------
+
+class saveIncremental(Operator):
+    bl_idname = "file.save_incremental_osc"
+    bl_label = "Save Incremental File"
+    bl_options = {"REGISTER", "UNDO"}
+
+    def execute(self, context):
+        filepath = bpy.data.filepath
+        if filepath.count("_v"):
+            strnum = filepath.rpartition("_v")[-1].rpartition(".blend")[0]
+            intnum = int(strnum)
+            modnum = strnum.replace(str(intnum), str(intnum + 1))
+            output = filepath.replace(strnum, modnum)
+            basename = os.path.basename(filepath)
+            bpy.ops.wm.save_as_mainfile(
+                filepath=os.path.join(os.path.dirname(filepath), "%s_v%s.blend" %
+                                       (basename.rpartition("_v")[0], str(modnum))))
+
+        else:
+            output = filepath.rpartition(".blend")[0] + "_v01"
+            bpy.ops.wm.save_as_mainfile(filepath=output)
+
+        return {'FINISHED'}
+
+# ------------------------ REPLACE FILE PATHS ------------------------
+
+bpy.types.Scene.oscSearchText = bpy.props.StringProperty(default="Search Text")
+bpy.types.Scene.oscReplaceText = bpy.props.StringProperty(
+    default="Replace Text")
+
+
+class replaceFilePath(Operator):
+    bl_idname = "file.replace_file_path_osc"
+    bl_label = "Replace File Path"
+    bl_options = {"REGISTER", "UNDO"}
+
+    def execute(self, context):
+        TEXTSEARCH = bpy.context.scene.oscSearchText
+        TEXTREPLACE = bpy.context.scene.oscReplaceText
+
+        for image in bpy.data.images:
+            image.filepath = image.filepath.replace(TEXTSEARCH, TEXTREPLACE)
+
+        return {'FINISHED'}
+
+
+# ---------------------- SYNC MISSING GROUPS --------------------------
 
 class reFreshMissingGroups(Operator):
     bl_idname = "file.sync_missing_groups"
diff --git a/oscurart_tools/oscurart_meshes.py b/oscurart_tools/oscurart_meshes.py
index 99116a0873cb969b8d80841144762043bbef2d97..4269e6a86748f4d493193a93abac6e8596d70f29 100644
--- a/oscurart_tools/oscurart_meshes.py
+++ b/oscurart_tools/oscurart_meshes.py
@@ -32,9 +32,12 @@ import time
 import blf
 from bpy_extras.view3d_utils import location_3d_to_region_2d
 
+C = bpy.context
+D = bpy.data
 
 # -----------------------------RECONST---------------------------
 
+
 def defReconst(self, OFFSET):
     bpy.ops.object.mode_set(mode='EDIT', toggle=False)
     bpy.context.tool_settings.mesh_select_mode = (True, True, True)
@@ -73,7 +76,7 @@ def defReconst(self, OFFSET):
         use_subsurf_data=0)
 
 
-class reConst(Operator):
+class reConst (Operator):
     bl_idname = "mesh.reconst_osc"
     bl_label = "ReConst Mesh"
     bl_options = {"REGISTER", "UNDO"}
@@ -93,9 +96,9 @@ class reConst(Operator):
         defReconst(self, self.OFFSET)
         return {'FINISHED'}
 
-
 # -----------------------------------SELECT LEFT---------------------
 
+
 def side(self, nombre, offset):
 
     bpy.ops.object.mode_set(mode="EDIT", toggle=0)
@@ -144,15 +147,15 @@ class SelectMenor (Operator):
 
 # -------------------------RESYM VG----------------------------------
 
-class resymVertexGroups(Operator):
+
+class resymVertexGroups (Operator):
     bl_idname = "mesh.resym_vertex_weights_osc"
     bl_label = "Resym Vertex Weights"
     bl_options = {"REGISTER", "UNDO"}
 
     @classmethod
     def poll(cls, context):
-        return (context.active_object is not None and
-                context.active_object.type == 'MESH')
+        return context.active_object is not None
 
     def execute(self, context):
 
@@ -175,15 +178,14 @@ class resymVertexGroups(Operator):
 
 # ------------------------IMPORT EXPORT GROUPS--------------------
 
-class OscExportVG(Operator):
+class OscExportVG (Operator):
     bl_idname = "file.export_groups_osc"
     bl_label = "Export Groups"
     bl_options = {"REGISTER", "UNDO"}
 
     @classmethod
     def poll(cls, context):
-        return (context.active_object is not None and
-                context.active_object.type == 'MESH')
+        return context.active_object is not None
 
     def execute(self, context):
 
@@ -201,15 +203,14 @@ class OscExportVG(Operator):
         return {'FINISHED'}
 
 
-class OscImportVG(Operator):
+class OscImportVG (Operator):
     bl_idname = "file.import_groups_osc"
     bl_label = "Import Groups"
     bl_options = {"REGISTER", "UNDO"}
 
     @classmethod
     def poll(cls, context):
-        return (context.active_object is not None and
-                context.active_object.type == 'MESH')
+        return context.active_object is not None
 
     def execute(self, context):
 
@@ -233,6 +234,7 @@ class OscImportVG(Operator):
 
 # ------------------------------------ RESYM MESH-------------------------
 
+
 def reSymSave(self, quality):
 
     bpy.ops.object.mode_set(mode='OBJECT')
@@ -302,7 +304,7 @@ def reSymMesh(self, SELECTED, SIDE):
             MEMA(SYMAP)
 
 
-class OscResymSave(Operator):
+class OscResymSave (Operator):
     bl_idname = "mesh.resym_save_map"
     bl_label = "Resym save XML Map"
     bl_options = {"REGISTER", "UNDO"}
@@ -322,15 +324,14 @@ class OscResymSave(Operator):
         return {'FINISHED'}
 
 
-class OscResymMesh(Operator):
+class OscResymMesh (Operator):
     bl_idname = "mesh.resym_mesh"
     bl_label = "Resym save Apply XML"
     bl_options = {"REGISTER", "UNDO"}
 
     @classmethod
     def poll(cls, context):
-        return (context.active_object is not None and
-                context.active_object.type == 'MESH')
+        return context.active_object is not None
 
     selected = BoolProperty(
             default=False,
@@ -364,9 +365,12 @@ def DefOscObjectToMesh():
 
 class OscObjectToMesh(Operator):
     bl_idname = "mesh.object_to_mesh_osc"
+    bl_idname = "mesh.object_to_mesh_osc"
+    bl_label = "Object To Mesh"
     bl_label = "Object To Mesh"
     bl_description = "Works on Meshes, Meta objects, Curves and Surfaces"
 
+    
     @classmethod
     def poll(cls, context):
         return (context.active_object is not None and
@@ -374,13 +378,14 @@ class OscObjectToMesh(Operator):
                 {'MESH', 'META', 'CURVE', 'SURFACE'})
 
     def execute(self, context):
-        print("Active type object is", context.object.type)
-        DefOscObjectToMesh()
-        return {'FINISHED'}
+         print("Active type object is", context.object.type)
+         DefOscObjectToMesh()
+         return {'FINISHED'}
 
 
 # ----------------------------- OVERLAP UV -------------------------------
 
+
 def DefOscOverlapUv(valpresicion):
     inicio = time.time()
     mode = bpy.context.object.mode
@@ -423,7 +428,7 @@ def DefOscOverlapUv(valpresicion):
             for lloop in lif[l]:
                 for rloop in lif[r]:
                     if (verteqind[vertexvert[lloop]] == vertexvert[rloop] and
-                       ob.data.uv_layers.active.data[rloop].select):
+                        ob.data.uv_layers.active.data[rloop].select):
 
                         ob.data.uv_layers.active.data[
                             lloop].uv = ob.data.uv_layers.active.data[
@@ -455,9 +460,9 @@ class OscOverlapUv(Operator):
         DefOscOverlapUv(self.presicion)
         return {'FINISHED'}
 
-
 # ------------------------------- IO VERTEX COLORS --------------------
 
+
 def DefOscExportVC():
     with open(os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.object.name) + ".vc", mode="w") as file:
         ob = bpy.context.object
@@ -474,7 +479,7 @@ def DefOscImportVC():
                 loopind].color = di[loopind]
 
 
-class OscExportVC(Operator):
+class OscExportVC (Operator):
     bl_idname = "mesh.export_vertex_colors"
     bl_label = "Export Vertex Colors"
     bl_options = {"REGISTER", "UNDO"}
@@ -489,7 +494,7 @@ class OscExportVC(Operator):
         return {'FINISHED'}
 
 
-class OscImportVC(Operator):
+class OscImportVC (Operator):
     bl_idname = "mesh.import_vertex_colors"
     bl_label = "Import Vertex Colors"
     bl_options = {"REGISTER", "UNDO"}
@@ -506,6 +511,7 @@ class OscImportVC(Operator):
 
 # ------------------ PRINT VERTICES ----------------------
 
+
 def dibuja_callback(self, context):
     font_id = 0
     bm = bmesh.from_edit_mesh(bpy.context.object.data)
diff --git a/oscurart_tools/oscurart_objects.py b/oscurart_tools/oscurart_objects.py
index ffae4aaef1838243afb516b20469a40d287f98ca..01d4e0d320361d3ad733f46fe52a6168cf956b66 100644
--- a/oscurart_tools/oscurart_objects.py
+++ b/oscurart_tools/oscurart_objects.py
@@ -19,18 +19,17 @@
 # <pep8 compliant>
 
 import bpy
+import os
 from bpy.types import Operator
 from bpy.props import BoolProperty
-import os
 from bpy_extras.object_utils import world_to_camera_view
 
-
 # ------------------------ SEARCH AND SELECT ------------------------
 
-class SearchAndSelectOt(Operator):
+
+class SearchAndSelectOt(bpy.types.Operator):
     bl_idname = "object.search_and_select_osc"
     bl_label = "Search And Select"
-    bl_description = "Selection based upon object names in the scene"
     bl_options = {"REGISTER", "UNDO"}
 
     start = BoolProperty(name="Start With", default=True)
@@ -39,7 +38,7 @@ class SearchAndSelectOt(Operator):
 
     def execute(self, context):
         for objeto in bpy.context.scene.objects:
-            variableNombre = bpy.context.scene.oscurart.SearchAndSelectOt
+            variableNombre = bpy.context.scene.SearchAndSelectOt
             if self.start:
                 if objeto.name.startswith(variableNombre):
                     objeto.select = True
@@ -54,6 +53,10 @@ class SearchAndSelectOt(Operator):
 
 # -------------------------RENAME OBJECTS----------------------------------
 
+# CREO VARIABLE
+bpy.types.Scene.RenameObjectOt = bpy.props.StringProperty(default="Type here")
+
+
 class renameObjectsOt (Operator):
     bl_idname = "object.rename_objects_osc"
     bl_label = "Rename Objects"
@@ -62,7 +65,7 @@ class renameObjectsOt (Operator):
     def execute(self, context):
         listaObj = bpy.context.selected_objects[:]
         for objeto in listaObj:
-            objeto.name = bpy.context.scene.oscurart.RenameObjectOt
+            objeto.name = bpy.context.scene.RenameObjectOt
         return {'FINISHED'}
 
 
@@ -71,7 +74,6 @@ class renameObjectsOt (Operator):
 class oscRemModifiers (Operator):
     bl_idname = "object.modifiers_remove_osc"
     bl_label = "Remove modifiers"
-    bl_description = "Removes all modifiers on all selected objects"
     bl_options = {"REGISTER", "UNDO"}
 
     def execute(self, context):
@@ -86,8 +88,6 @@ class oscRemModifiers (Operator):
 class oscApplyModifiers (Operator):
     bl_idname = "object.modifiers_apply_osc"
     bl_label = "Apply modifiers"
-    bl_description = ("Applies all modifiers on all selected objects \n"
-                      "Warning: Make single user will be applied on Linked Object data")
     bl_options = {"REGISTER", "UNDO"}
 
     def execute(self, context):
@@ -117,14 +117,17 @@ class oscApplyModifiers (Operator):
 
 # ------------------------------------ RELINK OBJECTS---------------------
 
+
 def relinkObjects(self):
 
+
     LISTSCENE = []
     if bpy.selection_osc:
         for SCENE in bpy.data.scenes[:]:
             if SCENE.objects:
                 if bpy.selection_osc[-1] in SCENE.objects[:]:
                     LISTSCENE.append(SCENE)
+ 
 
         if LISTSCENE:
             OBJECTS = bpy.selection_osc[:-1]
@@ -135,6 +138,7 @@ def relinkObjects(self):
 
             bpy.ops.object.select_all(action='DESELECT')
 
+
             for OBJETO in OBJECTS:
                 if OBJETO.users != len(bpy.data.scenes):
                     print(OBJETO.name)
@@ -150,7 +154,7 @@ def relinkObjects(self):
             self.report({'INFO'}, message="Scenes are empty")
 
 
-class OscRelinkObjectsBetween(Operator):
+class OscRelinkObjectsBetween (Operator):
     bl_idname = "object.relink_objects_between_scenes"
     bl_label = "Relink Objects Between Scenes"
     bl_options = {"REGISTER", "UNDO"}
@@ -162,9 +166,11 @@ class OscRelinkObjectsBetween(Operator):
 
 # ------------------------------------ COPY GROUPS AND LAYERS-------------
 
+
 def CopyObjectGroupsAndLayers(self):
 
     OBSEL = bpy.selection_osc[:]
+
     if OBSEL:
         GLOBALLAYERS = list(OBSEL[-1].layers[:])
         ACTSCENE = bpy.context.scene
@@ -247,9 +253,9 @@ class OscSelection(bpy.types.Header):
         row.label("Sels: "+str(len(bpy.selection_osc)))
         """
 
-
 # =============== DISTRIBUTE ======================
 
+
 def ObjectDistributeOscurart(self, X, Y, Z):
     if len(bpy.selection_osc[:]) > 1:
         # VARIABLES
@@ -295,6 +301,7 @@ class DialogDistributeOsc(Operator):
 
 # ======================== SET LAYERS TO OTHER SCENES ====================
 
+
 def DefSetLayersToOtherScenes():
     actsc = bpy.context.screen.scene
     for object in bpy.context.selected_objects[:]:
@@ -489,7 +496,7 @@ def duplicateSymmetrical(self, disconect):
             bpy.context.active_object.driver_remove("scale")
 
 
-class oscDuplicateSymmetricalOp(Operator):
+class oscDuplicateSymmetricalOp (Operator):
     bl_idname = "object.duplicate_object_symmetry_osc"
     bl_label = "Oscurart Duplicate Symmetrical"
     bl_options = {"REGISTER", "UNDO"}
@@ -516,7 +523,7 @@ def DefObjectToGroups():
             scgr.objects.link(ob)
 
 
-class ObjectsToGroups(Operator):
+class ObjectsToGroups (Operator):
     bl_idname = "object.objects_to_groups"
     bl_label = "Objects to Groups"
     bl_options = {"REGISTER", "UNDO"}
diff --git a/oscurart_tools/oscurart_overrides.py b/oscurart_tools/oscurart_overrides.py
new file mode 100644
index 0000000000000000000000000000000000000000..994b766a3202b05df803fd57d7c492adb219a29d
--- /dev/null
+++ b/oscurart_tools/oscurart_overrides.py
@@ -0,0 +1,294 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+from bpy.types import Operator, Panel
+import os
+
+
+# ------------------APPLY AND RESTORE OVERRIDES ------------------
+
+def DefOscApplyOverrides(self):
+    types = {'MESH', 'META', 'CURVE'}
+    for ob in bpy.data.objects:
+        if ob.type in types:
+            if not len(ob.material_slots):
+                ob.data.materials.append(None)
+    slotlist = {ob: [sl.material for sl in ob.material_slots]
+                for ob in bpy.data.objects if ob.type in types if len(ob.material_slots)}
+    with open("%s_override.txt" % (os.path.join(os.path.dirname(bpy.data.filepath),
+                                                bpy.context.scene.name)), mode="w") as file:
+        file.write(str(slotlist))
+    scene = bpy.context.scene
+    proptolist = list(eval(scene.oscurart.overrides))
+    for group, material in proptolist:
+        for object in bpy.data.groups[group].objects:
+            lenslots = len(object.material_slots)
+            if object.type in types:
+                if len(object.data.materials):
+                    object.data.materials.clear()
+                    for newslot in range(lenslots):
+                        object.data.materials.append(
+                            bpy.data.materials[material])
+
+
+def DefOscRestoreOverrides(self):
+    with open("%s_override.txt" % (os.path.join(os.path.dirname(bpy.data.filepath),
+                                                bpy.context.scene.name)), mode="r") as file:
+        slotlist = eval(file.read())
+        for ob, slots in slotlist.items():
+            ob.data.materials.clear()
+            for slot in slots:
+                ob.data.materials.append(slot)
+
+
+# HAND OPERATOR
+
+class OscApplyOverrides(Operator):
+    bl_idname = "render.apply_overrides"
+    bl_label = "Apply Overrides in this Scene"
+    bl_options = {"REGISTER", "UNDO"}
+
+    def execute(self, context):
+        DefOscApplyOverrides(self)
+        return {'FINISHED'}
+
+
+class OscRestoreOverrides(Operator):
+    bl_idname = "render.restore_overrides"
+    bl_label = "Restore Overrides in this Scene"
+    bl_options = {"REGISTER", "UNDO"}
+
+    def execute(self, context):
+        DefOscRestoreOverrides(self)
+        return {'FINISHED'}
+
+bpy.use_overrides = False
+
+
+class OscOverridesOn(Operator):
+    bl_idname = "render.overrides_on"
+    bl_label = "Turn On Overrides"
+    bl_options = {"REGISTER", "UNDO"}
+
+    def execute(self, context):
+        if bpy.use_overrides is False:
+            bpy.app.handlers.render_pre.append(DefOscApplyOverrides)
+            bpy.app.handlers.render_post.append(DefOscRestoreOverrides)
+            bpy.use_overrides = True
+            print("Overrides on!")
+        else:
+            bpy.app.handlers.render_pre.remove(DefOscApplyOverrides)
+            bpy.app.handlers.render_post.remove(DefOscRestoreOverrides)
+            bpy.use_overrides = False
+            print("Overrides off!")
+        return {'FINISHED'}
+
+
+# -------------------- CHECK OVERRIDES -------------------
+
+class OscCheckOverrides(Operator):
+    bl_idname = "render.check_overrides"
+    bl_label = "Check Overrides"
+    bl_options = {"REGISTER", "UNDO"}
+
+    def execute(self, context):
+        GROUPI = False
+        GLOBAL = 0
+        GLOBALERROR = 0
+
+        print("==== STARTING CHECKING ====")
+        print("")
+
+        for SCENE in bpy.data.scenes[:]:
+            MATLIST = []
+            MATI = False
+
+            for MATERIAL in bpy.data.materials[:]:
+                MATLIST.append(MATERIAL.name)
+
+            GROUPLIST = []
+            for GROUP in bpy.data.groups[:]:
+                if GROUP.users > 0:
+                    GROUPLIST.append(GROUP.name)
+
+            print("   %s Scene is checking" % (SCENE.name))
+
+            for OVERRIDE in list(eval(SCENE.oscurart.overrides)):
+                # REVISO OVERRIDES EN GRUPOS
+                if OVERRIDE[0] in GROUPLIST:
+                    pass
+                else:
+                    print("** %s group are in conflict." % (OVERRIDE[0]))
+                    GROUPI = True
+                    GLOBALERROR += 1
+                # REVISO OVERRIDES EN GRUPOS
+                if OVERRIDE[1] in MATLIST:
+                    pass
+                else:
+                    print("** %s material are in conflict." % (OVERRIDE[1]))
+                    MATI = True
+                    GLOBALERROR += 1
+
+            if MATI is False:
+                print("-- Materials are ok.")
+            else:
+                GLOBAL += 1
+            if GROUPI is False:
+                print("-- Groups are ok.")
+            else:
+                GLOBAL += 1
+
+        if GLOBAL < 1:
+            self.report({'INFO'}, "Materials And Groups are Ok")
+        if GLOBALERROR > 0:
+            self.report({'WARNING'}, "Override Error: Look in the Console")
+        print("")
+
+        return {'FINISHED'}
+
+# --------------------------------- OVERRIDES PANEL ----------------------
+
+
+class OscOverridesGUI(Panel):
+    bl_label = "Oscurart Material Overrides"
+    bl_idname = "Oscurart Overrides List"
+    bl_space_type = "PROPERTIES"
+    bl_region_type = "WINDOW"
+    bl_context = "render"
+
+    def draw(self, context):
+
+        layout = self.layout
+        col = layout.column(align=1)
+        colrow = col.row(align=1)
+        colrow.operator("render.overrides_add_slot", icon="ZOOMIN")
+        colrow.operator("render.overrides_remove_slot", icon="ZOOMOUT")
+        col.operator("render.overrides_transfer", icon="SHORTDISPLAY")
+
+        for i, m in enumerate(bpy.context.scene.ovlist):
+            colrow = col.row(align=1)
+            colrow.prop_search(m, "grooverride", bpy.data, "groups", text="")
+            colrow.prop_search(
+                m,
+                "matoverride",
+                bpy.data,
+                "materials",
+                text="")
+            if i != len(bpy.context.scene.ovlist) - 1:
+                pa = colrow.operator(
+                    "ovlist.move_down",
+                    text="",
+                    icon="TRIA_DOWN")
+                pa.index = i
+            if i > 0:
+                p = colrow.operator("ovlist.move_up", text="", icon="TRIA_UP")
+                p.index = i
+            pb = colrow.operator("ovlist.kill", text="", icon="X")
+            pb.index = i
+
+
+class OscOverridesUp(Operator):
+    bl_idname = 'ovlist.move_up'
+    bl_label = 'Move Override up'
+    bl_options = {'INTERNAL'}
+
+    index = bpy.props.IntProperty(min=0)
+
+    @classmethod
+    def poll(self, context):
+        return len(context.scene.ovlist)
+
+    def execute(self, context):
+        ovlist = context.scene.ovlist
+        ovlist.move(self.index, self.index - 1)
+
+        return {'FINISHED'}
+
+
+class OscOverridesDown(Operator):
+    bl_idname = 'ovlist.move_down'
+    bl_label = 'Move Override down'
+    bl_options = {'INTERNAL'}
+
+    index = bpy.props.IntProperty(min=0)
+
+    @classmethod
+    def poll(self, context):
+        return len(context.scene.ovlist)
+
+    def execute(self, context):
+        ovlist = context.scene.ovlist
+        ovlist.move(self.index, self.index + 1)
+        return {'FINISHED'}
+
+
+class OscOverridesKill(Operator):
+    bl_idname = 'ovlist.kill'
+    bl_label = 'Kill Override'
+    bl_options = {'INTERNAL'}
+
+    index = bpy.props.IntProperty(min=0)
+
+    @classmethod
+    def poll(self, context):
+        return len(context.scene.ovlist)
+
+    def execute(self, context):
+        ovlist = context.scene.ovlist
+        ovlist.remove(self.index)
+        return {'FINISHED'}
+
+
+class OscTransferOverrides(Operator):
+    """Tooltip"""
+    bl_idname = "render.overrides_transfer"
+    bl_label = "Transfer Overrides"
+
+    def execute(self, context):
+        # CREO LISTA
+        OSCOV = [[OVERRIDE.grooverride, OVERRIDE.matoverride]
+                 for OVERRIDE in bpy.context.scene.ovlist[:]
+                 if OVERRIDE.matoverride != "" and OVERRIDE.grooverride != ""]
+
+        bpy.context.scene.oscurart.overrides = str(OSCOV)
+        return {'FINISHED'}
+
+
+class OscAddOverridesSlot(Operator):
+    """Tooltip"""
+    bl_idname = "render.overrides_add_slot"
+    bl_label = "Add Override Slot"
+
+    def execute(self, context):
+        prop = bpy.context.scene.ovlist.add()
+        prop.matoverride = ""
+        prop.grooverride = ""
+        return {'FINISHED'}
+
+
+class OscRemoveOverridesSlot(Operator):
+    """Tooltip"""
+    bl_idname = "render.overrides_remove_slot"
+    bl_label = "Remove Override Slot"
+
+    def execute(self, context):
+        context.scene.ovlist.remove(len(bpy.context.scene.ovlist) - 1)
+        return {'FINISHED'}
diff --git a/oscurart_tools/oscurart_render.py b/oscurart_tools/oscurart_render.py
index a20aafee512178090ff74f7c5d792c018ac154b9..8e7fc05f55d54c08f41ddb04ddc50dce9df452bf 100644
--- a/oscurart_tools/oscurart_render.py
+++ b/oscurart_tools/oscurart_render.py
@@ -25,7 +25,6 @@ from bpy.types import (
             )
 import os
 
-
 # -------------------------------- RENDER ALL SCENES ---------------------
 
 def defRenderAll(frametype, scenes):
@@ -46,6 +45,7 @@ def defRenderAll(frametype, scenes):
                 for ob in bpy.data.objects if ob.type in types if len(ob.material_slots)}
 
     for scene in scenes:
+        proptolist = list(eval(scene.oscurart.overrides))
         renpath = scene.render.filepath
 
         if frametype:
@@ -54,6 +54,15 @@ def defRenderAll(frametype, scenes):
             scene.frame_end = FC
             scene.frame_start = FC
 
+        for group, material in proptolist:
+            for object in bpy.data.groups[group].objects:
+                lenslots = len(object.material_slots)
+                if object.type in types:
+                    if len(object.data.materials):
+                        object.data.materials.clear()
+                        for newslot in range(lenslots):
+                            object.data.materials.append(
+                                bpy.data.materials[material])
         filename = os.path.basename(bpy.data.filepath.rpartition(".")[0])
         uselayers = {layer: layer.use for layer in scene.render.layers}
         for layer, usado in uselayers.items():
@@ -63,6 +72,7 @@ def defRenderAll(frametype, scenes):
                 layer.use = 1
                 print("SCENE: %s" % scene.name)
                 print("LAYER: %s" % layer.name)
+                print("OVERRIDE: %s" % str(proptolist))
                 scene.render.filepath = os.path.join(
                     os.path.dirname(renpath), filename, scene.name, layer.name, "%s_%s_%s" %
                     (filename, scene.name, layer.name))
@@ -103,6 +113,9 @@ class renderAll (Operator):
 
 # --------------------------------RENDER SELECTED SCENES------------------
 
+bpy.types.Scene.use_render_scene = bpy.props.BoolProperty()
+
+
 class renderSelected (Operator):
     bl_idname = "render.render_selected_scenes_osc"
     bl_label = "Render Selected Scenes"
@@ -112,12 +125,12 @@ class renderSelected (Operator):
     def execute(self, context):
         defRenderAll(
             self.frametype,
-            [sc for sc in bpy.data.scenes if sc.oscurart.use_render_scene])
+            [sc for sc in bpy.data.scenes if sc.use_render_scene])
         return {'FINISHED'}
 
-
 # --------------------------------RENDER CURRENT SCENE--------------------
 
+
 class renderCurrent (Operator):
     bl_idname = "render.render_current_scene_osc"
     bl_label = "Render Current Scene"
@@ -132,13 +145,14 @@ class renderCurrent (Operator):
 
 
 # --------------------------RENDER CROP----------------------
+bpy.types.Scene.rcPARTS = bpy.props.IntProperty(
+    default=0, min=2, max=50, step=1)
+
 
 def OscRenderCropFunc():
 
     SCENENAME = os.path.split(bpy.data.filepath)[-1].partition(".")[0]
-    rcParts = bpy.context.scene.oscurart.rcPARTS
-    # don't divide by zero
-    PARTS = (rcParts if rcParts and rcParts > 0 else 1)
+    PARTS = bpy.context.scene.rcPARTS
     CHUNKYSIZE = 1 / PARTS
     FILEPATH = bpy.context.scene.render.filepath
     bpy.context.scene.render.use_border = True
@@ -148,12 +162,11 @@ def OscRenderCropFunc():
         bpy.context.scene.render.border_max_y = (
             PART * CHUNKYSIZE) + CHUNKYSIZE
         bpy.context.scene.render.filepath = "%s_part%s" % (
-                                            os.path.join(FILEPATH,
-                                                         SCENENAME,
-                                                         bpy.context.scene.name,
-                                                         SCENENAME),
-                                            PART
-                                            )
+            os.path.join(FILEPATH,
+                         SCENENAME,
+                         bpy.context.scene.name,
+                         SCENENAME),
+            PART)
         bpy.ops.render.render(animation=False, write_still=True)
 
     bpy.context.scene.render.filepath = FILEPATH
@@ -167,9 +180,231 @@ class renderCrop (Operator):
         OscRenderCropFunc()
         return {'FINISHED'}
 
+# ---------------------------BATCH MAKER------------------
+
+
+def defoscBatchMaker(TYPE, BIN):
+
+    if os.name == "nt":
+        print("PLATFORM: WINDOWS")
+        SYSBAR = os.sep
+        EXTSYS = ".bat"
+        QUOTES = '"'
+    else:
+        print("PLATFORM:LINUX")
+        SYSBAR = os.sep
+        EXTSYS = ".sh"
+        QUOTES = ''
+
+    FILENAME = bpy.data.filepath.rpartition(SYSBAR)[-1].rpartition(".")[0]
+    BINDIR = bpy.app[4]
+    SHFILE = os.path.join(
+        bpy.data.filepath.rpartition(SYSBAR)[0],
+        FILENAME + EXTSYS)
+
+    with open(SHFILE, "w") as FILE:
+        # assign permission in linux
+        if EXTSYS == ".sh":
+            try:
+                os.chmod(SHFILE, stat.S_IRWXU)
+            except:
+                print(
+                    "** Oscurart Batch maker can not modify the permissions.")
+        if not BIN:
+            FILE.writelines("%s%s%s -b %s -x 1 -o %s -P %s%s.py  -s %s -e %s -a" %
+                            (QUOTES, BINDIR, QUOTES, bpy.data.filepath, bpy.context.scene.render.filepath,
+                             bpy.data.filepath.rpartition(SYSBAR)[0] + SYSBAR, TYPE,
+                             str(bpy.context.scene.frame_start), str(bpy.context.scene.frame_end)))
+        else:
+            FILE.writelines("%s -b %s -x 1 -o %s -P %s%s.py  -s %s -e %s -a" %
+                            ("blender", bpy.data.filepath, bpy.context.scene.render.filepath,
+                             bpy.data.filepath.rpartition(SYSBAR)[0] + SYSBAR, TYPE,
+                             str(bpy.context.scene.frame_start), str(bpy.context.scene.frame_end)))
+
+    RLATFILE = "%s%sosRlat.py" % (
+        bpy.data.filepath.rpartition(SYSBAR)[0],
+        SYSBAR)
+    if not os.path.isfile(RLATFILE):
+        with open(RLATFILE, "w") as file:
+            if EXTSYS == ".sh":
+                try:
+                    os.chmod(RLATFILE, stat.S_IRWXU)
+                except:
+                    print(
+                        "** Oscurart Batch maker can not modify the permissions.")
+            file.writelines(
+                "import bpy \nbpy.ops.render.render_all_scenes_osc()\nbpy.ops.wm.quit_blender()")
+
+    else:
+        print("The All Python files Skips: Already exist!")
+
+    RSLATFILE = "%s%sosRSlat.py" % (
+        bpy.data.filepath.rpartition(SYSBAR)[0],
+        SYSBAR)
+    if not os.path.isfile(RSLATFILE):
+        with open(RSLATFILE, "w") as file:
+            if EXTSYS == ".sh":
+                try:
+                    os.chmod(RSLATFILE, stat.S_IRWXU)
+                except:
+                    print(
+                        "** Oscurart Batch maker can not modify the permissions.")
+            file.writelines(
+                "import bpy \nbpy.ops.render.render_selected_scenes_osc()\nbpy.ops.wm.quit_blender()")
+    else:
+        print("The Selected Python files Skips: Already exist!")
+
+
+class oscBatchMaker (Operator):
+    bl_idname = "file.create_batch_maker_osc"
+    bl_label = "Make render batch"
+    bl_options = {'REGISTER', 'UNDO'}
+
+    type = bpy.props.EnumProperty(
+        name="Render Mode",
+        description="Select Render Mode",
+        items=(('osRlat', "All Scenes", "Render All Layers At Time"),
+               ('osRSlat', "Selected Scenes", "Render Only The Selected Scenes")),
+        default='osRlat',
+    )
+
+    bin = bpy.props.BoolProperty(
+        default=False,
+        name="Use Environment Variable")
+
+    def execute(self, context):
+        defoscBatchMaker(self.type, self.bin)
+        return {'FINISHED'}
+
+# --------------------------------------PYTHON BATCH----------------------
+
+
+def defoscPythonBatchMaker(BATCHTYPE, SIZE):
+
+    # REVISO SISTEMA
+    if os.name == "nt":
+        print("PLATFORM: WINDOWS")
+        SYSBAR = "\\"
+        EXTSYS = ".bat"
+        QUOTES = '"'
+    else:
+        print("PLATFORM:LINUX")
+        SYSBAR = "/"
+        EXTSYS = ".sh"
+        QUOTES = ''
+
+    # CREO VARIABLES
+    FILENAME = bpy.data.filepath.rpartition(SYSBAR)[-1].rpartition(".")[0]
+    SHFILE = "%s%s%s_PythonSecureBatch.py" % (
+        bpy.data.filepath.rpartition(SYSBAR)[0],
+        SYSBAR,
+        FILENAME)
+    BATCHLOCATION = "%s%s%s%s" % (
+        bpy.data.filepath.rpartition(SYSBAR)[0],
+        SYSBAR,
+        FILENAME,
+        EXTSYS)
+
+    with open(SHFILE, "w") as FILEBATCH:
+
+        if EXTSYS == ".bat":
+            BATCHLOCATION = BATCHLOCATION.replace("\\", "/")
+
+        # SI EL OUTPUT TIENE DOBLE BARRA LA REEMPLAZO
+        FRO = bpy.context.scene.render.filepath
+        if bpy.context.scene.render.filepath.count("//"):
+            FRO = bpy.context.scene.render.filepath.replace(
+                "//",
+                bpy.data.filepath.rpartition(SYSBAR)[0] + SYSBAR)
+        if EXTSYS == ".bat":
+            FRO = FRO.replace("\\", "/")
+
+        # CREO BATCH
+        bpy.ops.file.create_batch_maker_osc(type=BATCHTYPE)
+
+        SCRIPT = ('''
+import os
+REPITE= True
+BAT= '%s'
+SCENENAME ='%s'
+DIR='%s%s'
+def RENDER():
+    os.system(BAT)
+def CLEAN():
+    global REPITE
+    FILES  = [root+'/'+FILE for root, dirs, files in os.walk(os.getcwd()) if
+              len(files) > 0 for FILE in files if FILE.count('~') == False]
+    RESPUESTA=False
+    for FILE in FILES:
+        if os.path.getsize(FILE) < %s:
+            os.remove(FILE)
+            RESPUESTA= True
+    if RESPUESTA:
+        REPITE=True
+    else:
+        REPITE=False
+REPITE=True
+while REPITE:
+    REPITE=False
+    RENDER()
+    os.chdir(DIR)
+    CLEAN()
+''' % (BATCHLOCATION, FILENAME, FRO, FILENAME, SIZE))
+
+        # DEFINO ARCHIVO DE BATCH
+        FILEBATCH.writelines(SCRIPT)
+
+    # ARCHIVO CALL
+    CALLFILENAME = bpy.data.filepath.rpartition(SYSBAR)[-1].rpartition(".")[0]
+    CALLFILE = "%s%s%s_CallPythonSecureBatch%s" % (
+        bpy.data.filepath.rpartition(SYSBAR)[0],
+        SYSBAR,
+        CALLFILENAME,
+        EXTSYS)
+
+    with open(CALLFILE, "w") as CALLFILEBATCH:
+
+        SCRIPT = "python %s" % (SHFILE)
+        CALLFILEBATCH.writelines(SCRIPT)
+
+    if EXTSYS == ".sh":
+        try:
+            os.chmod(CALLFILE, stat.S_IRWXU)
+            os.chmod(SHFILE, stat.S_IRWXU)
+        except:
+            print("** Oscurart Batch maker can not modify the permissions.")
+
+
+class oscPythonBatchMaker (Operator):
+    bl_idname = "file.create_batch_python"
+    bl_label = "Make Batch Python"
+    bl_options = {'REGISTER', 'UNDO'}
+
+    size = bpy.props.IntProperty(name="Size in Bytes", default=10, min=0)
+
+    type = bpy.props.EnumProperty(
+        name="Render Mode",
+        description="Select Render Mode",
+        items=(('osRlat', "All Scenes", "Render All Layers At Time"),
+               ('osRSlat', "Selected Scenes", "Render Only The Selected Scenes")),
+        default='osRlat',
+    )
+
+    def execute(self, context):
+        defoscPythonBatchMaker(self.type, self.size)
+        return {'FINISHED'}
+
 
 # ---------------------------------- BROKEN FRAMES ---------------------
 
+class VarColArchivos (bpy.types.PropertyGroup):
+    filename = bpy.props.StringProperty(name="", default="")
+    value = bpy.props.IntProperty(name="", default=10)
+    fullpath = bpy.props.StringProperty(name="", default="")
+    checkbox = bpy.props.BoolProperty(name="", default=True)
+bpy.utils.register_class(VarColArchivos)
+
+
 class SumaFile(Operator):
     bl_idname = "object.add_broken_file"
     bl_label = "Add Broken Files"
@@ -213,7 +448,11 @@ class DeleteFiles(Operator):
         return {'FINISHED'}
 
 
-class BrokenFramesPanel(Panel):
+bpy.types.Scene.broken_files = bpy.props.CollectionProperty(
+    type=VarColArchivos)
+
+
+class BrokenFramesPanel (Panel):
     bl_label = "Oscurart Broken Render Files"
     bl_idname = "OBJECT_PT_osc_broken_files"
     bl_space_type = 'PROPERTIES'
@@ -285,6 +524,7 @@ def defCopyRenderSettings(mode):
         'keying_sets_all',
         'sequence_editor',
         '__doc__',
+        'ovlist',
         'file_extension',
         'users',
         'node_tree',
@@ -309,6 +549,7 @@ def defCopyRenderSettings(mode):
         '__weakref__',
         'string',
         'double',
+        'overrides',
         'use_render_scene',
         'engine',
         'use_nodes',
@@ -342,6 +583,13 @@ def defCopyRenderSettings(mode):
                 except:
                     print("%s does not exist." % (prop))
 
+        """
+        scenerenderdict = {prop: getattr(bpy.context.scene.render, prop) for prop in dir(bpy.context.scene.render)}
+        scenedict = {prop: getattr(bpy.context.scene, prop) for prop in dir(bpy.context.scene) if prop not in excludes}
+        sceneimagesettingdict = {prop: getattr(bpy.context.scene.render.image_settings, prop)
+                                 for prop in dir(bpy.context.scene.render.image_settings)}
+        """
+
         # render
         for escena in sceneslist:
             for prop, value in scenerenderdict.items():
@@ -350,6 +598,7 @@ def defCopyRenderSettings(mode):
                 except:
                     print("%s was not copied!" % (prop))
                     pass
+
         # scene
         for escena in sceneslist:
             for prop, value in scenedict.items():
@@ -376,6 +625,10 @@ def defCopyRenderSettings(mode):
                         bpy.context.scene.cycles, prop)
                 except:
                     print("%s does not exist." % (prop))
+
+        """
+        scenecyclesdict = {prop: getattr(bpy.context.scene.cycles, prop) for prop in dir(bpy.context.scene.cycles)}
+        """
         # cycles
         for escena in sceneslist:
             for prop, value in scenecyclesdict.items():
@@ -389,6 +642,7 @@ def defCopyRenderSettings(mode):
 class copyRenderSettings(Operator):
     bl_idname = "render.copy_render_settings_osc"
     bl_label = "Copy Render Settings"
+    # bl_options = {'REGISTER', 'UNDO'}
 
     mode = bpy.props.StringProperty(default="")