diff --git a/trac/admin/tests/console-tests.txt b/trac/admin/tests/console-tests.txt
--- a/trac/admin/tests/console-tests.txt
+++ b/trac/admin/tests/console-tests.txt
@@ -60,10 +60,11 @@
 version time         Set version date
 wiki dump            Export wiki pages to files named by title
 wiki export          Export wiki page to file or stdout
-wiki import          Import wiki page from file or stdin
+wiki import          Import wiki page from file or stdin (deprecated)
 wiki list            List wiki pages
-wiki load            Import all wiki pages from directory
+wiki load            Import wiki pages from files or stdin
 wiki remove          Remove wiki page
+wiki replace         Replace the content of wiki pages from files or stdin
 wiki upgrade         Upgrade default wiki pages to current version
 ===== test_attachment_list_empty =====
 
diff --git a/trac/wiki/admin.py b/trac/wiki/admin.py
--- a/trac/wiki/admin.py
+++ b/trac/wiki/admin.py
@@ -21,10 +21,11 @@
 from trac.core import *
 from trac.wiki import model
 from trac.wiki.api import WikiSystem
+from trac.util import read_file
 from trac.util.compat import any
 from trac.util.datefmt import format_datetime, utc
 from trac.util.text import to_unicode, unicode_quote, unicode_unquote, \
-                           print_table, printout
+                           print_table, printerr, printout
 from trac.util.translation import _
 
 
@@ -46,7 +47,7 @@
                'Export wiki page to file or stdout',
                self._complete_import_export, self._do_export)
         yield ('wiki import', '<page> [file]',
-               'Import wiki page from file or stdin',
+               'Import wiki page from file or stdin (deprecated)',
                self._complete_import_export, self._do_import)
         yield ('wiki dump', '<directory> [name] [...]',
                """Export wiki pages to files named by title
@@ -56,9 +57,29 @@
                that prefix should be dumped. If no name is specified, all wiki
                pages are dumped.""",
                self._complete_dump, self._do_dump)
