diff --git a/extern/mantaflow/README.blender b/extern/mantaflow/README.blender
index bc1e2a164dc5e814f91dccd0be3d3ab02e40f98d..b0b010d54f4f9f9d0908905b8285d17a58034814 100644
--- a/extern/mantaflow/README.blender
+++ b/extern/mantaflow/README.blender
@@ -2,4 +2,5 @@ Project: Mantaflow
 URL: http://mantaflow.com/
 License: Apache 2.0
 Upstream version: 0.13
-Local modifications: None
+Local modifications:
+* ./patches/local_namespace.diff to support loading MANTA variables into an isolated __main__ name-space.
diff --git a/extern/mantaflow/helper/pwrapper/registry.cpp b/extern/mantaflow/helper/pwrapper/registry.cpp
index b20651f3baafad2cb960e833794a0bbc2dfc823f..b4206a41dea1ec6a2e1b27acb3ed24c71f5c7a43 100644
--- a/extern/mantaflow/helper/pwrapper/registry.cpp
+++ b/extern/mantaflow/helper/pwrapper/registry.cpp
@@ -706,16 +706,23 @@ PyObject *WrapperRegistry::initModule()
 //******************************************************
 // Register members and exposed functions
 
-void setup(const std::string &filename, const std::vector<std::string> &args, PyObject *name_space)
+void setup(const bool python_lifecycle,
+           const std::string &filename,
+           const std::vector<std::string> &args,
+           PyObject *name_space)
 {
   WrapperRegistry::instance().construct(filename, args);
-  Py_Initialize();
+  if (python_lifecycle) {
+    Py_Initialize();
+  }
   WrapperRegistry::instance().runPreInit(name_space);
 }
 
-void finalize()
+void finalize(const bool python_lifecycle)
 {
-  Py_Finalize();
+  if (python_lifecycle) {
+    Py_Finalize();
+  }
   WrapperRegistry::instance().cleanup();
 }
 
