diff --git a/scripts/modules/bpy/utils/__init__.py b/scripts/modules/bpy/utils/__init__.py
index 94b7394971b..81a438ce8ac 100644
--- a/scripts/modules/bpy/utils/__init__.py
+++ b/scripts/modules/bpy/utils/__init__.py
@@ -66,7 +66,7 @@ _preferences = _bpy.context.preferences
 _is_factory_startup = _bpy.app.factory_startup
 
 # Directories added to the start of `sys.path` for all of Blender's "scripts" directories.
-_script_module_dirs = "startup", "modules"
+_script_module_dirs = "startup", "modules","mblender"
 
 # Base scripts, this points to the directory containing: "modules" & "startup" (see `_script_module_dirs`).
 # In Blender's code-base this is `./scripts`.
@@ -308,6 +308,10 @@ def load_scripts(*, reload_scripts=False, refresh_scripts=False, extensions=True
                         for mod in modules_from_path(path, loaded_modules):
                             test_register(mod)
 
+                    if path_subdir == "mblender":
+                        for mod in modules_from_path(path, loaded_modules):
+                            test_register(mod)
+
     if reload_scripts:
         # Update key-maps for key-map items referencing operators defined in "startup".
         # Without this, key-map items wont be set properly, see: #113309.
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index b6aa0d1d8b8..ba49a73e6c8 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -159,6 +159,7 @@ add_subdirectory(functions)
 add_subdirectory(makesdna)
 add_subdirectory(makesrna)
 add_subdirectory(compositor)
+add_subdirectory(mblender)
 
 if(WITH_BLENDER_THUMBNAILER)
   add_subdirectory(blendthumb)
diff --git a/source/blender/mblender/CMakeLists.txt b/source/blender/mblender/CMakeLists.txt
new file mode 100644
index 00000000000..0147a67b9fa
--- /dev/null
+++ b/source/blender/mblender/CMakeLists.txt
@@ -0,0 +1,45 @@
+#
+#
+#
+
+
+set(INC
+  .
+  ../blenlib
+)
+
+set(LIB
+  PRIVATE bf::blenlib
+)
+
+
+if(WITH_BOOST)
+  list(APPEND INC_SYS
+    ${BOOST_INCLUDE_DIR}
+  )
+else()
+	message (FATAL_ERROR "mblender requires WITH_BOOST")
+endif()
+
+# Auto fill source files, so patches will not touch that file
+file(GLOB sources "MB_*")
+foreach(source ${sources})
+  get_filename_component(name ${source} NAME)
+  list(APPEND SRC "${name}")
+endforeach()
+
+# Generate a Definition for each found patch
+file(GLOB patches "patches/*")
+ foreach(patch ${patches})
+  get_filename_component(def ${patch} NAME_WE)
+  get_filename_component(name ${patch} NAME)
+  if (${name} MATCHES "^MB_[0-9][0-9][0-9][0-9]\.h$" )
+    add_definitions(-D${def})
+    list(APPEND SRC "patches/${name}")
+  else()
+    message (FATAL_ERROR  "invalid patch file ${name}")
+  endif ()
+endforeach()
+
+
+blender_add_lib(mblender "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
diff --git a/source/blender/mblender/MB_blender.cc b/source/blender/mblender/MB_blender.cc
new file mode 100644
index 00000000000..e9aaf8ed92c
--- /dev/null
+++ b/source/blender/mblender/MB_blender.cc
@@ -0,0 +1,61 @@
+/**
+ *
+ */
+
+#include "MB_patches.h"
+
+#include <boost/preprocessor/if.hpp>
+
+#include <stdio.h>
+#include <string.h>
+
+char patches[MAX_MB_PATCHES][8] = {0};
+
+void MB_patches_discover()
+{
+    int i = 0;
+
+    BOOST_PP_IF(MB_0001_APPLIED, strcpy(patches[i++], "MB_0001"), );
+    BOOST_PP_IF(MB_0002_APPLIED, strcpy(patches[i++], "MB_0002"), );
+    BOOST_PP_IF(MB_0003_APPLIED, strcpy(patches[i++], "MB_0003"), );
+    BOOST_PP_IF(MB_0004_APPLIED, strcpy(patches[i++], "MB_0004"), );
+    BOOST_PP_IF(MB_0005_APPLIED, strcpy(patches[i++], "MB_0005"), );
+    BOOST_PP_IF(MB_0006_APPLIED, strcpy(patches[i++], "MB_0006"), );
+    BOOST_PP_IF(MB_0007_APPLIED, strcpy(patches[i++], "MB_0007"), );
+    BOOST_PP_IF(MB_0008_APPLIED, strcpy(patches[i++], "MB_0008"), );
+    BOOST_PP_IF(MB_0009_APPLIED, strcpy(patches[i++], "MB_0009"), );
+    BOOST_PP_IF(MB_0010_APPLIED, strcpy(patches[i++], "MB_0010"), );
+    BOOST_PP_IF(MB_0011_APPLIED, strcpy(patches[i++], "MB_0011"), );
+    BOOST_PP_IF(MB_0012_APPLIED, strcpy(patches[i++], "MB_0012"), );
+    BOOST_PP_IF(MB_0013_APPLIED, strcpy(patches[i++], "MB_0013"), );
+    BOOST_PP_IF(MB_0014_APPLIED, strcpy(patches[i++], "MB_0014"), );
+    BOOST_PP_IF(MB_0015_APPLIED, strcpy(patches[i++], "MB_0015"), );
+    BOOST_PP_IF(MB_0016_APPLIED, strcpy(patches[i++], "MB_0016"), );
+    BOOST_PP_IF(MB_0017_APPLIED, strcpy(patches[i++], "MB_0017"), );
+    BOOST_PP_IF(MB_0018_APPLIED, strcpy(patches[i++], "MB_0018"), );
+    BOOST_PP_IF(MB_0019_APPLIED, strcpy(patches[i++], "MB_0019"), );
+    BOOST_PP_IF(MB_0020_APPLIED, strcpy(patches[i++], "MB_0020"), );
+
+    return;
+}
+
+void MB_init(void) {
+    MB_patches_discover();
+}
+
+char** MB_patches_get() {
+    return (char**) patches;
+}
+
+void MB_print_info()
+{
+    printf("%s", "Mechanical Blender Info\n");
+    printf("%s", "---------------------\n");
+    for (int i = 0; i < MAX_MB_PATCHES; i++) {
+        if (*patches[i] != '\0') {
+            printf("Applied Patch %s\n", patches[i]);
+        }
+    }
+    printf("%s", "---------------------\n");
+}
+
diff --git a/source/blender/mblender/MB_blender.h b/source/blender/mblender/MB_blender.h
new file mode 100644
index 00000000000..e3b2ab2387c
--- /dev/null
+++ b/source/blender/mblender/MB_blender.h
@@ -0,0 +1,13 @@
+/**
+ *
+ */
+
+#ifndef MB_BLENDER_H
+#define MB_BLENDER_H
+
+void MB_init(void);
+void MB_patches_discover(void);
+void MB_patches_get(void);
+void MB_print_info(void);
+
+#endif
diff --git a/source/blender/mblender/MB_patches.h b/source/blender/mblender/MB_patches.h
new file mode 100644
index 00000000000..874202928dc
--- /dev/null
+++ b/source/blender/mblender/MB_patches.h
@@ -0,0 +1,149 @@
+#ifndef MB_BLENDER_PATCHES_H
+#define MB_BLENDER_PATCHES_H
+
+#ifdef MB_0001
+#include "patches/MB_0001.h"
+#define MB_0001_APPLIED 1
+#else
+#define MB_0001_APPLIED 0
+#endif
+
+#ifdef MB_0002
+#include "patches/MB_0002.h"
+#define MB_0002_APPLIED 1
+#else
+#define MB_0002_APPLIED 0
+#endif
+
+#ifdef MB_0003
+#include "patches/MB_0003.h"
+#define MB_0003_APPLIED 1
+#else
+#  define MB_0003_APPLIED 0
+#endif
+
+#ifdef MB_0004
+#include "patches/MB_0004.h"
+#define MB_0004_APPLIED 1
+#else
+#  define MB_0004_APPLIED 0
+#endif
+
+#ifdef MB_0005
+#include "patches/MB_0005.h"
+#define MB_0005_APPLIED 1
+#else
+# define MB_0005_APPLIED 0
+#endif
+
+#ifdef MB_0006
+#include "patches/MB_0006.h"
+#define MB_0006_APPLIED 1
+#else
+#define MB_0006_APPLIED 0
+#endif
+
+#ifdef MB_0007
+#include "patches/MB_0007.h"
+#define MB_0007_APPLIED 1
+#else
+#define MB_0007_APPLIED 0
+#endif
+
+#ifdef MB_0008
+#include "patches/MB_0008.h"
+#define MB_0008_APPLIED 1
+#else
+#define MB_0008_APPLIED 0
+#endif
+
+#ifdef MB_0009
+#include "patches/MB_0009.h"
+#define MB_0009_APPLIED 1
+#else
+#define MB_0009_APPLIED 0
+#endif
+
+#ifdef MB_0010
+#include "patches/MB_0010.h"
+#define MB_0010_APPLIED 1
+#else
+#define MB_0010_APPLIED 0
+#endif
+
+#ifdef MB_0011
+#include "patches/MB_0011.h"
+#define MB_0011_APPLIED 1
+#else
+#define MB_0011_APPLIED 0
+#endif
+
+#ifdef MB_0012
+#include "patches/MB_0012.h"
+#define MB_0012_APPLIED 1
+#else
+#define MB_0012_APPLIED 0
+#endif
+
+#ifdef MB_0013
+#include "patches/MB_0013.h"
+#define MB_0013_APPLIED 1
+#else
+#define MB_0013_APPLIED 0
+#endif
+
+#ifdef MB_0014
+#include "patches/MB_0014.h"
+#define MB_0014_APPLIED 1
+#else
+#define MB_0014_APPLIED 0
+#endif
+
+#ifdef MB_0015
+#include "patches/MB_0015.h"
+#define MB_0015_APPLIED 1
+#else
+#define MB_0015_APPLIED 0
+#endif
+
+#ifdef MB_0016
+#include "patches/MB_0016.h"
+#define MB_0016_APPLIED 1
+#else
+#define MB_0016_APPLIED 0
+#endif
+
+#ifdef MB_0017
+#include "patches/MB_0017.h"
+#define MB_0017_APPLIED 1
+#else
+#define MB_0017_APPLIED 0
+#endif
+
+#ifdef MB_0018
+#include "patches/MB_0018.h"
+#define MB_0018_APPLIED 1
+#else
+#define MB_0018_APPLIED 0
+#endif
+
+#ifdef MB_0019
+#include "patches/MB_0019.h"
+#define MB_0019_APPLIED 1
+#else
+#define MB_0019_APPLIED 0
+#endif
+
+#ifdef MB_0020
+#include "patches/MB_0020.h"
+#define MB_0020_APPLIED 1
+#else
+#define MB_0020_APPLIED 0
+#endif
+
+#ifndef MB_0021
+#define MAX_MB_PATCHES 21
+#endif
+
+
+#endif // !MB_BLENDER_PATCHES_H
diff --git a/source/blender/mblender/patches/MB_0008.h b/source/blender/mblender/patches/MB_0008.h
new file mode 100644
index 00000000000..8ac91a5f12f
--- /dev/null
+++ b/source/blender/mblender/patches/MB_0008.h
@@ -0,0 +1 @@
+/* Empty file */
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index ab73ab435ca..cba61b7a15d 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -14,6 +14,7 @@ set(INC
   ../blender/makesrna
   ../blender/render
   ../blender/windowmanager
+  ../blender/mblender
 )
 
 set(LIB
@@ -21,6 +22,7 @@ set(LIB
   PRIVATE bf::dna
   PRIVATE bf::intern::guardedalloc
   bf_windowmanager
+  mblender
 )
 
 if(HAVE_FEENABLEEXCEPT)
diff --git a/source/creator/creator.cc b/source/creator/creator.cc
index 7e6815ee286..3fe843a6a5c 100644
--- a/source/creator/creator.cc
+++ b/source/creator/creator.cc
@@ -57,6 +57,8 @@
 #include "BKE_vfont.h"
 #include "BKE_volume.h"
 
+#include "MB_blender.h"
+
 #ifndef WITH_PYTHON_MODULE
 #  include "BLI_args.h"
 #endif
@@ -486,6 +488,8 @@ int main(int argc,
   /* After parsing number of threads argument. */
   BLI_task_scheduler_init();
 
+  MB_init();
+
 #ifndef WITH_PYTHON_MODULE
   /* The settings pass includes:
    * - Background-mode assignment (#Global.background), checked by other subsystems
diff --git a/source/creator/creator_args.cc b/source/creator/creator_args.cc
index 502f7f37267..6dd68668b18 100644
--- a/source/creator/creator_args.cc
+++ b/source/creator/creator_args.cc
@@ -47,6 +47,8 @@
 
 #  include "GPU_context.h"
 
+#  include "MB_blender.h"
+
 #  ifdef WITH_FFMPEG
 #    include "IMB_imbuf.h"
 #  endif
@@ -1478,6 +1480,16 @@ static int arg_handle_start_with_console(int /*argc*/, const char ** /*argv*/, v
   return 0;
 }
 
+
+static const char arg_handle_mblender_info_doc[] =
+    "\n\t"
+    "Shows Mechanical Blender info on loading.";
+static int arg_handle_mblender_info(int /*argc*/, const char ** /*argv*/, void * /*data*/)
+{
+  MB_print_info();
+  return 0;
+}
+
 static const char arg_handle_register_extension_doc[] =
     "\n\t"
     "Register blend-file extension for current user, then exit (Windows only).";
@@ -2522,6 +2534,8 @@ void main_args_setup(bContext *C, bArgs *ba, bool all)
 
   BLI_args_add(ba, nullptr, "--open-last", CB(arg_handle_load_last_file), C);
 
+  BLI_args_add(ba, nullptr, "--mblender-info", CB(arg_handle_mblender_info), nullptr);
+
 #  undef CB
 #  undef CB_EX
 #  undef CB_ALL
