diff --git a/source/blender/editors/transform/transform.cc b/source/blender/editors/transform/transform.cc
index 197a0e3c025..6b00a7bda10 100644
--- a/source/blender/editors/transform/transform.cc
+++ b/source/blender/editors/transform/transform.cc
@@ -711,6 +711,8 @@ static bool transform_modal_item_poll(const wmOperator *op, int value)
     }
     case TFM_MODAL_PASSTHROUGH_NAVIGATE:
       return t->vod != nullptr;
+    case TFM_MODAL_NO_MODAL_TRANSFORM:
+        break;
   }
   return true;
 }
@@ -766,6 +768,7 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf)
       {TFM_MODAL_AUTOCONSTRAINTPLANE, "AUTOCONSTRAINPLANE", 0, "Automatic Constraint Plane", ""},
       {TFM_MODAL_PRECISION, "PRECISION", 0, "Precision Mode", ""},
       {TFM_MODAL_PASSTHROUGH_NAVIGATE, "PASSTHROUGH_NAVIGATE", 0, "Navigate", ""},
+      {TFM_MODAL_NO_MODAL_TRANSFORM, "NO_MODAL_TRANSFORM", 0, "Allow movements around the scene",""},
       {0, nullptr, 0, nullptr, nullptr},
   };
 
@@ -965,12 +968,74 @@ static bool transform_event_modal_constraint(TransInfo *t, short modal_type)
   return true;
 }
 
+static void switchTransformNoModal(TransInfo *t, const wmEvent *event) {
+  t->flag ^= T_TRANSFORM_NO_MODAL;
+
+  {
+    // Enable/Disable modal events allowing to be processed as non-modal events
+    wmKeyMapItem *kmi;
+    for (kmi =(wmKeyMapItem*) t->keymap->items.first; kmi; kmi = kmi->next)
+    {
+      if (ELEM(kmi->type, LEFTMOUSE, RIGHTMOUSE, MIDDLEMOUSE, WHEELDOWNMOUSE, WHEELUPMOUSE)) {
+        if ((t->flag & T_TRANSFORM_NO_MODAL) == 0) {
+          kmi->flag &= ~KMI_INACTIVE;
+        }
+        else {
+          kmi->flag |= KMI_INACTIVE;
+        }
+      }
+    }
+  }
+  if ((t->flag & T_TRANSFORM_NO_MODAL) == 0) {
+    // Transform Restart
+  }
+}
+
+
 int transformEvent(TransInfo *t, const wmEvent *event)
 {
   bool handled = false;
   bool is_navigating = t->vod ? ((RegionView3D *)t->region->regiondata)->rflag & RV3D_NAVIGATING :
                                 false;
 
+  if (t->flag & T_TRANSFORM_NO_MODAL) {
+    if (ELEM(event->val, KM_PRESS, KM_RELEASE) &&
+        ELEM(event->type, LEFTMOUSE, RIGHTMOUSE, MIDDLEMOUSE))
+    {
+      return OPERATOR_PASS_THROUGH;
+    }
+    else if (ELEM(event->type,
+                  BUTTON4MOUSE,
+                  BUTTON5MOUSE,
+                  BUTTON6MOUSE,
+                  BUTTON7MOUSE,
+                  MOUSEPAN,
+                  MOUSEZOOM,
+                  MOUSEROTATE,
+                  WHEELINMOUSE,
+                  WHEELOUTMOUSE,
+                  WHEELUPMOUSE,
+                  WHEELDOWNMOUSE))
+    {
+      return OPERATOR_PASS_THROUGH;
+    }
+    else if (event->type == EVT_MODAL_MAP) {
+      switch (event->val) {
+        case TFM_MODAL_CANCEL:
+          t->state = TRANS_CANCEL;
+          break;
+        case TFM_MODAL_CONFIRM:
+          t->state = TRANS_CONFIRM;
+          break;
+        case TFM_MODAL_NO_MODAL_TRANSFORM:
+          t->redraw |= TREDRAW_HARD;  // Redraw the Header
+          switchTransformNoModal(t, event);
+          break;
+      }
+    }
+    return 0;
+  }
+
   /* Handle modal numinput events first, if already activated. */
   if (!is_navigating && ((event->val == KM_PRESS) || (event->type == EVT_MODAL_MAP)) &&
       hasNumInput(&t->num) && handleNumInput(t->context, &(t->num), event))
@@ -1011,6 +1076,11 @@ int transformEvent(TransInfo *t, const wmEvent *event)
           handled = true;
         }
         break;