-        yield ('wiki load', '<directory>',
-               'Import all wiki pages from directory',
+        yield ('wiki load', '(<page> [path] | <directory>)',
+               """Import wiki pages from files or stdin
+               
+               When both arguments are given, the specified page is imported
+               from a file. When a single argument specifying an existing
+               directory is given, all files in that directory are imported
+               into pages corresponding to the file names. Otherwise, a single
+               page with the given name is imported from stdin.""",
                self._complete_load, self._do_load)
+        yield ('wiki replace', '(<page> [path] | <directory>)',
+               """Replace the content of wiki pages from files or stdin
+               
+               This command replaces the content of the last version of one
+               or more wiki pages with new content. The previous content is
+               lost, and no new entry is created in the page history. The
+               metadata of the page (time, author) is not changed either.
+               
+               When both arguments are given, the specified page is imported
+               from a file. When a single argument specifying an existing
+               directory is given, all files in that directory are imported
+               into pages corresponding to the file names. Otherwise, a single
+               page with the given name is imported from stdin.""",
+               self._complete_load, self._do_replace)
         yield ('wiki upgrade', '',
                'Upgrade default wiki pages to current version',
                None, self._do_upgrade)
@@ -85,16 +106,15 @@
             finally:
                 f.close()
     
-    def import_page(self, filename, title, db=None, create_only=[]):
-        if not os.path.isfile(filename):
-            raise AdminCommandError(_("'%(name)s' is not a file",
-                                      name=filename))
-        
-        f = open(filename, 'r')
-        try:
-            data = to_unicode(f.read(), 'utf-8')
-        finally:
-            f.close()
+    def import_page(self, filename, title, db=None, create_only=[],
+                    replace=False):
+        if filename:
+            if not os.path.isfile(filename):
+                raise AdminCommandError(_("'%(name)s' is not a file",
+                                          name=filename))
+            data = to_unicode(read_file(filename))
+        else:
+            data = sys.stdin.read()
         
         # Make sure we don't insert the exact same page twice
         handle_ta = not db
@@ -111,19 +131,30 @@
         if old and data == old[0][0]:
             printout('  %s already up to date.' % title)
             return False
+        if replace and not old:
+            printout("  Replacing %s, but page doesn't exist." % title)
+            return False
         
-        cursor.execute("INSERT INTO wiki(version,name,time,author,ipnr,text) "
-                       " SELECT 1+COALESCE(max(version),0),%s,%s,"
-                       " 'trac','127.0.0.1',%s FROM wiki "
-                       " WHERE name=%s",
-                       (title, int(time.time()), data, title))
+        if replace:
+            cursor.execute("UPDATE wiki SET text=%s WHERE name=%s "
+                           "  AND version=(SELECT max(version) FROM wiki "
+                           "               WHERE name=%s)",
+                           (data, title, title))
+        else:
+            cursor.execute("INSERT INTO wiki(version,name,time,author,ipnr,"
+                           "                 text) "
+                           "SELECT 1+COALESCE(max(version),0),%s,%s,"
+                           "       'trac','127.0.0.1',%s FROM wiki "
+                           "WHERE name=%s",
+                           (title, int(time.time()), data, title))
         if not old:
             WikiSystem(self.env).pages.invalidate(db)
         if handle_ta:
             db.commit()
         return True
 
-    def load_pages(self, dir, db=None, ignore=[], create_only=[]):
+    def load_pages(self, dir, db=None, ignore=[], create_only=[],
+                   replace=False):
         cons_charset = getattr(sys.stdout, 'encoding', None) or 'utf-8'
         for page in os.listdir(dir):
             if page in ignore:
@@ -131,7 +162,7 @@
             filename = os.path.join(dir, page)
             page = unicode_unquote(page.encode('utf-8'))
             if os.path.isfile(filename):
-                if self.import_page(filename, page, db, create_only):
+                if self.import_page(filename, page, db, create_only, replace):
                     printout(_("  %(page)s imported from %(filename)s",
                                filename=filename, page=page))
     
@@ -147,13 +178,16 @@
     
     def _complete_dump(self, args):
         if len(args) == 1:
-            return get_dir_list(args[-1], True)
+            return get_dir_list(args[-1], dirs_only=True)
         elif len(args) == 2:
             return self.get_wiki_list()
     
     def _complete_load(self, args):
         if len(args) == 1:
-            return get_dir_list(args[-1], True)
+            return (get_dir_list(args[-1], dirs_only=True)
+                    + self.get_wiki_list())
+        elif len(args) == 2:
+            return get_dir_list(args[-1])
     
     def _do_list(self):
         db = self.env.get_db_cnx()
@@ -184,6 +218,7 @@
         self.export_page(page, filename)
     
     def _do_import(self, page, filename=None):
+        printerr(_('trac-admin $ENV import is deprecated. Use load instead.'))
         self.import_page(filename, page)
     
     def _do_dump(self, directory, *names):
@@ -206,11 +241,22 @@
                 printout(' %s => %s' % (p, dst))
                 self.export_page(p, dst, cursor)
     
-    def _do_load(self, directory):
+    def _load_or_replace(self, page_or_dir, path, replace):
         db = self.env.get_db_cnx()
-        self.load_pages(directory, db)
+        if path is not None:
+            self.import_page(path, page_or_dir, db, replace=replace)
+        elif os.path.isdir(page_or_dir):
+            self.load_pages(page_or_dir, db, replace=replace)
+        else:
+            self.import_page(None, page_or_dir, db, replace=replace)
         db.commit()
     
+    def _do_load(self, page_or_dir, path=None):
+        self._load_or_replace(page_or_dir, path, replace=False)
+    
+    def _do_replace(self, page_or_dir, path=None):
+        self._load_or_replace(page_or_dir, path, replace=True)
+    
     def _do_upgrade(self):
         db = self.env.get_db_cnx()
         self.load_pages(pkg_resources.resource_filename('trac.wiki', 

