diff --git a/Lib/distutils/command/sdist.py b/Lib/distutils/command/sdist.py
index 054fe19..c057b66 100644
--- a/Lib/distutils/command/sdist.py
+++ b/Lib/distutils/command/sdist.py
@@ -252,6 +252,9 @@
           - setup.py
           - test/test*.py
           - all pure Python modules mentioned in setup script
+          - all files pointed by package_data (build_py)
+          - all files defined in data_files.
+          - all files defined as scripts.
           - all C sources listed as part of extensions or C libraries
             in the setup script (doesn't catch C headers!)
         Warns if (README or README.txt) or setup.py are missing; everything
@@ -283,10 +286,27 @@
             if files:
                 self.filelist.extend(files)
 
+        # build_py is used to get:
+        #  - python modules
+        #  - files defined in package_data
+        build_py = self.get_finalized_command('build_py')
+
+        # getting python files
         if self.distribution.has_pure_modules():
-            build_py = self.get_finalized_command('build_py')
             self.filelist.extend(build_py.get_source_files())
 
+        # getting package_data files
+        # (computed in build_py.data_files by build_py.finalize_options)
+        for pkg, src_dir, build_dir, filenames in build_py.data_files:
+            for filename in filenames:
+                self.filelist.append(os.path.join(src_dir, filename))
+
+        # getting distribution.data_files
+        if self.distribution.has_data_files():
+            for dirname, filenames in self.distribution.data_files:
+                for filename in filenames:
+                    self.filelist.append(os.path.join(dirname, filename))
+
         if self.distribution.has_ext_modules():
             build_ext = self.get_finalized_command('build_ext')
             self.filelist.extend(build_ext.get_source_files())
diff --git a/Lib/distutils/tests/support.py b/Lib/distutils/tests/support.py
index 48bcbcc..ecc8da1 100644
--- a/Lib/distutils/tests/support.py
+++ b/Lib/distutils/tests/support.py
@@ -42,6 +42,19 @@
         self.tempdirs.append(d)
         return d
 
+    def write_file(self, path, content):
+        """Writes a file in the given path.
+
+
+        path can be a string or a sequence.
+        """
+        if isinstance(path, (list, tuple)):
+            path = os.path.join(*path)
+        f = open(path, 'w')
+        try:
+            f.write(content)
+        finally:
+            f.close()
 
 class DummyCommand:
     """Class to store options for retrieval via set_undefined_options()."""
diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py
index b2e9800..de58811 100644
--- a/Lib/distutils/tests/test_sdist.py
+++ b/Lib/distutils/tests/test_sdist.py
@@ -12,6 +12,7 @@
 from distutils.tests.test_config import PyPIRCCommandTestCase
 from distutils.errors import DistutilsExecError
 from distutils.spawn import find_executable
+from distutils.tests import support
 
 SETUP_PY = """
 from distutils.core import setup
@@ -20,13 +21,20 @@
 setup(name='fake')
 """
 
-MANIFEST_IN = """
-recursive-include somecode *
+MANIFEST = """\
+README
+setup.py
+data/data.dt
+scripts/script.py
+somecode/__init__.py
+somecode/doc.dat
+somecode/doc.txt
 """
 
-class sdistTestCase(PyPIRCCommandTestCase):
+class sdistTestCase(support.LoggingSilencer, PyPIRCCommandTestCase):
 
     def setUp(self):
+        support.LoggingSilencer.setUp(self)
         # PyPIRCCommandTestCase creates a temp dir already
         # and put it in self.tmp_dir
         PyPIRCCommandTestCase.setUp(self)
@@ -34,24 +42,34 @@
         self.old_path = os.getcwd()
         os.mkdir(join(self.tmp_dir, 'somecode'))
         os.mkdir(join(self.tmp_dir, 'dist'))
-        # creating a MANIFEST, a package, and a README
-        self._write(join(self.tmp_dir, 'MANIFEST.in'), MANIFEST_IN)
-        self._write(join(self.tmp_dir, 'README'), 'xxx')
-        self._write(join(self.tmp_dir, 'somecode', '__init__.py'), '#')
-        self._write(join(self.tmp_dir, 'setup.py'), SETUP_PY)
+        # a package, and a README
+        self.write_file((self.tmp_dir, 'README'), 'xxx')
+        self.write_file((self.tmp_dir, 'somecode', '__init__.py'), '#')
+        self.write_file((self.tmp_dir, 'setup.py'), SETUP_PY)
         os.chdir(self.tmp_dir)
 
     def tearDown(self):
         # back to normal
         os.chdir(self.old_path)
         PyPIRCCommandTestCase.tearDown(self)
+        support.LoggingSilencer.tearDown(self)
 
-    def _write(self, path, content):
-        f = open(path, 'w')
-        try:
-            f.write(content)
-        finally:
-            f.close()
+    def get_cmd(self, metadata=None):
+        """Returns a cmd"""
+        if metadata is None:
+            metadata = {'name': 'fake', 'version': '1.0',
+                        'url': 'xxx', 'author': 'xxx',
+                        'author_email': 'xxx'}
+        dist = Distribution(metadata)
+        dist.script_name = 'setup.py'
+        dist.packages = ['somecode']
+        dist.include_package_data = True
+        cmd = sdist(dist)
+        cmd.dist_dir = 'dist'
+        def _warn(*args):
+            pass
+        cmd.warn = _warn
+        return dist, cmd
 
     def test_prune_file_list(self):
         # this test creates a package with some vcs dirs in it
@@ -60,33 +78,24 @@
 
         # creating VCS directories with some files in them
         os.mkdir(join(self.tmp_dir, 'somecode', '.svn'))
-        self._write(join(self.tmp_dir, 'somecode', '.svn', 'ok.py'), 'xxx')
+        self.write_file((self.tmp_dir, 'somecode', '.svn', 'ok.py'), 'xxx')
 
         os.mkdir(join(self.tmp_dir, 'somecode', '.hg'))
-        self._write(join(self.tmp_dir, 'somecode', '.hg',
+        self.write_file((self.tmp_dir, 'somecode', '.hg',
                          'ok'), 'xxx')
 
         os.mkdir(join(self.tmp_dir, 'somecode', '.git'))
-        self._write(join(self.tmp_dir, 'somecode', '.git',
+        self.write_file((self.tmp_dir, 'somecode', '.git',
                          'ok'), 'xxx')
 
         # now building a sdist
-        dist = Distribution()
-        dist.script_name = 'setup.py'
-        dist.metadata.name = 'fake'
-        dist.metadata.version = '1.0'
-        dist.metadata.url = 'http://xxx'
-        dist.metadata.author = dist.metadata.author_email = 'xxx'
-        dist.packages = ['somecode']
-        dist.include_package_data = True
-        cmd = sdist(dist)
-        cmd.manifest = 'MANIFEST'
-        cmd.template = 'MANIFEST.in'
-        cmd.dist_dir = 'dist'
+        dist, cmd = self.get_cmd()
 
         # zip is available universally
         # (tar might not be installed under win32)
         cmd.formats = ['zip']
+
+        cmd.ensure_finalized()
         cmd.run()
 
         # now let's check what we have
@@ -111,21 +120,11 @@
             return
 
         # now building a sdist
-        dist = Distribution()
-        dist.script_name = 'setup.py'
-        dist.metadata.name = 'fake'
-        dist.metadata.version = '1.0'
-        dist.metadata.url = 'http://xxx'
-        dist.metadata.author = dist.metadata.author_email = 'xxx'
-        dist.packages = ['somecode']
-        dist.include_package_data = True
-        cmd = sdist(dist)
-        cmd.manifest = 'MANIFEST'
-        cmd.template = 'MANIFEST.in'
-        cmd.dist_dir = 'dist'
+        dist, cmd = self.get_cmd()
 
         # creating a gztar then a tar
         cmd.formats = ['gztar', 'tar']
+        cmd.ensure_finalized()
         cmd.run()
 
         # making sure we have two files
@@ -140,6 +139,8 @@
 
         # now trying a tar then a gztar
         cmd.formats = ['tar', 'gztar']
+
+        cmd.ensure_finalized()
         cmd.run()
 
         result = os.listdir(dist_folder)
@@ -147,6 +148,58 @@
         self.assertEquals(result,
                 ['fake-1.0.tar', 'fake-1.0.tar.gz'])
 
+    def test_add_defaults(self):
+
+        # http://bugs.python.org/issue2279
+
+        # add_default should also include
+        # data_files and package_data
+        dist, cmd = self.get_cmd()
+
+        # filling data_files by pointing files
+        # in package_data
+        dist.package_data = {'': ['*.cfg', '*.dat'],
+                             'somecode': ['*.txt']}
+        self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#')
+        self.write_file((self.tmp_dir, 'somecode', 'doc.dat'), '#')
+
+        # adding some data in data_files
+        data_dir = join(self.tmp_dir, 'data')
+        os.mkdir(data_dir)
+        self.write_file((data_dir, 'data.dt'), '#')
+        dist.data_files = [('data', ['data.dt'])]
+
+        # adding a script
+        script_dir = join(self.tmp_dir, 'scripts')
+        os.mkdir(script_dir)
+        self.write_file((script_dir, 'script.py'), '#')
+        dist.scripts = [join('scripts', 'script.py')]
+
+
+        cmd.formats = ['zip']
+        cmd.use_defaults = True
+
+        cmd.ensure_finalized()
+        cmd.run()
+
+        # now let's check what we have
+        dist_folder = join(self.tmp_dir, 'dist')
+        files = os.listdir(dist_folder)
+        self.assertEquals(files, ['fake-1.0.zip'])
+
+        zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
+        try:
+            content = zip_file.namelist()
+        finally:
+            zip_file.close()
+
+        # making sure everything was added
+        self.assertEquals(len(content), 8)
+
+        # checking the MANIFEST
+        manifest = open(join(self.tmp_dir, 'MANIFEST')).read()
+        self.assertEquals(manifest, MANIFEST)
+
 def test_suite():
     return unittest.makeSuite(sdistTestCase)
 
