diff --git a/hgext/rebase.py b/hgext/rebase.py
index c96148346af824cc4b17b6e875e481d6a7638b3b_aGdleHQvcmViYXNlLnB5..e66084ef84497a3fa70507f2b2839a74250f7a38_aGdleHQvcmViYXNlLnB5 100644
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -15,7 +15,7 @@
 '''
 
 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
-from mercurial import extensions, patch, scmutil
+from mercurial import extensions, patch, scmutil, phases
 from mercurial.commands import templateopts
 from mercurial.node import nullrev
 from mercurial.lock import release
@@ -372,6 +372,10 @@
         newrev = repo.commit(text=commitmsg, user=ctx.user(),
                              date=ctx.date(), extra=extra, editor=editor)
         repo.dirstate.setbranch(repo[newrev].branch())
+        targetphase = max(ctx.phase(), phases.draft)
+        # retractboundary doesn't overwrite upper phase inherited from parent
+        newnode = repo[newrev].node()
+        phases.retractboundary(repo, targetphase, [newnode])
         return newrev
     except util.Abort:
         # Invalidate the previous setparents
@@ -552,7 +556,13 @@
 
 def abort(repo, originalwd, target, state):
     'Restore the repository to its original state'
-    if set(repo.changelog.descendants(target)) - set(state.values()):
+    descendants = repo.changelog.descendants
+    ispublic = lambda r: repo._phaserev[r] == phases.public
+    if filter(ispublic, descendants(target)):
+        repo.ui.warn(_("warning: immutable rebased changeset detected, "
+                       "can't abort\n"))
+        return -1
+    elif set(descendants(target)) - set(state.values()):
         repo.ui.warn(_("warning: new changesets detected on target branch, "
                                                     "can't abort\n"))
         return -1
diff --git a/tests/test-rebase-abort.t b/tests/test-rebase-abort.t
index c96148346af824cc4b17b6e875e481d6a7638b3b_dGVzdHMvdGVzdC1yZWJhc2UtYWJvcnQudA==..e66084ef84497a3fa70507f2b2839a74250f7a38_dGVzdHMvdGVzdC1yZWJhc2UtYWJvcnQudA== 100644
--- a/tests/test-rebase-abort.t
+++ b/tests/test-rebase-abort.t
@@ -7,7 +7,7 @@
   > publish=False
   > 
   > [alias]
-  > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 
@@ -35,4 +35,6 @@
   $ mv common.new common
   $ hg ci -m L2
 
+  $ hg phase --force --secret 2
+
   $ hg tglog
@@ -38,5 +40,3 @@
   $ hg tglog
-  @  4: 'L2'
-  |
-  o  3: 'L1'
+  @  4:draft 'L2'
   |
@@ -42,3 +42,5 @@
   |
-  | o  2: 'C3'
+  o  3:draft 'L1'
+  |
+  | o  2:secret 'C3'
   |/
@@ -44,3 +46,3 @@
   |/
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
@@ -46,5 +48,5 @@
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
 
 Conflicting rebase:
@@ -63,5 +65,5 @@
   rebase aborted
 
   $ hg tglog
-  @  4: 'L2'
+  @  4:draft 'L2'
   |
@@ -67,3 +69,3 @@
   |
-  o  3: 'L1'
+  o  3:draft 'L1'
   |
@@ -69,3 +71,3 @@
   |
-  | o  2: 'C3'
+  | o  2:secret 'C3'
   |/
@@ -71,3 +73,3 @@
   |/
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
@@ -73,5 +75,5 @@
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
   $ cd ..
 
@@ -104,6 +106,9 @@
   $ hg ci -Am C1
   adding c
 
+  $ hg phase --force --secret 1
+  $ hg phase --public 1
+
 Rebase and abort without generating new changesets:
 
   $ hg tglog
@@ -107,5 +112,5 @@
 Rebase and abort without generating new changesets:
 
   $ hg tglog
-  @  4: 'C1'
+  @  4:draft 'C1'
   |
@@ -111,3 +116,3 @@
   |
-  o  3: 'B bis'
+  o  3:draft 'B bis'
   |
@@ -113,3 +118,3 @@
   |
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
@@ -115,3 +120,3 @@
   | |
-  | o  1: 'B'
+  | o  1:public 'B'
   |/
@@ -117,5 +122,5 @@
   |/
-  o  0: 'A'
+  o  0:public 'A'
   
   $ hg rebase -b 4 -d 2
   merging c
@@ -125,5 +130,5 @@
   [255]
 
   $ hg tglog
-  @  4: 'C1'
+  @  4:draft 'C1'
   |
@@ -129,3 +134,3 @@
   |
-  o  3: 'B bis'
+  o  3:draft 'B bis'
   |
@@ -131,3 +136,3 @@
   |
-  | @  2: 'C'
+  | @  2:secret 'C'
   | |
@@ -133,3 +138,3 @@
   | |
-  | o  1: 'B'
+  | o  1:public 'B'
   |/
@@ -135,7 +140,7 @@
   |/
-  o  0: 'A'
+  o  0:public 'A'
   
   $ hg rebase -a
   rebase aborted
 
   $ hg tglog
@@ -137,7 +142,7 @@
   
   $ hg rebase -a
   rebase aborted
 
   $ hg tglog
-  @  4: 'C1'
+  @  4:draft 'C1'
   |
@@ -143,3 +148,3 @@
   |
-  o  3: 'B bis'
+  o  3:draft 'B bis'
   |
@@ -145,3 +150,3 @@
   |
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
@@ -147,3 +152,3 @@
   | |
-  | o  1: 'B'
+  | o  1:public 'B'
   |/
@@ -149,3 +154,3 @@
   |/
-  o  0: 'A'
+  o  0:public 'A'
   
diff --git a/tests/test-rebase-check-restore.t b/tests/test-rebase-check-restore.t
index c96148346af824cc4b17b6e875e481d6a7638b3b_dGVzdHMvdGVzdC1yZWJhc2UtY2hlY2stcmVzdG9yZS50..e66084ef84497a3fa70507f2b2839a74250f7a38_dGVzdHMvdGVzdC1yZWJhc2UtY2hlY2stcmVzdG9yZS50 100644
--- a/tests/test-rebase-check-restore.t
+++ b/tests/test-rebase-check-restore.t
@@ -7,7 +7,7 @@
   > publish=False
   > 
   > [alias]
-  > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 
@@ -46,7 +46,7 @@
   $ cd ..
 
 
-Rebasing B onto E - check keep:
+Rebasing B onto E - check keep: and phases
 
   $ hg clone -q -u . a a1
   $ cd a1
@@ -50,5 +50,6 @@
 
   $ hg clone -q -u . a a1
   $ cd a1
+  $ hg phase --force --secret 2
 
   $ hg tglog
@@ -53,4 +54,4 @@
 
   $ hg tglog
-  @  5: 'F' notdefault
+  @  5:draft 'F' notdefault
   |
@@ -56,3 +57,3 @@
   |
-  | o  4: 'E'
+  | o  4:draft 'E'
   | |
@@ -58,3 +59,3 @@
   | |
-  | o  3: 'D'
+  | o  3:draft 'D'
   |/
@@ -60,3 +61,3 @@
   |/
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
@@ -62,3 +63,3 @@
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -64,5 +65,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg rebase -s 1 -d 4 --keep
   merging A
@@ -79,5 +80,5 @@
   $ hg rebase --continue
 
   $ hg tglog
-  @  7: 'C'
+  @  7:secret 'C'
   |
@@ -83,3 +84,3 @@
   |
-  o  6: 'B'
+  o  6:draft 'B'
   |
@@ -85,3 +86,3 @@
   |
-  | o  5: 'F' notdefault
+  | o  5:draft 'F' notdefault
   | |
@@ -87,3 +88,3 @@
   | |
-  o |  4: 'E'
+  o |  4:draft 'E'
   | |
@@ -89,3 +90,3 @@
   | |
-  o |  3: 'D'
+  o |  3:draft 'D'
   |/
@@ -91,3 +92,3 @@
   |/
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
@@ -93,3 +94,3 @@
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -95,5 +96,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ cd ..
 
@@ -102,5 +103,6 @@
 
   $ hg clone -q -u . a a2
   $ cd a2
+  $ hg phase --force --secret 2
 
   $ hg tglog
@@ -105,4 +107,4 @@
 
   $ hg tglog
-  @  5: 'F' notdefault
+  @  5:draft 'F' notdefault
   |
@@ -108,3 +110,3 @@
   |
-  | o  4: 'E'
+  | o  4:draft 'E'
   | |
@@ -110,3 +112,3 @@
   | |
-  | o  3: 'D'
+  | o  3:draft 'D'
   |/
@@ -112,3 +114,3 @@
   |/
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
@@ -114,3 +116,3 @@
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -116,5 +118,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg rebase -s 5 -d 4 --keepbranches
   merging A
@@ -132,5 +134,5 @@
   saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
-  @  5: 'F' notdefault
+  @  5:draft 'F' notdefault
   |
@@ -136,3 +138,3 @@
   |
-  o  4: 'E'
+  o  4:draft 'E'
   |
@@ -138,3 +140,3 @@
   |
-  o  3: 'D'
+  o  3:draft 'D'
   |
@@ -140,3 +142,3 @@
   |
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
@@ -142,3 +144,3 @@
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -144,3 +146,3 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
diff --git a/tests/test-rebase-collapse.t b/tests/test-rebase-collapse.t
index c96148346af824cc4b17b6e875e481d6a7638b3b_dGVzdHMvdGVzdC1yZWJhc2UtY29sbGFwc2UudA==..e66084ef84497a3fa70507f2b2839a74250f7a38_dGVzdHMvdGVzdC1yZWJhc2UtY29sbGFwc2UudA== 100644
--- a/tests/test-rebase-collapse.t
+++ b/tests/test-rebase-collapse.t
@@ -8,6 +8,7 @@
   > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 Create repo a:
@@ -43,8 +44,9 @@
   $ cd ..
 
 
-Rebasing B onto H:
+Rebasing B onto H and collapsing changesets with different phases:
+
 
   $ hg clone -q -u 3 a a1
   $ cd a1
 
@@ -47,7 +49,9 @@
 
   $ hg clone -q -u 3 a a1
   $ cd a1
 
+  $ hg phase --force --secret 3
+
   $ hg rebase --collapse --keepbranches
   saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
 
@@ -51,8 +55,8 @@
   $ hg rebase --collapse --keepbranches
   saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
 
-  $ hg tglog
-  @  5: 'Collapsed revision
+  $ hg tglogp
+  @  5:secret 'Collapsed revision
   |  * B
   |  * C
   |  * D'
@@ -56,5 +60,5 @@
   |  * B
   |  * C
   |  * D'
-  o  4: 'H'
+  o  4:draft 'H'
   |
@@ -60,3 +64,3 @@
   |
-  | o  3: 'G'
+  | o  3:draft 'G'
   |/|
@@ -62,3 +66,3 @@
   |/|
-  o |  2: 'F'
+  o |  2:draft 'F'
   | |
@@ -64,3 +68,3 @@
   | |
-  | o  1: 'E'
+  | o  1:draft 'E'
   |/
@@ -66,5 +70,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg manifest
   A
@@ -82,6 +86,7 @@
   $ hg clone -q -u . a a2
   $ cd a2
 
+  $ hg phase --force --secret 6
   $ hg rebase --source 4 --collapse
   saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
 
diff --git a/tests/test-rebase-conflicts.t b/tests/test-rebase-conflicts.t
index c96148346af824cc4b17b6e875e481d6a7638b3b_dGVzdHMvdGVzdC1yZWJhc2UtY29uZmxpY3RzLnQ=..e66084ef84497a3fa70507f2b2839a74250f7a38_dGVzdHMvdGVzdC1yZWJhc2UtY29uZmxpY3RzLnQ= 100644
--- a/tests/test-rebase-conflicts.t
+++ b/tests/test-rebase-conflicts.t
@@ -7,7 +7,7 @@
   > publish=False
   > 
   > [alias]
-  > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
   $ hg init a
@@ -37,4 +37,6 @@
   $ hg add extra2
   $ hg ci -m L3
 
+  $ hg phase --force --secret 4
+
   $ hg tglog
@@ -40,3 +42,3 @@
   $ hg tglog
-  @  5: 'L3'
+  @  5:secret 'L3'
   |
@@ -42,3 +44,3 @@
   |
-  o  4: 'L2'
+  o  4:secret 'L2'
   |
@@ -44,3 +46,3 @@
   |
-  o  3: 'L1'
+  o  3:draft 'L1'
   |
@@ -46,3 +48,3 @@
   |
-  | o  2: 'C3'
+  | o  2:draft 'C3'
   |/
@@ -48,3 +50,3 @@
   |/
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
@@ -50,5 +52,5 @@
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
 Try to call --continue:
 
@@ -79,5 +81,5 @@
   saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
-  @  5: 'L3'
+  @  5:secret 'L3'
   |
@@ -83,3 +85,3 @@
   |
-  o  4: 'L2'
+  o  4:secret 'L2'
   |
@@ -85,3 +87,3 @@
   |
-  o  3: 'L1'
+  o  3:draft 'L1'
   |
@@ -87,3 +89,3 @@
   |
-  o  2: 'C3'
+  o  2:draft 'C3'
   |
@@ -89,3 +91,3 @@
   |
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
@@ -91,5 +93,5 @@
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
 Check correctness:
 
diff --git a/tests/test-rebase-detach.t b/tests/test-rebase-detach.t
index c96148346af824cc4b17b6e875e481d6a7638b3b_dGVzdHMvdGVzdC1yZWJhc2UtZGV0YWNoLnQ=..e66084ef84497a3fa70507f2b2839a74250f7a38_dGVzdHMvdGVzdC1yZWJhc2UtZGV0YWNoLnQ= 100644
--- a/tests/test-rebase-detach.t
+++ b/tests/test-rebase-detach.t
@@ -47,6 +47,7 @@
   |/
   o  0: 'A'
   
+  $ hg phase --force --secret 3
   $ hg rebase --detach -s 3 -d 7
   saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
 
@@ -50,6 +51,6 @@
   $ hg rebase --detach -s 3 -d 7
   saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
 
-  $ hg tglog
-  @  7: 'D'
+  $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+  @  7:secret 'D'
   |
@@ -55,3 +56,3 @@
   |
-  o  6: 'H'
+  o  6:draft 'H'
   |
@@ -57,3 +58,3 @@
   |
-  | o  5: 'G'
+  | o  5:draft 'G'
   |/|
@@ -59,3 +60,3 @@
   |/|
-  o |  4: 'F'
+  o |  4:draft 'F'
   | |
@@ -61,3 +62,3 @@
   | |
-  | o  3: 'E'
+  | o  3:draft 'E'
   |/
@@ -63,3 +64,3 @@
   |/
-  | o  2: 'C'
+  | o  2:draft 'C'
   | |
@@ -65,3 +66,3 @@
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -67,5 +68,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg manifest
   A
@@ -185,6 +186,7 @@
 
   $ hg clone -q -u . a a4
   $ cd a4
+  $ hg phase --force --secret 3
 
   $ hg tglog
   @  7: 'H'
@@ -206,7 +208,7 @@
   $ hg rebase --detach --collapse -s 2 -d 7
   saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
 
-  $ hg tglog
-  @  6: 'Collapsed revision
+  $ hg  log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+  @  6:secret 'Collapsed revision
   |  * C
   |  * D'
@@ -211,4 +213,4 @@
   |  * C
   |  * D'
-  o  5: 'H'
+  o  5:draft 'H'
   |
@@ -214,3 +216,3 @@
   |
-  | o  4: 'G'
+  | o  4:draft 'G'
   |/|
@@ -216,3 +218,3 @@
   |/|
-  o |  3: 'F'
+  o |  3:draft 'F'
   | |
@@ -218,3 +220,3 @@
   | |
-  | o  2: 'E'
+  | o  2:draft 'E'
   |/
@@ -220,3 +222,3 @@
   |/
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -222,5 +224,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg manifest
   A
@@ -360,10 +362,10 @@
 
   $ cd ..
 
-Ensure --continue restores a correct state (issue3046):
+Ensure --continue restores a correct state (issue3046) and phase:
   $ hg clone -q a a7
   $ cd a7
   $ hg up -q 3
   $ echo 'H2' > H
   $ hg ci -A -m 'H2'
   adding H
@@ -364,9 +366,10 @@
   $ hg clone -q a a7
   $ cd a7
   $ hg up -q 3
   $ echo 'H2' > H
   $ hg ci -A -m 'H2'
   adding H
+  $ hg phase --force --secret 8
   $ hg rebase -s 8 -d 7 --detach --config ui.merge=internal:fail
   merging H
   warning: conflicts during merge.
@@ -376,6 +379,6 @@
   $ hg resolve --all -t internal:local
   $ hg rebase -c
   saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6215fafa5447-backup.hg (glob)
-  $ hg tglog
-  @  8: 'H2'
+  $ hg  log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+  @  8:secret 'H2'
   |
@@ -381,3 +384,3 @@
   |
-  o  7: 'H'
+  o  7:draft 'H'
   |
@@ -383,3 +386,3 @@
   |
-  | o  6: 'G'
+  | o  6:draft 'G'
   |/|
@@ -385,3 +388,3 @@
   |/|
-  o |  5: 'F'
+  o |  5:draft 'F'
   | |
@@ -387,3 +390,3 @@
   | |
-  | o  4: 'E'
+  | o  4:draft 'E'
   |/
@@ -389,3 +392,3 @@
   |/
-  | o  3: 'D'
+  | o  3:draft 'D'
   | |
@@ -391,3 +394,3 @@
   | |
-  | o  2: 'C'
+  | o  2:draft 'C'
   | |
@@ -393,3 +396,3 @@
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -395,4 +398,4 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
 
diff --git a/tests/test-rebase-interruptions.t b/tests/test-rebase-interruptions.t
index c96148346af824cc4b17b6e875e481d6a7638b3b_dGVzdHMvdGVzdC1yZWJhc2UtaW50ZXJydXB0aW9ucy50..e66084ef84497a3fa70507f2b2839a74250f7a38_dGVzdHMvdGVzdC1yZWJhc2UtaW50ZXJydXB0aW9ucy50 100644
--- a/tests/test-rebase-interruptions.t
+++ b/tests/test-rebase-interruptions.t
@@ -8,6 +8,7 @@
   > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 
@@ -71,6 +72,10 @@
   $ hg add Extra
   $ hg ci -m 'Extra'
 
-  $ hg tglog
-  @  6: 'Extra'
+Force this commit onto secret phase
+
+  $ hg phase --force --secret 6
+
+  $ hg tglogp
+  @  6:secret 'Extra'
   |
@@ -76,5 +81,3 @@
   |
-  | o  5: 'B'
-  | |
-  | o  4: 'E'
+  | o  5:draft 'B'
   | |
@@ -80,3 +83,3 @@
   | |
-  | o  3: 'D'
+  | o  4:draft 'E'
   | |
@@ -82,3 +85,3 @@
   | |
-  o |  2: 'C'
+  | o  3:draft 'D'
   | |
@@ -84,3 +87,5 @@
   | |
-  o |  1: 'B'
+  o |  2:draft 'C'
+  | |
+  o |  1:draft 'B'
   |/
@@ -86,5 +91,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
 Resume the rebasing:
 
@@ -104,6 +109,6 @@
   $ hg rebase --continue
   warning: new changesets detected on source branch, not stripping
 
-  $ hg tglog
-  @  7: 'C'
+  $ hg tglogp
+  @  7:draft 'C'
   |
@@ -109,3 +114,3 @@
   |
-  | o  6: 'Extra'
+  | o  6:secret 'Extra'
   | |
@@ -111,3 +116,3 @@
   | |
-  o |  5: 'B'
+  o |  5:draft 'B'
   | |
@@ -113,3 +118,3 @@
   | |
-  o |  4: 'E'
+  o |  4:draft 'E'
   | |
@@ -115,3 +120,3 @@
   | |
-  o |  3: 'D'
+  o |  3:draft 'D'
   | |
@@ -117,3 +122,3 @@
   | |
-  | o  2: 'C'
+  | o  2:draft 'C'
   | |
@@ -119,3 +124,3 @@
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
@@ -121,5 +126,5 @@
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ cd ..
 
@@ -195,3 +200,68 @@
   
   $ cd ..
 
+Changes during an interruption - abort (again):
+
+  $ hg clone -q -u . a a3
+  $ cd a3
+
+  $ hg tglogp
+  @  4:draft 'E'
+  |
+  o  3:draft 'D'
+  |
+  | o  2:draft 'C'
+  | |
+  | o  1:draft 'B'
+  |/
+  o  0:draft 'A'
+  
+Rebasing B onto E:
+
+  $ hg rebase -s 1 -d 4
+  merging A
+  warning: conflicts during merge.
+  merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+  abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+  [255]
+
+Change phase on B and B'
+
+  $ hg up -q -C 5
+  $ hg phase --public 1
+  $ hg phase --public 5
+  $ hg phase --secret -f 2
+
+  $ hg tglogp
+  @  5:public 'B'
+  |
+  o  4:public 'E'
+  |
+  o  3:public 'D'
+  |
+  | o  2:secret 'C'
+  | |
+  | o  1:public 'B'
+  |/
+  o  0:public 'A'
+  
+Abort the rebasing:
+
+  $ hg rebase --abort
+  warning: immutable rebased changeset detected, can't abort
+  [255]
+
+  $ hg tglogp
+  @  5:public 'B'
+  |
+  o  4:public 'E'
+  |
+  o  3:public 'D'
+  |
+  | o  2:secret 'C'
+  | |
+  | o  1:public 'B'
+  |/
+  o  0:public 'A'
+  
+  $ cd ..
diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
index c96148346af824cc4b17b6e875e481d6a7638b3b_dGVzdHMvdGVzdC1yZWJhc2Utc2NlbmFyaW8tZ2xvYmFsLnQ=..e66084ef84497a3fa70507f2b2839a74250f7a38_dGVzdHMvdGVzdC1yZWJhc2Utc2NlbmFyaW8tZ2xvYmFsLnQ= 100644
--- a/tests/test-rebase-scenario-global.t
+++ b/tests/test-rebase-scenario-global.t
@@ -282,6 +282,32 @@
   [255]
 
   $ hg rebase -d 5 -b 6 --keep
+
+Check rebasing mutable changeset
+Source phase greater or equal to destination phase: new changeset get the phase of source:
+  $ hg rebase -s9 -d0
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2b23e52411f4-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  draft
+  $ hg rebase -s9 -d1
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2cb10d0cfc6c-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  draft
+  $ hg phase --force --secret 9
+  $ hg rebase -s9 -d0
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c5b12b67163a-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  secret
+  $ hg rebase -s9 -d1
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2a0524f868ac-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  secret
+Source phase lower than destination phase: new changeset get the phase of destination:
+  $ hg rebase -s7 -d9
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c9659aac0000-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  secret
+
   $ cd ..
 
 Test for revset