diff --git a/diff/mb-0001-operator-repeat.diff b/diff/mb-0001-operator-repeat.diff
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/source/blender/editors/transform/transform.cc b/source/blender/editors/transform/transform.cc
index 6acb7adf2eb..4dc827d61b5 100644
--- a/source/blender/editors/transform/transform.cc
+++ b/source/blender/editors/transform/transform.cc
@@ -1301,6 +1301,10 @@ int transformEvent(TransInfo *t, const wmEvent *event)
   /* Else do non-mapped events. */
   else if (event->val == KM_PRESS) {
     switch (event->type) {
+      case EVT_MKEY :
+        t->flag |= T_TRANSFORM_MULTIPLE;
+        handled = true;
+        break;
       case EVT_CKEY:
         if (event->flag & WM_EVENT_IS_REPEAT) {
           break;
@@ -1828,6 +1832,12 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
     RNA_property_boolean_set(
         op->ptr, prop, (t->settings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT_SLIDE) != 0);
   }
+
+  if ((prop = RNA_struct_find_property(op->ptr, "transform_multiple"))) {
+    RNA_boolean_set(op->ptr, "transform_multiple", (t->flag & T_TRANSFORM_MULTIPLE) != 0);
+    
+  }
+
 }
 
 static void initSnapSpatial(TransInfo *t, float r_snap[3], float *r_snap_precision)
@@ -1924,6 +1934,12 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
 
   initTransInfo(C, t, op, event);
 
+  if (prop = RNA_struct_find_property(op->ptr, "transform_multiple")) {
+    if (RNA_boolean_get(op->ptr, "transform_multiple")) {
+      t->flag |= T_TRANSFORM_MULTIPLE;
+    }
+  }
+
   if (t->spacetype == SPACE_VIEW3D) {
     t->draw_handle_view = ED_region_draw_cb_activate(
         t->region->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
@@ -2177,6 +2193,10 @@ int transformEnd(bContext *C, TransInfo *t)
       exit_code = OPERATOR_FINISHED;
     }
 
+    if (t->state == TRANS_CONFIRM && (t->flag & T_TRANSFORM_MULTIPLE)) {
+      exit_code |= OPERATOR_REPEAT;
+    }
+
     /* aftertrans does insert keyframes, and clears base flags; doesn't read transdata */
     special_aftertrans_update(C, t);
 
diff --git a/source/blender/editors/transform/transform.hh b/source/blender/editors/transform/transform.hh
index 734c6200490..854aca98b7f 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_MULTIPLE = 1 << 27,
 };
 ENUM_OPERATORS(eTFlag, T_DUPLICATED_KEYFRAMES);
 
diff --git a/source/blender/editors/transform/transform_ops.cc b/source/blender/editors/transform/transform_ops.cc
index 1ab5f64c674..74a1aaefc45 100644
--- a/source/blender/editors/transform/transform_ops.cc
+++ b/source/blender/editors/transform/transform_ops.cc
@@ -821,6 +821,8 @@ void Transform_Properties(wmOperatorType *ot, int flags)
                            "Forces the use of Auto Merge and Split");
     RNA_def_property_flag(prop, PROP_HIDDEN);
   }
+
+  RNA_def_boolean(ot->srna, "transform_multiple", 0, "Multiple", "Apply Multiple times");
 }
 
 static void TRANSFORM_OT_translate(wmOperatorType *ot)
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index e5f17026601..a69af498c5d 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -626,10 +626,12 @@ enum {
    * \note this isn't great design (using operators to trigger UI) avoid where possible.
    */
   OPERATOR_INTERFACE = (1 << 5),
+  /* Create a new operator based on current */
+  OPERATOR_REPEAT = (1 << 6),
 };
 #define OPERATOR_FLAGS_ALL \
   (OPERATOR_RUNNING_MODAL | OPERATOR_CANCELLED | OPERATOR_FINISHED | OPERATOR_PASS_THROUGH | \
-   OPERATOR_HANDLED | OPERATOR_INTERFACE | 0)
+   OPERATOR_HANDLED | OPERATOR_INTERFACE | OPERATOR_REPEAT | 0)
 
 /* sanity checks for debug mode only */
 #define OPERATOR_RETVAL_CHECK(ret) \
diff --git a/source/blender/windowmanager/intern/wm_event_system.cc b/source/blender/windowmanager/intern/wm_event_system.cc
index b5a82c0143f..8fd12a66621 100644
--- a/source/blender/windowmanager/intern/wm_event_system.cc
+++ b/source/blender/windowmanager/intern/wm_event_system.cc
@@ -2506,6 +2506,9 @@ static eHandlerActionFlag wm_handler_operator_call(bContext *C,
           CTX_wm_area_set(C, area);
           CTX_wm_region_set(C, region);
         }
+        else if (retval & OPERATOR_REPEAT) {
+           wm_operator_invoke(C, ot, event, properties, NULL, false, true);
+        }
         else {
           /* This special cases is for areas and regions that get removed. */
           CTX_wm_area_set(C, nullptr);
