diff --git a/Lib/distutils/dir_util.py b/Lib/distutils/dir_util.py
index 54f5c68..6d896ee 100644
--- a/Lib/distutils/dir_util.py
+++ b/Lib/distutils/dir_util.py
@@ -16,7 +16,7 @@
 # I don't use os.makedirs because a) it's new to Python 1.5.2, and
 # b) it blows up if the directory already exists (I want to silently
 # succeed in that case).
-def mkpath (name, mode=0777, verbose=0, dry_run=0):
+def mkpath (name, mode=0777, verbose=1, dry_run=0):
     """Create a directory and any missing ancestor directories.  If the
        directory already exists (or if 'name' is the empty string, which
        means the current directory, which of course exists), then do
@@ -49,13 +49,9 @@
     tails = [tail]                      # stack of lone dirs to create
 
     while head and tail and not os.path.isdir(head):
-        #print "splitting '%s': " % head,
         (head, tail) = os.path.split(head)
-        #print "to ('%s','%s')" % (head, tail)
         tails.insert(0, tail)          # push next higher dir onto stack
 
-    #print "stack of tails:", tails
-
     # now 'head' contains the deepest directory that already exists
     # (that is, the child of 'head' in 'name' is the highest directory
     # that does *not* exist)
@@ -67,7 +63,8 @@
         if _path_created.get(abs_head):
             continue
 
-        log.info("creating %s", head)
+        if verbose == 1:
+            log.info("creating %s", head)
 
         if not dry_run:
             try:
@@ -83,7 +80,7 @@
 # mkpath ()
 
 
-def create_tree (base_dir, files, mode=0777, verbose=0, dry_run=0):
+def create_tree (base_dir, files, mode=0777, verbose=1, dry_run=0):
 
     """Create all the empty directories under 'base_dir' needed to
        put 'files' there.  'base_dir' is just the a name of a directory
@@ -102,7 +99,7 @@
 
     # Now create them
     for dir in need_dirs:
-        mkpath(dir, mode, dry_run=dry_run)
+        mkpath(dir, mode, verbose=verbose, dry_run=dry_run)
 
 # create_tree ()
 
@@ -112,7 +109,7 @@
                preserve_times=1,
                preserve_symlinks=0,
                update=0,
-               verbose=0,
+               verbose=1,
                dry_run=0):
 
     """Copy an entire directory tree 'src' to a new location 'dst'.  Both
@@ -148,7 +145,7 @@
                   "error listing files in '%s': %s" % (src, errstr)
 
     if not dry_run:
-        mkpath(dst)
+        mkpath(dst, verbose=verbose)
 
     outputs = []
 
@@ -158,7 +155,8 @@
 
         if preserve_symlinks and os.path.islink(src_name):
             link_dest = os.readlink(src_name)
-            log.info("linking %s -> %s", dst_name, link_dest)
+            if verbose == 1:
+                log.info("linking %s -> %s", dst_name, link_dest)
             if not dry_run:
                 os.symlink(link_dest, dst_name)
             outputs.append(dst_name)
@@ -167,10 +165,11 @@
             outputs.extend(
                 copy_tree(src_name, dst_name, preserve_mode,
                           preserve_times, preserve_symlinks, update,
-                          dry_run=dry_run))
+                          verbose=verbose, dry_run=dry_run))
         else:
             copy_file(src_name, dst_name, preserve_mode,
-                      preserve_times, update, dry_run=dry_run)
+                      preserve_times, update, verbose=verbose,
+                      dry_run=dry_run)
             outputs.append(dst_name)
 
     return outputs
@@ -188,14 +187,15 @@
     cmdtuples.append((os.rmdir, path))
 
 
-def remove_tree (directory, verbose=0, dry_run=0):
+def remove_tree (directory, verbose=1, dry_run=0):
     """Recursively remove an entire directory tree.  Any errors are ignored
     (apart from being reported to stdout if 'verbose' is true).
     """
     from distutils.util import grok_environment_error
     global _path_created
 
-    log.info("removing '%s' (and everything under it)", directory)
+    if verbose == 1:
+        log.info("removing '%s' (and everything under it)", directory)
     if dry_run:
         return
     cmdtuples = []
diff --git a/Lib/distutils/file_util.py b/Lib/distutils/file_util.py
index 3af6344..82a8b0a 100644
--- a/Lib/distutils/file_util.py
+++ b/Lib/distutils/file_util.py
@@ -76,7 +76,7 @@
                preserve_times=1,
                update=0,
                link=None,
-               verbose=0,
+               verbose=1,
                dry_run=0):
 
     """Copy a file 'src' to 'dst'.  If 'dst' is a directory, then 'src' is