+      case TFM_MODAL_NO_MODAL_TRANSFORM:
+        switchTransformNoModal(t, event);
+        handled = true;
+        t->redraw |= TREDRAW_HARD;
+        break;
       case TFM_MODAL_TRANSLATE:
       case TFM_MODAL_ROTATE:
       case TFM_MODAL_RESIZE:
@@ -2053,6 +2123,12 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
   calculatePropRatio(t);
   calculateCenter(t);
 
+  if (t->spacetype == SPACE_VIEW3D) {
+    float p[3] = {0, 0, 0};
+    ED_view3d_win_to_3d_int((View3D*) t->view, t->region, p, event->mval, t->iloc);
+  }
+
+
   if (event) {
     /* Initialize accurate transform to settings requested by keymap. */
     bool use_accurate = false;
@@ -2163,7 +2239,7 @@ void transformApply(bContext *C, TransInfo *t)
 
 int transformEnd(bContext *C, TransInfo *t)
 {
-  int exit_code = OPERATOR_RUNNING_MODAL;
+  int exit_code = (t->flag & T_TRANSFORM_NO_MODAL) ? OPERATOR_HANDLED : OPERATOR_RUNNING_MODAL;
 
   t->context = C;
 
diff --git a/source/blender/editors/transform/transform.hh b/source/blender/editors/transform/transform.hh
index 76312fdbda0..1bfb97e4d0a 100644
--- a/source/blender/editors/transform/transform.hh
+++ b/source/blender/editors/transform/transform.hh
@@ -285,6 +285,7 @@ enum {
   TFM_MODAL_EDIT_SNAP_SOURCE_OFF = 35,
 
   TFM_MODAL_PASSTHROUGH_NAVIGATE = 36,
+  TFM_MODAL_NO_MODAL_TRANSFORM = 37,
 };
 
 /** \} */
@@ -561,6 +562,8 @@ struct TransInfo {
   /** Mouse side of the current frame, 'L', 'R' or 'B' */
   char frame_side;
 
+  float iloc[3]; /* Initial location */
+
   /** copy from #RegionView3D, prevents feedback. */
   float viewmat[4][4];
   /** and to make sure we don't have to. */
diff --git a/source/blender/editors/transform/transform_ops.cc b/source/blender/editors/transform/transform_ops.cc
index d75821f6bd9..189a6378450 100644
--- a/source/blender/editors/transform/transform_ops.cc
+++ b/source/blender/editors/transform/transform_ops.cc
@@ -463,7 +463,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event)
 
   exit_code |= transformEnd(C, t);
 
-  if ((exit_code & OPERATOR_RUNNING_MODAL) == 0) {
+  if ((exit_code & (OPERATOR_CANCELLED | OPERATOR_FINISHED))) {
     transformops_exit(C, op);
     exit_code &= ~OPERATOR_PASS_THROUGH; /* Preventively remove pass-through. */
   }
diff --git a/source/blender/mblender/patches/MB_0006.h b/source/blender/mblender/patches/MB_0006.h
new file mode 100644
index 00000000000..c978e52a11c
--- /dev/null
+++ b/source/blender/mblender/patches/MB_0006.h
@@ -0,0 +1 @@
+/* Empty File */
\ No newline at end of file
