diff --git a/tests/test-bisect.t b/tests/test-bisect.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1iaXNlY3QudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1iaXNlY3QudA== 100644
--- a/tests/test-bisect.t
+++ b/tests/test-bisect.t
@@ -555,7 +555,7 @@
 Check that bisect does not break on obsolete changesets
 =========================================================
 
-  $ cat > ${TESTTMP}/obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
@@ -561,6 +561,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
 tip is obsolete
 ---------------------
diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1ib29rbWFya3MtcHVzaHB1bGwudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1ib29rbWFya3MtcHVzaHB1bGwudA== 100644
--- a/tests/test-bookmarks-pushpull.t
+++ b/tests/test-bookmarks-pushpull.t
@@ -5,5 +5,6 @@
   > logtemplate={rev}:{node|short} {desc|firstline}
   > [phases]
   > publish=False
-  > [extensions]
+  > [experimental]
+  > evolution=createmarkers,exchange
   > EOF
@@ -9,9 +10,4 @@
   > EOF
-  $ cat > obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
 initialize
 
diff --git a/tests/test-bundle2-exchange.t b/tests/test-bundle2-exchange.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1idW5kbGUyLWV4Y2hhbmdlLnQ=..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1idW5kbGUyLWV4Y2hhbmdlLnQ= 100644
--- a/tests/test-bundle2-exchange.t
+++ b/tests/test-bundle2-exchange.t
@@ -7,9 +7,4 @@
 
 enable obsolescence
 
-  $ cat > obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
-
   $ cat >> $HGRCPATH << EOF
@@ -15,4 +10,2 @@
   $ cat >> $HGRCPATH << EOF
-  > [extensions]
-  > obsolete=$TESTTMP/obs.py
   > [experimental]
@@ -18,4 +11,5 @@
   > [experimental]
+  > evolution=createmarkers,exchange
   > bundle2-exp=True
   > [ui]
   > ssh=python "$TESTDIR/dummyssh"
diff --git a/tests/test-bundle2-format.t b/tests/test-bundle2-format.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1idW5kbGUyLWZvcm1hdC50..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1idW5kbGUyLWZvcm1hdC50 100644
--- a/tests/test-bundle2-format.t
+++ b/tests/test-bundle2-format.t
@@ -23,7 +23,6 @@
   > from mercurial import error
   > from mercurial import obsolete
   > 
-  > obsolete._enabled = True
   > 
   > try:
   >     import msvcrt
@@ -197,6 +196,7 @@
   > bundle2=$TESTTMP/bundle2.py
   > [experimental]
   > bundle2-exp=True
+  > evolution=createmarkers
   > [ui]
   > ssh=python "$TESTDIR/dummyssh"
   > logtemplate={rev}:{node|short} {phase} {author} {bookmarks} {desc|firstline}
diff --git a/tests/test-check-commit-hg.t b/tests/test-check-commit-hg.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1jaGVjay1jb21taXQtaGcudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1jaGVjay1jb21taXQtaGcudA== 100644
--- a/tests/test-check-commit-hg.t
+++ b/tests/test-check-commit-hg.t
@@ -2,7 +2,7 @@
 
 Enable obsolescence to avoid the warning issue when obsmarker are found
 
-  $ cat > obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
@@ -8,6 +8,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
 Go back in the hg repo
 
diff --git a/tests/test-commandserver.t b/tests/test-commandserver.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1jb21tYW5kc2VydmVyLnQ=..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1jb21tYW5kc2VydmVyLnQ= 100644
--- a/tests/test-commandserver.t
+++ b/tests/test-commandserver.t
@@ -408,13 +408,9 @@
   *** runcommand branches
   default                        1:731265503d86
 
-  $ cat <<EOF > obs.py
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
-  $ cat <<EOF >> .hg/hgrc
-  > [extensions]
-  > obs = obs.py
+  $ cat >> .hg/hgrc << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
 
   >>> import os
diff --git a/tests/test-glog.t b/tests/test-glog.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1nbG9nLnQ=..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1nbG9nLnQ= 100644
--- a/tests/test-glog.t
+++ b/tests/test-glog.t
@@ -2251,7 +2251,7 @@
 Test --hidden
  (enable obsolete)
 
-  $ cat > ${TESTTMP}/obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
@@ -2257,6 +2257,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
   $ hg debugobsolete `hg id --debug -i -r 8`
   $ testlog
diff --git a/tests/test-histedit-obsolete.t b/tests/test-histedit-obsolete.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1oaXN0ZWRpdC1vYnNvbGV0ZS50..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1oaXN0ZWRpdC1vYnNvbGV0ZS50 100644
--- a/tests/test-histedit-obsolete.t
+++ b/tests/test-histedit-obsolete.t
@@ -2,13 +2,8 @@
 
 Enable obsolete
 