@@ -123,7 +123,8 @@
         dir = os.path.dirname(dst)
 
     if update and not newer(src, dst):
-        log.debug("not copying %s (output up-to-date)", src)
+        if verbose == 1:
+            log.debug("not copying %s (output up-to-date)", src)
         return dst, 0
 
     try:
@@ -131,10 +132,12 @@
     except KeyError:
         raise ValueError, \
               "invalid value '%s' for 'link' argument" % link
-    if os.path.basename(dst) == os.path.basename(src):
-        log.info("%s %s -> %s", action, src, dir)
-    else:
-        log.info("%s %s -> %s", action, src, dst)
+
+    if verbose == 1:
+        if os.path.basename(dst) == os.path.basename(src):
+            log.info("%s %s -> %s", action, src, dir)
+        else:
+            log.info("%s %s -> %s", action, src, dst)
 
     if dry_run:
         return (dst, 1)
@@ -178,7 +181,7 @@
 
 # XXX I suspect this is Unix-specific -- need porting help!
 def move_file (src, dst,
-               verbose=0,
+               verbose=1,
                dry_run=0):
 
     """Move a file 'src' to 'dst'.  If 'dst' is a directory, the file will
@@ -191,7 +194,8 @@
     from os.path import exists, isfile, isdir, basename, dirname
     import errno
 
-    log.info("moving %s -> %s", src, dst)
+    if verbose == 1:
+        log.info("moving %s -> %s", src, dst)
 
     if dry_run:
         return dst
@@ -223,7 +227,7 @@
                   "couldn't move '%s' to '%s': %s" % (src, dst, msg)
 
     if copy_it:
-        copy_file(src, dst)
+        copy_file(src, dst, verbose=verbose)
         try:
             os.unlink(src)
         except os.error, (num, msg):
diff --git a/Lib/distutils/tests/test_dir_util.py b/Lib/distutils/tests/test_dir_util.py
new file mode 100644
index 0000000..edf93c4
--- /dev/null
+++ b/Lib/distutils/tests/test_dir_util.py
@@ -0,0 +1,91 @@
+"""Tests for distutils.dir_util."""
+import unittest
+import os
+import shutil
+
+from distutils.dir_util import mkpath
+from distutils.dir_util import remove_tree
+from distutils.dir_util import create_tree
+from distutils.dir_util import copy_tree
+
+from distutils import log
+
+class DirUtilTestCase(unittest.TestCase):
+
+    def _log(self, msg, *args):
+        if len(args) > 0:
+            self._logs.append(msg % args)
+        else:
+            self._logs.append(msg)
+
+    def setUp(self):
+        self._logs = []
+        self.root_target = os.path.join(os.path.dirname(__file__), 'deep')
+        self.target = os.path.join(self.root_target, 'here')
+        self.target2 = os.path.join(os.path.dirname(__file__), 'deep2')
+        self.old_log = log.info
+        log.info = self._log
+
+    def tearDown(self):
+        for target in (self.target, self.target2):
+            if os.path.exists(target):
+                shutil.rmtree(target)
+        log.info = self.old_log
+
+    def test_mkpath_remove_tree_verbosity(self):
+
+        mkpath(self.target, verbose=0)
+        wanted = []
+        self.assertEquals(self._logs, wanted)
+        remove_tree(self.root_target, verbose=0)
+
+        mkpath(self.target, verbose=1)
+        wanted = ['creating %s' % self.root_target,
+                  'creating %s' % self.target]
+        self.assertEquals(self._logs, wanted)
+        self._logs = []
+
+        remove_tree(self.root_target, verbose=1)
+        wanted = ["removing '%s' (and everything under it)" % self.root_target]
+        self.assertEquals(self._logs, wanted)
+
+    def test_create_tree_verbosity(self):
+
+        create_tree(self.root_target, ['one', 'two', 'three'], verbose=0)
+        self.assertEquals(self._logs, [])
+        remove_tree(self.root_target, verbose=0)
+
+        wanted = ['creating %s' % self.root_target]
+        create_tree(self.root_target, ['one', 'two', 'three'], verbose=1)
+        self.assertEquals(self._logs, wanted)
+
+        remove_tree(self.root_target, verbose=0)
+
+
+    def test_copy_tree_verbosity(self):
+
+        mkpath(self.target, verbose=0)
+
+        copy_tree(self.target, self.target2, verbose=0)
+        self.assertEquals(self._logs, [])
+
+        remove_tree(self.root_target, verbose=0)
+
+        mkpath(self.target, verbose=0)
+        a_file = os.path.join(self.target, 'ok.txt')
+        f = open(a_file, 'w')
+        f.write('some content')
+        f.close()
+
+        wanted = ['copying %s -> %s' % (a_file, self.target2)]
+        copy_tree(self.target, self.target2, verbose=1)
+        self.assertEquals(self._logs, wanted)
+
+        remove_tree(self.root_target, verbose=0)
+        remove_tree(self.target2, verbose=0)
+
+def test_suite():
+    return unittest.makeSuite(DirUtilTestCase)
+
+if __name__ == "__main__":
+    unittest.main(defaultTest="test_suite")
diff --git a/Lib/distutils/tests/test_file_util.py b/Lib/distutils/tests/test_file_util.py
new file mode 100644
index 0000000..523f1ae
--- /dev/null
+++ b/Lib/distutils/tests/test_file_util.py
@@ -0,0 +1,66 @@
+"""Tests for distutils.file_util."""
+import unittest
+import os
+import shutil
+
+from distutils.file_util import move_file
+from distutils import log
+
+class FileUtilTestCase(unittest.TestCase):
+
+    def _log(self, msg, *args):
+        if len(args) > 0:
+            self._logs.append(msg % args)
+        else:
+            self._logs.append(msg)
+
+    def setUp(self):
+        self._logs = []
+        self.old_log = log.info
+        log.info = self._log
+        self.source = os.path.join(os.path.dirname(__file__), 'f1')
+        self.target = os.path.join(os.path.dirname(__file__), 'f2')
+        self.target_dir = os.path.join(os.path.dirname(__file__), 'd1')
+
+    def tearDown(self):
+        log.info = self.old_log
+        for f in (self.source, self.target, self.target_dir):
+            if os.path.exists(f):
+                if os.path.isfile(f):
+                    os.remove(f)
+                else:
+                    shutil.rmtree(f)
+
+    def test_move_file_verbosity(self):
+
+        f = open(self.source, 'w')
+        f.write('some content')
+        f.close()
+
+        move_file(self.source, self.target, verbose=0)
+        wanted = []
+        self.assertEquals(self._logs, wanted)
+
+        # back to original state
+        move_file(self.target, self.source, verbose=0)
+
+        move_file(self.source, self.target, verbose=1)
+        wanted = ['moving %s -> %s' % (self.source, self.target)]
+        self.assertEquals(self._logs, wanted)
+
+        # back to original state
+        move_file(self.target, self.source, verbose=0)
+
+        self._logs = []
+        # now the target is a dir
+        os.mkdir(self.target_dir)
+        move_file(self.source, self.target_dir, verbose=1)
+        wanted = ['moving %s -> %s' % (self.source, self.target_dir)]
+        self.assertEquals(self._logs, wanted)
+
+
+def test_suite():
+    return unittest.makeSuite(FileUtilTestCase)
+
+if __name__ == "__main__":
+    unittest.main(defaultTest="test_suite")
