diff --git a/trac/ticket/roadmap.py b/trac/ticket/roadmap.py
--- a/trac/ticket/roadmap.py
+++ b/trac/ticket/roadmap.py
@@ -644,7 +644,7 @@
         if milestone.exists:
             milestone.update()
             # eventually retarget opened tickets associated with the milestone
-            if 'retarget' in req.args:
+            if 'retarget' in req.args and completed:
                 cursor = db.cursor()
                 cursor.execute("UPDATE ticket SET milestone=%s WHERE "
                                "milestone=%s and status != 'closed'",
diff --git a/trac/ticket/templates/milestone_edit.html b/trac/ticket/templates/milestone_edit.html
--- a/trac/ticket/templates/milestone_edit.html
+++ b/trac/ticket/templates/milestone_edit.html
@@ -66,7 +66,7 @@
             </label>
             <py:if test="milestones">
               <br/>
-              <input type="checkbox" id="retarget" name="retarget" checked="checked" />
+              <input type="checkbox" id="retarget" name="retarget" checked="${not milestone.completed or None}" />
               <label>Retarget associated open tickets to milestone:
                 <select id="target" name="target" py:with="t = req.args.get('target')">
                   <option value="">None</option>