diff --git a/extern/mantaflow/helper/pwrapper/registry.h b/extern/mantaflow/helper/pwrapper/registry.h
index aa63383515fc3b40b8f4d417aec791af741d3cf3..2273d0b9bb1cdf9747f10e94cec1aa79058b063d 100644
--- a/extern/mantaflow/helper/pwrapper/registry.h
+++ b/extern/mantaflow/helper/pwrapper/registry.h
@@ -48,8 +48,11 @@ template<class T> struct Namify {
 namespace Pb {
 
 // internal registry access
-void setup(const std::string &filename, const std::vector<std::string> &args, PyObject *name_space);
-void finalize();
+void setup(bool python_lifecycle,
+           const std::string &filename,
+           const std::vector<std::string> &args,
+           PyObject *name_space);
+void finalize(bool python_lifecycle);
 bool canConvert(PyObject *obj, const std::string &to);
 Manta::PbClass *objFromPy(PyObject *obj);
 Manta::PbClass *createPy(const std::string &classname,
diff --git a/extern/mantaflow/patches/local_namespace.diff b/extern/mantaflow/patches/local_namespace.diff
new file mode 100644
index 0000000000000000000000000000000000000000..41bc169677216dead9f2426765487c661e94d741
--- /dev/null
+++ b/extern/mantaflow/patches/local_namespace.diff
@@ -0,0 +1,86 @@
+diff --git a/extern/mantaflow/helper/pwrapper/registry.cpp b/extern/mantaflow/helper/pwrapper/registry.cpp
+index 5196c0409f8..b4206a41dea 100644
+--- a/extern/mantaflow/helper/pwrapper/registry.cpp
++++ b/extern/mantaflow/helper/pwrapper/registry.cpp
+@@ -115,7 +115,7 @@ class WrapperRegistry {
+   void construct(const std::string &scriptname, const vector<string> &args);
+   void cleanup();
+   void renameObjects();
+-  void runPreInit();
++  void runPreInit(PyObject *name_space);
+   PyObject *initModule();
+   ClassData *lookup(const std::string &name);
+   bool canConvert(ClassData *from, ClassData *to);
+@@ -505,7 +505,7 @@ void WrapperRegistry::addConstants(PyObject *module)
+   }
+ }
+ 
+-void WrapperRegistry::runPreInit()
++void WrapperRegistry::runPreInit(PyObject *name_space)
+ {
+   // add python directories to path
+   PyObject *sys_path = PySys_GetObject((char *)"path");
+@@ -518,7 +518,15 @@ void WrapperRegistry::runPreInit()
+   }
+   if (!mCode.empty()) {
+     mCode = "from manta import *\n" + mCode;
+-    PyRun_SimpleString(mCode.c_str());
++    PyObject *return_value = PyRun_String(mCode.c_str(), Py_file_input, name_space, name_space);
++    if (return_value == nullptr) {
++      if (PyErr_Occurred()) {
++        PyErr_Print();
++      }
++    }
++    else {
++      Py_DECREF(return_value);
++    }
+   }
+ }
+ 
+@@ -698,16 +706,23 @@ PyObject *WrapperRegistry::initModule()
+ //******************************************************
+ // Register members and exposed functions
+ 
+-void setup(const std::string &filename, const std::vector<std::string> &args)
++void setup(const bool python_lifecycle,
++           const std::string &filename,
++           const std::vector<std::string> &args,
++           PyObject *name_space)
+ {
+   WrapperRegistry::instance().construct(filename, args);
+-  Py_Initialize();
+-  WrapperRegistry::instance().runPreInit();
++  if (python_lifecycle) {
++    Py_Initialize();
++  }
++  WrapperRegistry::instance().runPreInit(name_space);
+ }
+ 
+-void finalize()
++void finalize(const bool python_lifecycle)
+ {
+-  Py_Finalize();
++  if (python_lifecycle) {
++    Py_Finalize();
++  }
+   WrapperRegistry::instance().cleanup();
+ }
+ 
+diff --git a/extern/mantaflow/helper/pwrapper/registry.h b/extern/mantaflow/helper/pwrapper/registry.h
+index d9d2bbb624b..2273d0b9bb1 100644
+--- a/extern/mantaflow/helper/pwrapper/registry.h
++++ b/extern/mantaflow/helper/pwrapper/registry.h
+@@ -48,8 +48,11 @@ template<class T> struct Namify {
+ namespace Pb {
+ 
+ // internal registry access
+-void setup(const std::string &filename, const std::vector<std::string> &args);
+-void finalize();
++void setup(bool python_lifecycle,
++           const std::string &filename,
++           const std::vector<std::string> &args,
++           PyObject *name_space);
++void finalize(bool python_lifecycle);
+ bool canConvert(PyObject *obj, const std::string &to);
+ Manta::PbClass *objFromPy(PyObject *obj);
+ Manta::PbClass *createPy(const std::string &classname,
diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp
index 000bc313ab15ffe40ba406ba515b447bfd79463e..f1bdc10e7f9c6fc497a5761342264d33240db8cf 100644
--- a/intern/mantaflow/intern/MANTA_main.cpp
+++ b/intern/mantaflow/intern/MANTA_main.cpp
@@ -562,6 +562,8 @@ MANTA::~MANTA()
   pythonCommands.push_back(finalString);
   result = runPythonString(pythonCommands);
 
+  MANTA::terminateMantaflow();
+
   BLI_assert(result);
   UNUSED_VARS(result);
 }
@@ -692,7 +694,7 @@ void MANTA::initializeMantaflow()
 
   PyObject *manta_main_module = manta_python_main_module_ensure();
   PyObject *globals_dict = PyModule_GetDict(manta_main_module);
-  Pb::setup(filename, fill, globals_dict); /* Namespace from Mantaflow (registry). */
+  Pb::setup(false, filename, fill, globals_dict); /* Namespace from Mantaflow (registry). */
   PyGILState_Release(gilstate);
 }
 
@@ -702,7 +704,7 @@ void MANTA::terminateMantaflow()
     cout << "Fluid: Releasing Mantaflow framework" << endl;
 
   PyGILState_STATE gilstate = PyGILState_Ensure();
-  Pb::finalize(); /* Namespace from Mantaflow (registry). */
+  Pb::finalize(false); /* Namespace from Mantaflow (registry). */
   manta_python_main_module_clear();
   PyGILState_Release(gilstate);
 }