diff --git a/hgext/rebase.py b/hgext/rebase.py
index 60344b83e442659edf21a9ca07d422681ddd215b_aGdleHQvcmViYXNlLnB5..65df60a3f96b673a2fb658bb592c038aad45c104_aGdleHQvcmViYXNlLnB5 100644
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -193,6 +193,11 @@
                 rebaseset = repo.revs('(children(ancestor(%r, %d)) & ::%r)::',
                     base, dest, base)
 
+            if rebaseset:
+                root = min(rebaseset)
+            else:
+                root = None
+
             if not rebaseset:
                 repo.ui.debug('base is ancestor of destination')
                 result = None
@@ -202,6 +207,10 @@
                     _("can't remove original changesets with"
                       " unrebased descendants"),
                     hint=_('use --keep to keep original changesets'))
+            elif not keepf and not repo[root].mutable():
+                raise util.Abort(_("Can't rebase immutable changeset %s")
+                                 % repo[root],
+                                 hint=_('see hg help phases for details'))
             else:
                 result = buildstate(repo, dest, rebaseset, detachf)
 
diff --git a/mercurial/store.py b/mercurial/store.py
index 60344b83e442659edf21a9ca07d422681ddd215b_bWVyY3VyaWFsL3N0b3JlLnB5..65df60a3f96b673a2fb658bb592c038aad45c104_bWVyY3VyaWFsL3N0b3JlLnB5 100644
--- a/mercurial/store.py
+++ b/mercurial/store.py
@@ -409,8 +409,8 @@
             self.fncache.rewrite(existing)
 
     def copylist(self):
-        d = ('data dh fncache'
-             ' 00manifest.d 00manifest.i 00changelog.d 00changelog.i phaseroots')
+        d = ('data dh fncache phaseroots'
+             ' 00manifest.d 00manifest.i 00changelog.d 00changelog.i')
         return (['requires', '00changelog.i'] +
                 ['store/' + f for f in d.split()])
 
diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1sYXJnZWZpbGVzLnQ=..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1sYXJnZWZpbGVzLnQ= 100644
--- a/tests/test-largefiles.t
+++ b/tests/test-largefiles.t
@@ -6,6 +6,8 @@
   > purge=
   > rebase=
   > transplant=
+  > [phases]
+  > publish=False
   > [largefiles]
   > minsize=2
   > patterns=glob:**.dat
diff --git a/tests/test-rebase-abort.t b/tests/test-rebase-abort.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtYWJvcnQudA==..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtYWJvcnQudA== 100644
--- a/tests/test-rebase-abort.t
+++ b/tests/test-rebase-abort.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-bookmarks.t b/tests/test-rebase-bookmarks.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtYm9va21hcmtzLnQ=..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtYm9va21hcmtzLnQ= 100644
--- a/tests/test-rebase-bookmarks.t
+++ b/tests/test-rebase-bookmarks.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' bookmarks: {bookmarks}\n"
   > EOF
diff --git a/tests/test-rebase-cache.t b/tests/test-rebase-cache.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtY2FjaGUudA==..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtY2FjaGUudA== 100644
--- a/tests/test-rebase-cache.t
+++ b/tests/test-rebase-cache.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog  = log -G --template "{rev}: '{desc}' {branches}\n"
   > theads = heads --template "{rev}: '{desc}' {branches}\n"
diff --git a/tests/test-rebase-check-restore.t b/tests/test-rebase-check-restore.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtY2hlY2stcmVzdG9yZS50..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtY2hlY2stcmVzdG9yZS50 100644
--- a/tests/test-rebase-check-restore.t
+++ b/tests/test-rebase-check-restore.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-collapse.t b/tests/test-rebase-collapse.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtY29sbGFwc2UudA==..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtY29sbGFwc2UudA== 100644
--- a/tests/test-rebase-collapse.t
+++ b/tests/test-rebase-collapse.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-conflicts.t b/tests/test-rebase-conflicts.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtY29uZmxpY3RzLnQ=..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtY29uZmxpY3RzLnQ= 100644
--- a/tests/test-rebase-conflicts.t
+++ b/tests/test-rebase-conflicts.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-detach.t b/tests/test-rebase-detach.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtZGV0YWNoLnQ=..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtZGV0YWNoLnQ= 100644
--- a/tests/test-rebase-detach.t
+++ b/tests/test-rebase-detach.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-interruptions.t b/tests/test-rebase-interruptions.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtaW50ZXJydXB0aW9ucy50..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtaW50ZXJydXB0aW9ucy50 100644
--- a/tests/test-rebase-interruptions.t
+++ b/tests/test-rebase-interruptions.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-issue-noparam-single-rev.t b/tests/test-rebase-issue-noparam-single-rev.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtaXNzdWUtbm9wYXJhbS1zaW5nbGUtcmV2LnQ=..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtaXNzdWUtbm9wYXJhbS1zaW5nbGUtcmV2LnQ= 100644
--- a/tests/test-rebase-issue-noparam-single-rev.t
+++ b/tests/test-rebase-issue-noparam-single-rev.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-mq-skip.t b/tests/test-rebase-mq-skip.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtbXEtc2tpcC50..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtbXEtc2tpcC50 100644
--- a/tests/test-rebase-mq-skip.t
+++ b/tests/test-rebase-mq-skip.t
@@ -7,6 +7,9 @@
   > rebase=
   > mq=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' tags: {tags}\n"
   > EOF
diff --git a/tests/test-rebase-named-branches.t b/tests/test-rebase-named-branches.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtbmFtZWQtYnJhbmNoZXMudA==..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtbmFtZWQtYnJhbmNoZXMudA== 100644
--- a/tests/test-rebase-named-branches.t
+++ b/tests/test-rebase-named-branches.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-parameters.t b/tests/test-rebase-parameters.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2UtcGFyYW1ldGVycy50..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2UtcGFyYW1ldGVycy50 100644
--- a/tests/test-rebase-parameters.t
+++ b/tests/test-rebase-parameters.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
index 60344b83e442659edf21a9ca07d422681ddd215b_dGVzdHMvdGVzdC1yZWJhc2Utc2NlbmFyaW8tZ2xvYmFsLnQ=..65df60a3f96b673a2fb658bb592c038aad45c104_dGVzdHMvdGVzdC1yZWJhc2Utc2NlbmFyaW8tZ2xvYmFsLnQ= 100644
--- a/tests/test-rebase-scenario-global.t
+++ b/tests/test-rebase-scenario-global.t
@@ -3,6 +3,9 @@
   > graphlog=
   > rebase=
   > 
+  > [phases]
+  > publish=False
+  > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
   > EOF
@@ -269,6 +272,16 @@
   |/
   o  0: 'A'
   
+
+Check rebasing public changeset
+
+  $ hg pull --config phases.publish=True -q -r 6 . # update phase of 6
+  $ hg rebase -d 5 -b 6
+  abort: Can't rebase immutable changeset e1c4361dd923
+  (see hg help phases for details)
+  [255]
+
+  $ hg rebase -d 5 -b 6 --keep
   $ cd ..
 
 Test for revset