diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go
index 1f4d25f..b9ff7d7 100644
--- a/pkg/service/mapfixes.go
+++ b/pkg/service/mapfixes.go
@@ -522,6 +522,72 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac
 	return nil
 }
 
+// ActionMapfixResetSubmitting implements actionMapfixResetSubmitting operation.
+//
+// Role MapfixReview changes status from Submitting -> UnderConstruction.
+//
+// POST /mapfixes/{MapfixID}/status/reset-submitting
+func (svc *Service) ActionMapfixResetSubmitting(ctx context.Context, params api.ActionMapfixResetSubmittingParams) error {
+	userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle)
+	if !ok {
+		return ErrUserInfo
+	}
+
+	userId, err := userInfo.GetUserID()
+	if err != nil {
+		return err
+	}
+
+	// check when mapfix was updated
+	mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID)
+	if err != nil {
+		return err
+	}
+	if time.Now().Before(mapfix.UpdatedAt.Add(time.Second*10)) {
+		// the last time the mapfix was updated must be longer than 10 seconds ago
+		return ErrDelayReset
+	}
+
+	// check if caller has required role
+	has_role := userId == mapfix.Submitter
+	if !has_role {
+		return ErrPermissionDeniedNotSubmitter
+	}
+
+	// transaction
+	target_status := model.MapfixStatusUnderConstruction
+	smap := datastore.Optional()
+	smap.Add("status_id", target_status)
+	smap.Add("status_message", "Manually forced reset")
+	err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitting}, smap)
+	if err != nil {
+		return err
+	}
+
+	event_data := model.AuditEventDataAction{
+		TargetStatus: uint32(target_status),
+	}
+
+	EventData, err := json.Marshal(event_data)
+	if err != nil {
+		return err
+	}
+
+	_, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{
+		ID:           0,
+		User:         userId,
+		ResourceType: model.ResourceMapfix,
+		ResourceID:   params.MapfixID,
+		EventType:    model.AuditEventTypeAction,
+		EventData:    EventData,
+	})
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 // ActionMapfixTriggerUpload invokes actionMapfixTriggerUpload operation.
 //
 // Role Admin changes status from Validated -> Uploading.
diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go
index 8e3abd6..c81c24a 100644
--- a/pkg/service/submissions.go
+++ b/pkg/service/submissions.go
@@ -543,6 +543,72 @@ func (svc *Service) ActionSubmissionTriggerSubmit(ctx context.Context, params ap
 	return nil
 }
 
+// ActionSubmissionResetSubmitting implements actionSubmissionResetSubmitting operation.
+//
+// Role SubmissionReview changes status from Submitting -> UnderConstruction.
+//
+// POST /submissions/{SubmissionID}/status/reset-submitting
+func (svc *Service) ActionSubmissionResetSubmitting(ctx context.Context, params api.ActionSubmissionResetSubmittingParams) error {
+	userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle)
+	if !ok {
+		return ErrUserInfo
+	}
+
+	userId, err := userInfo.GetUserID()
+	if err != nil {
+		return err
+	}
+
+	// check when submission was updated
+	submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID)
+	if err != nil {
+		return err
+	}
+	if time.Now().Before(submission.UpdatedAt.Add(time.Second*10)) {
+		// the last time the submission was updated must be longer than 10 seconds ago
+		return ErrDelayReset
+	}
+
+	// check if caller has required role
+	has_role := userId == submission.Submitter
+	if !has_role {
+		return ErrPermissionDeniedNotSubmitter
+	}
+
+	// transaction
+	target_status := model.SubmissionStatusUnderConstruction
+	smap := datastore.Optional()
+	smap.Add("status_id", target_status)
+	smap.Add("status_message", "Manually forced reset")
+	err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitting}, smap)
+	if err != nil {
+		return err
+	}
+
+	event_data := model.AuditEventDataAction{
+		TargetStatus: uint32(target_status),
+	}
+
+	EventData, err := json.Marshal(event_data)
+	if err != nil {
+		return err
+	}
+
+	_, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{
+		ID:           0,
+		User:         userId,
+		ResourceType: model.ResourceSubmission,
+		ResourceID:   params.SubmissionID,
+		EventType:    model.AuditEventTypeAction,
+		EventData:    EventData,
+	})
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 // ActionSubmissionTriggerUpload invokes actionSubmissionTriggerUpload operation.
 //
 // Role Admin changes status from Validated -> Uploading.