-  $ cat > ${TESTTMP}/obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
-
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate= {rev}:{node|short} {desc|firstline}
   > [phases]
   > publish=False
@@ -10,8 +5,10 @@
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate= {rev}:{node|short} {desc|firstline}
   > [phases]
   > publish=False
+  > [experimental]
+  > evolution=createmarkers,allowunstable
   > [extensions]
   > histedit=
   > rebase=
@@ -15,8 +12,6 @@
   > [extensions]
   > histedit=
   > rebase=
-  > 
-  > obs=${TESTTMP}/obs.py
   > EOF
 
   $ hg init base
diff --git a/tests/test-log.t b/tests/test-log.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1sb2cudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1sb2cudA== 100644
--- a/tests/test-log.t
+++ b/tests/test-log.t
@@ -1377,7 +1377,7 @@
   
 enable obsolete to test hidden feature
 
-  $ cat > ${TESTTMP}/obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
@@ -1383,6 +1383,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
   $ hg log --template='{rev}:{node}\n'
   1:a765632148dc55d38c35c4f247c618701886cb2f
diff --git a/tests/test-obsolete-changeset-exchange.t b/tests/test-obsolete-changeset-exchange.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1vYnNvbGV0ZS1jaGFuZ2VzZXQtZXhjaGFuZ2UudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1vYnNvbGV0ZS1jaGFuZ2VzZXQtZXhjaGFuZ2UudA== 100644
--- a/tests/test-obsolete-changeset-exchange.t
+++ b/tests/test-obsolete-changeset-exchange.t
@@ -1,7 +1,7 @@
 Test changesets filtering during exchanges (some tests are still in
 test-obsolete.t)
 
-  $ cat > obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
@@ -7,6 +7,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
 Push does not corrupt remote
 ----------------------------
diff --git a/tests/test-obsolete-checkheads.t b/tests/test-obsolete-checkheads.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1vYnNvbGV0ZS1jaGVja2hlYWRzLnQ=..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1vYnNvbGV0ZS1jaGVja2hlYWRzLnQ= 100644
--- a/tests/test-obsolete-checkheads.t
+++ b/tests/test-obsolete-checkheads.t
@@ -1,11 +1,7 @@
 Check that obsolete properly strip heads
-  $ cat > obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
   $ cat >> $HGRCPATH << EOF
   > [phases]
   > # public changeset are not obsolete
   > publish=false
   > [ui]
   > logtemplate='{node|short} ({phase}) {desc|firstline}\n'
@@ -6,11 +2,11 @@
   $ cat >> $HGRCPATH << EOF
   > [phases]
   > # public changeset are not obsolete
   > publish=false
   > [ui]
   > logtemplate='{node|short} ({phase}) {desc|firstline}\n'
