diff --git a/source/blender/editors/transform/transform.cc b/source/blender/editors/transform/transform.cc
index 5541d8e31cc..c003ba7fb7a 100644
--- a/source/blender/editors/transform/transform.cc
+++ b/source/blender/editors/transform/transform.cc
@@ -703,7 +703,10 @@ static bool transform_modal_item_poll(const wmOperator *op, int value)
         return false;
       }
       break;
+    case TFM_MODAL_NO_MODAL_TRANSFORM:
+        break;
     }
+
   }
   return true;
 }
@@ -758,7 +761,8 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf)
       {TFM_MODAL_AUTOCONSTRAINT, "AUTOCONSTRAIN", 0, "Automatic Constraint", ""},
       {TFM_MODAL_AUTOCONSTRAINTPLANE, "AUTOCONSTRAINPLANE", 0, "Automatic Constraint Plane", ""},
       {TFM_MODAL_PRECISION, "PRECISION", 0, "Precision Mode", ""},
-      {0, nullptr, 0, nullptr, nullptr},
+      {TFM_MODAL_NO_MODAL_TRANSFORM, "NO_MODAL_TRANSFORM", 0, "Allow movements around the scene",""},
+    {0, nullptr, 0, nullptr, nullptr},
   };
 
   wmKeyMap *keymap = WM_modalkeymap_ensure(keyconf, "Transform Modal Map", modal_items);
@@ -957,12 +961,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))
@@ -1003,6 +1069,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:
@@ -2045,6 +2116,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;
@@ -2157,7 +2234,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 734c6200490..74b16fc8586 100644
--- a/source/blender/editors/transform/transform.hh
+++ b/source/blender/editors/transform/transform.hh
@@ -150,6 +150,8 @@ enum eTFlag {
 
   /** Special flag for when the transform code is called after keys have been duplicated. */
   T_DUPLICATED_KEYFRAMES = 1 << 26,
+
+  T_TRANSFORM_NO_MODAL = 1 << 28,
 };
 ENUM_OPERATORS(eTFlag, T_DUPLICATED_KEYFRAMES);
 
@@ -283,6 +285,8 @@ enum {
 
   TFM_MODAL_EDIT_SNAP_SOURCE_ON = 34,
   TFM_MODAL_EDIT_SNAP_SOURCE_OFF = 35,
+
+  TFM_MODAL_NO_MODAL_TRANSFORM = 36,
 };
 
 /** \} */
@@ -559,6 +563,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 1ab5f64c674..e0223ed5d2a 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. */
   }
