diff --git a/mercurial/config.py b/mercurial/config.py
--- a/mercurial/config.py
+++ b/mercurial/config.py
@@ -61,6 +61,19 @@ class config(object):
         self._source.update(src._source)
     def get(self, section, item, default=None):
         return self._data.get(section, {}).get(item, default)
+
+    def backup(self, section, item):
+        """return a tuple allowing restore to reinstall a previous valuesi
+
+        The main reason we need it is because it handle the "no data" case.
+        """
+        try:
+            value = self._data[section][item]
+            source = self.source(section, item)
+            return (section, item, value, source)
+        except KeyError:
+            return (section, item)
+
     def source(self, section, item):
         return self._source.get((section, item), "")
     def sections(self):
@@ -73,6 +86,20 @@ class config(object):
         self._data[section][item] = value
         self._source[(section, item)] = source
 
+    def restore(self, data):
+        """restore data returned by self.backup"""
+        if len(data) == 4:
+            # restore old data
+            section, item, value, source = data
+            self._data[section][item] = value
+            self._source[(section, item)] = source
+        else:
+            # no data before, remove everything
+            section, item = data
+            if section in self._data:
+                del self._data[section][item]
+            self._source.pop((section, item), None)
+
     def parse(self, src, data, sections=None, remap=None, include=None):
         sectionre = re.compile(r'\[([^\[]+)\]')
         itemre = re.compile(r'([^=\s][^=]*?)\s*=\s*(.*\S|)')
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -142,6 +142,15 @@ class ui(object):
             self._trustusers.update(self.configlist('trusted', 'users'))
             self._trustgroups.update(self.configlist('trusted', 'groups'))
 
+    def backupconfig(self, section, item):
+        return (self._ocfg.backup(section, item),
+                self._tcfg.backup(section, item),
+                self._ucfg.backup(section, item),)
+    def restoreconfig(self, data):
+        self._ocfg.restore(data[0])
+        self._tcfg.restore(data[1])
+        self._ucfg.restore(data[2])
+
     def setconfig(self, section, name, value, overlay=True):
         if overlay:
             self._ocfg.set(section, name, value)