-  > [extensions]
-  > obs=${TESTTMP}/obs.py
+  > [experimental]
+  > evolution=createmarkers
   > EOF
   $ mkcommit() {
   >    echo "$1" > "$1"
diff --git a/tests/test-obsolete-divergent.t b/tests/test-obsolete-divergent.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1vYnNvbGV0ZS1kaXZlcmdlbnQudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1vYnNvbGV0ZS1kaXZlcmdlbnQudA== 100644
--- a/tests/test-obsolete-divergent.t
+++ b/tests/test-obsolete-divergent.t
@@ -5,10 +5,6 @@
 
 Enable obsolete
 
-  $ cat > obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate = {rev}:{node|short} {desc}\n
@@ -12,8 +8,8 @@
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate = {rev}:{node|short} {desc}\n
-  > [extensions]
-  > obs=${TESTTMP}/obs.py
+  > [experimental]
+  > evolution=createmarkers
   > [alias]
   > debugobsolete = debugobsolete -d '0 0'
   > [phases]
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1vYnNvbGV0ZS50..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1vYnNvbGV0ZS50 100644
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -37,7 +37,7 @@
 
 Enabling it
 
-  $ cat > ../obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers,exchange
   > EOF
@@ -43,6 +43,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
 Killing a single changeset without replacement
 
@@ -644,11 +642,11 @@
 
 Checking _enable=False warning if obsolete marker exists
 
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=!" >> $HGRCPATH
+  $ echo '[experimental]' >> $HGRCPATH
+  $ echo "evolution=" >> $HGRCPATH
   $ hg log -r tip
   obsolete feature not enabled but 68 markers found!
   68:c15e9edfca13 (draft) [tip ] add celestine
 
 reenable for later test
 
@@ -649,11 +647,11 @@
   $ hg log -r tip
   obsolete feature not enabled but 68 markers found!
   68:c15e9edfca13 (draft) [tip ] add celestine
 
 reenable for later test
 
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
+  $ echo '[experimental]' >> $HGRCPATH
+  $ echo "evolution=createmarkers,exchange" >> $HGRCPATH
 
 #endif
 
diff --git a/tests/test-phases.t b/tests/test-phases.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1waGFzZXMudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1waGFzZXMudA== 100644
--- a/tests/test-phases.t
+++ b/tests/test-phases.t
@@ -515,7 +515,7 @@
   $ cd initialrepo
 
 (enabling evolution)
-  $ cat > ../obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
@@ -521,6 +521,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
 
 (making a changeset hidden; H in that case)
   $ hg debugobsolete `hg id --debug -r 5`
diff --git a/tests/test-rebase-obsolete.t b/tests/test-rebase-obsolete.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1yZWJhc2Utb2Jzb2xldGUudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1yZWJhc2Utb2Jzb2xldGUudA== 100644
--- a/tests/test-rebase-obsolete.t
+++ b/tests/test-rebase-obsolete.t
@@ -4,10 +4,6 @@
 
 Enable obsolete
 
-  $ cat > ${TESTTMP}/obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate= {rev}:{node|short} {desc|firstline}
@@ -11,7 +7,9 @@
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate= {rev}:{node|short} {desc|firstline}
+  > [experimental]
+  > evolution=createmarkers,allowunstable
   > [phases]
   > publish=False
   > [extensions]'
   > rebase=
@@ -14,9 +12,7 @@
   > [phases]
   > publish=False
   > [extensions]'
   > rebase=
-  > 
-  > obs=${TESTTMP}/obs.py
   > EOF
 
 Setup rebase canonical repo
diff --git a/tests/test-shelve.t b/tests/test-shelve.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1zaGVsdmUudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1zaGVsdmUudA== 100644
--- a/tests/test-shelve.t
+++ b/tests/test-shelve.t
@@ -508,7 +508,7 @@
 
 test bug 4073 we need to enable obsolete markers for it
 
-  $ cat > ../obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
   > EOF
@@ -514,6 +514,4 @@
   > EOF
-  $ echo '[extensions]' >> $HGRCPATH
-  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
   $ hg shelve
   shelved as default
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
diff --git a/tests/test-subrepo-missing.t b/tests/test-subrepo-missing.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC1zdWJyZXBvLW1pc3NpbmcudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC1zdWJyZXBvLW1pc3NpbmcudA== 100644
--- a/tests/test-subrepo-missing.t
+++ b/tests/test-subrepo-missing.t
@@ -70,12 +70,8 @@
 
 Enable obsolete
 
-  $ cat > ${TESTTMP}/obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
-  > EOF
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate= {rev}:{node|short} {desc|firstline}
   > [phases]
   > publish=False
@@ -77,10 +73,10 @@
   $ cat >> $HGRCPATH << EOF
   > [ui]
   > logtemplate= {rev}:{node|short} {desc|firstline}
   > [phases]
   > publish=False
-  > [extensions]'
-  > obs=${TESTTMP}/obs.py
+  > [experimental]
+  > evolution=createmarkers
   > EOF
 
 check that we can update parent repo with missing (amended) subrepo revision
diff --git a/tests/test-update-branches.t b/tests/test-update-branches.t
index 32f15b361f3608cdd5b998fe4ceb801db30d3af2_dGVzdHMvdGVzdC11cGRhdGUtYnJhbmNoZXMudA==..fab9dda0f2a3f8395fc242d259cdc89cb85e4dc2_dGVzdHMvdGVzdC11cGRhdGUtYnJhbmNoZXMudA== 100644
--- a/tests/test-update-branches.t
+++ b/tests/test-update-branches.t
@@ -180,7 +180,5 @@
 successors should be taken in account when checking head destination
 
   $ cat << EOF >> $HGRCPATH
-  > [extensions]
-  > obs=$TESTTMP/obs.py
   > [ui]
   > logtemplate={rev}:{node|short} {desc|firstline}
@@ -185,9 +183,7 @@
   > [ui]
   > logtemplate={rev}:{node|short} {desc|firstline}
-  > EOF
-  $ cat > $TESTTMP/obs.py << EOF
-  > import mercurial.obsolete
-  > mercurial.obsolete._enabled = True
+  > [experimental]
+  > evolution=createmarkers
   > EOF
 
 Test no-argument update to a successor of an obsoleted changeset