Repository: pypa/hatch

Issue:
Follow best practices in `hatch new`
Since I rephrased that section (:stuck_out_tongue_closed_eyes:), [pytest now clearly recommends](https://docs.pytest.org/en/7.1.x/explanation/goodpractices.html) for new projects:

- [x] Tests outside application code
- [x] `src` layout (a recommendation [shared by PyPA](https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/), not explicitly but by the fact that it only lists disadvantages on the “flat layout” side of the comparison)
- [ ] [The `importlib` import mode](https://docs.pytest.org/en/7.1.x/explanation/goodpractices.html#choosing-an-import-mode)

So we should change the `new` project by

- switching to the `src` layout,
- deleting `tests/__init__.py`, and
- adding the following to `pyproject.toml`:

  ```toml
  [tool.pytest.ini_options]
  addopts = [
      "--import-mode=importlib",
  ]
  ```

See also #259

PS: my change also included using hatch in the pytest docs’ examples :smile: 

Discussion:
github-actions[bot]: ![Code Coverage](https://img.shields.io/badge/coverage-98.95%25-ok?style=flat)

Package | Statements
--- | ---
hatch | 97.10% (3862 / 3977)
hatchling | 97.16% (3216 / 3310)
tests | 100% (12703 / 12703)
**Summary** | 98.95% (19781 / 19990)

<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/backend/src/hatchling/builders/sdist.py b/backend/src/hatchling/builders/sdist.py
index 9c5808c5..aeecc39f 100644
--- a/backend/src/hatchling/builders/sdist.py
+++ b/backend/src/hatchling/builders/sdist.py
@@ -288,13 +288,21 @@ class SdistBuilder(BuilderInterface):
             contents += '    },\n'
 
         if packages:
+            src_layout = False
             contents += '    packages=[\n'
 
             for package in packages:
-                contents += f"        {package.replace(os.sep, '.')!r},\n"
+                if package.startswith(f'src{os.sep}'):
+                    src_layout = True
+                    contents += f"        {package.replace(os.sep, '.')[4:]!r},\n"
+                else:
+                    contents += f"        {package.replace(os.sep, '.')!r},\n"
 
             contents += '    ],\n'
 
+            if src_layout:
+                contents += "    package_dir={'': 'src'},\n"
+
         contents += ')\n'
 
         return contents
diff --git a/docs/config/project-templates.md b/docs/config/project-templates.md
index a487d568..2b5f4b4d 100644
--- a/docs/config/project-templates.md
+++ b/docs/config/project-templates.md
@@ -60,7 +60,7 @@ See [this blog post](https://blog.ionelmc.ro/2014/05/25/python-packaging/).
 
     ```toml
     [template.plugins.default]
-    src-layout = false
+    src-layout = true
     ```
 
 ## Feature flags
diff --git a/docs/history.md b/docs/history.md
index ab2a2c41..8e11c21f 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -14,6 +14,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 
 - Update best practices in project templates and documentation
 
+***Fixed:***
+
+- Fix the `support-legacy` option for the `sdist` target when using a `src`-layout project structure
+
 ### [1.6.2](https://github.com/pypa/hatch/releases/tag/hatch-v1.6.2) - 2022-10-20 ### {: #hatch-v1.6.2 }
 
 ***Fixed:***
diff --git a/src/hatch/config/model.py b/src/hatch/config/model.py
index 08a48747..dff8a887 100644
--- a/src/hatch/config/model.py
+++ b/src/hatch/config/model.py
@@ -548,7 +548,7 @@ class TemplateConfig(LazilyParsedConfig):
                 self._field_plugins = plugins
             else:
                 self._field_plugins = self.raw_data['plugins'] = {
-                    'default': {'tests': True, 'ci': False, 'src-layout': False}
+                    'default': {'tests': True, 'ci': False, 'src-layout': True}
                 }
 
         return self._field_plugins
diff --git a/src/hatch/template/default.py b/src/hatch/template/default.py
index 8def9fd3..ef371700 100644
--- a/src/hatch/template/default.py
+++ b/src/hatch/template/default.py
@@ -11,13 +11,13 @@ class DefaultTemplate(TemplateInterface):
         super().__init__(*args, **kwargs)
 
         self.plugin_config.setdefault('ci', False)
-        self.plugin_config.setdefault('src-layout', False)
+        self.plugin_config.setdefault('src-layout', True)
         self.plugin_config.setdefault('tests', True)
 
     def initialize_config(self, config):
         # Default values
         config['readme_file_path'] = 'README.md'
-        config['package_metadata_file_path'] = f'{config["package_name"]}/__about__.py'
+        config['package_metadata_file_path'] = f'src/{config["package_name"]}/__about__.py'
 
         license_data = {}
 
@@ -70,8 +70,8 @@ class DefaultTemplate(TemplateInterface):
         if config['args']['cli']:
             config['dependencies'].add('click')
 
-        if self.plugin_config['src-layout']:
-            config['package_metadata_file_path'] = f'src/{config["package_metadata_file_path"]}'
+        if not self.plugin_config['src-layout']:
+            config['package_metadata_file_path'] = f'{config["package_metadata_file_path"][4:]}'
 
     def get_files(self, config):
         files = list(find_template_files(files_default))


Test patch:
diff --git a/tests/backend/builders/test_custom.py b/tests/backend/builders/test_custom.py
index 696ac814..867a5c5f 100644
--- a/tests/backend/builders/test_custom.py
+++ b/tests/backend/builders/test_custom.py
@@ -41,7 +41,10 @@ def test_nonexistent(isolation):
         CustomBuilder(str(isolation), config=config)
 
 
-def test_default(hatch, helpers, temp_dir):
+def test_default(hatch, helpers, temp_dir, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -116,7 +119,10 @@ def test_default(hatch, helpers, temp_dir):
         assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
 
-def test_explicit_path(hatch, helpers, temp_dir):
+def test_explicit_path(hatch, helpers, temp_dir, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
diff --git a/tests/backend/builders/test_sdist.py b/tests/backend/builders/test_sdist.py
index f0b253bd..1d5db1c7 100644
--- a/tests/backend/builders/test_sdist.py
+++ b/tests/backend/builders/test_sdist.py
@@ -655,7 +655,10 @@ class TestConstructSetupPyFile:
 
 
 class TestBuildStandard:
-    def test_default(self, hatch, helpers, temp_dir):
+    def test_default(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -702,7 +705,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_default_no_reproducible(self, hatch, helpers, temp_dir):
+    def test_default_no_reproducible(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -750,7 +756,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime != get_reproducible_timestamp()
 
-    def test_default_support_legacy(self, hatch, helpers, temp_dir):
+    def test_default_support_legacy(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -795,7 +804,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_artifacts(self, hatch, helpers, temp_dir):
+    def test_default_build_script_artifacts(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -866,7 +878,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_extra_dependencies(self, hatch, helpers, temp_dir):
+    def test_default_build_script_extra_dependencies(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -938,7 +953,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_include_project_file(self, hatch, helpers, temp_dir):
+    def test_include_project_file(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -987,7 +1005,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_project_file_always_included(self, hatch, helpers, temp_dir):
+    def test_project_file_always_included(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1045,7 +1066,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_config_file_always_included(self, hatch, helpers, temp_dir):
+    def test_config_file_always_included(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1105,7 +1129,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_include_readme(self, hatch, helpers, temp_dir):
+    def test_include_readme(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1152,7 +1179,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_readme_always_included(self, hatch, helpers, temp_dir):
+    def test_readme_always_included(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1206,7 +1236,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_include_license_files(self, hatch, helpers, temp_dir):
+    def test_include_license_files(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1253,7 +1286,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_license_files_always_included(self, hatch, helpers, temp_dir):
+    def test_license_files_always_included(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1307,7 +1343,10 @@ class TestBuildStandard:
         stat = os.stat(str(extraction_directory / builder.project_id / 'PKG-INFO'))
         assert stat.st_mtime == get_reproducible_timestamp()
 
-    def test_default_vcs_git_exclusion_files(self, hatch, helpers, temp_dir):
+    def test_default_vcs_git_exclusion_files(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1362,7 +1401,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_vcs_mercurial_exclusion_files(self, hatch, helpers, temp_dir):
+    def test_default_vcs_mercurial_exclusion_files(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1431,7 +1473,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_no_strict_naming(self, hatch, helpers, temp_dir):
+    def test_no_strict_naming(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
diff --git a/tests/backend/builders/test_wheel.py b/tests/backend/builders/test_wheel.py
index 882f04df..f6cec3d3 100644
--- a/tests/backend/builders/test_wheel.py
+++ b/tests/backend/builders/test_wheel.py
@@ -468,7 +468,10 @@ class TestConstructEntryPointsFile:
 
 
 class TestBuildStandard:
-    def test_default_auto_detection(self, hatch, helpers, temp_dir):
+    def test_default_auto_detection(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -520,7 +523,10 @@ class TestBuildStandard:
             zip_info = zip_archive.getinfo(f'{metadata_directory}/WHEEL')
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
-    def test_default_reproducible_timestamp(self, hatch, helpers, temp_dir):
+    def test_default_reproducible_timestamp(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -570,7 +576,10 @@ class TestBuildStandard:
             zip_info = zip_archive.getinfo(f'{metadata_directory}/WHEEL')
             assert zip_info.date_time == (2020, 2, 2, 0, 1, 40)
 
-    def test_default_no_reproducible(self, hatch, helpers, temp_dir):
+    def test_default_no_reproducible(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -622,6 +631,7 @@ class TestBuildStandard:
 
     def test_default_multiple_licenses(self, hatch, helpers, config_file, temp_dir):
         project_name = 'My.App'
+        config_file.model.template.plugins['default']['src-layout'] = False
         config_file.model.template.licenses.default = ['MIT', 'Apache-2.0']
         config_file.save()
 
@@ -672,7 +682,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_include(self, hatch, helpers, temp_dir):
+    def test_default_include(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -719,7 +732,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_only_packages(self, hatch, helpers, temp_dir):
+    def test_default_only_packages(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -772,7 +788,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_only_packages_artifact_override(self, hatch, helpers, temp_dir):
+    def test_default_only_packages_artifact_override(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -826,7 +845,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_python_constraint(self, hatch, helpers, temp_dir):
+    def test_default_python_constraint(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -872,7 +894,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_default_tag(self, hatch, helpers, temp_dir):
+    def test_default_build_script_default_tag(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -936,7 +961,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_set_tag(self, hatch, helpers, temp_dir):
+    def test_default_build_script_set_tag(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1001,7 +1029,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_known_artifacts(self, hatch, helpers, temp_dir):
+    def test_default_build_script_known_artifacts(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1080,7 +1111,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_configured_build_hooks(self, hatch, helpers, temp_dir):
+    def test_default_build_script_configured_build_hooks(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1159,7 +1193,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_extra_dependencies(self, hatch, helpers, temp_dir):
+    def test_default_build_script_extra_dependencies(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1239,7 +1276,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_dynamic_artifacts(self, hatch, helpers, temp_dir):
+    def test_default_build_script_dynamic_artifacts(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1318,7 +1358,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_dynamic_force_include(self, hatch, helpers, temp_dir):
+    def test_default_build_script_dynamic_force_include(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1400,10 +1443,7 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_build_script_dynamic_artifacts_with_src_layout(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_default_build_script_dynamic_artifacts_with_src_layout(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1484,7 +1524,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_shared_data(self, hatch, helpers, temp_dir):
+    def test_default_shared_data(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1541,7 +1584,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_extra_metadata(self, hatch, helpers, temp_dir):
+    def test_default_extra_metadata(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1597,7 +1643,10 @@ class TestBuildStandard:
         helpers.assert_files(extraction_directory, expected_files)
 
     @pytest.mark.requires_unix
-    def test_default_symlink(self, hatch, helpers, temp_dir):
+    def test_default_symlink(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1680,10 +1729,7 @@ class TestBuildStandard:
         helpers.assert_files(extraction_directory, expected_files)
 
     @fixed_pathlib_resolution
-    def test_editable_default(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_editable_default(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1740,10 +1786,7 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_default_extra_dependencies(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_editable_default_extra_dependencies(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1815,10 +1858,7 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_default_force_include(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_editable_default_force_include(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1891,10 +1931,7 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_default_force_include_option(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_editable_default_force_include_option(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -1958,7 +1995,10 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_exact(self, hatch, helpers, temp_dir):
+    def test_editable_exact(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2015,7 +2055,10 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_exact_extra_dependencies(self, hatch, helpers, temp_dir):
+    def test_editable_exact_extra_dependencies(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2091,7 +2134,10 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_exact_force_include(self, hatch, helpers, temp_dir):
+    def test_editable_exact_force_include(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2168,7 +2214,10 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_exact_force_include_option(self, hatch, helpers, temp_dir):
+    def test_editable_exact_force_include_option(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2233,7 +2282,10 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_exact_force_include_build_data_precedence(self, hatch, helpers, temp_dir):
+    def test_editable_exact_force_include_build_data_precedence(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2315,10 +2367,7 @@ class TestBuildStandard:
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
     @fixed_pathlib_resolution
-    def test_editable_pth(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_editable_pth(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2374,7 +2423,10 @@ class TestBuildStandard:
             zip_info = zip_archive.getinfo(f'{metadata_directory}/WHEEL')
             assert zip_info.date_time == (2020, 2, 2, 0, 0, 0)
 
-    def test_default_namespace_package(self, hatch, helpers, temp_dir):
+    def test_default_namespace_package(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2427,7 +2479,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_default_entry_points(self, hatch, helpers, temp_dir):
+    def test_default_entry_points(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2473,10 +2528,7 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_explicit_selection_with_src_layout(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_explicit_selection_with_src_layout(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2534,6 +2586,9 @@ class TestBuildStandard:
         helpers.assert_files(extraction_directory, expected_files)
 
     def test_single_module(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2575,7 +2630,10 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_no_strict_naming(self, hatch, helpers, temp_dir):
+    def test_no_strict_naming(self, hatch, helpers, temp_dir, config_file):
+        config_file.model.template.plugins['default']['src-layout'] = False
+        config_file.save()
+
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
@@ -2623,10 +2681,7 @@ class TestBuildStandard:
         )
         helpers.assert_files(extraction_directory, expected_files)
 
-    def test_editable_sources_rewrite_error(self, hatch, helpers, temp_dir, config_file):
-        config_file.model.template.plugins['default']['src-layout'] = True
-        config_file.save()
-
+    def test_editable_sources_rewrite_error(self, hatch, helpers, temp_dir):
         project_name = 'My.App'
 
         with temp_dir.as_cwd():
diff --git a/tests/backend/test_build.py b/tests/backend/test_build.py
index a127fda4..810956da 100644
--- a/tests/backend/test_build.py
+++ b/tests/backend/test_build.py
@@ -1,7 +1,10 @@
 from hatchling.build import build_editable, build_sdist, build_wheel
 
 
-def test_sdist(hatch, helpers, temp_dir):
+def test_sdist(hatch, helpers, temp_dir, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -39,7 +42,10 @@ def test_sdist(hatch, helpers, temp_dir):
     assert expected_artifact.endswith('.tar.gz')
 
 
-def test_wheel(hatch, helpers, temp_dir):
+def test_wheel(hatch, helpers, temp_dir, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -77,7 +83,10 @@ def test_wheel(hatch, helpers, temp_dir):
     assert expected_artifact.endswith('.whl')
 
 
-def test_editable(hatch, helpers, temp_dir):
+def test_editable(hatch, helpers, temp_dir, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
diff --git a/tests/cli/build/test_build.py b/tests/cli/build/test_build.py
index f8685eae..a199160b 100644
--- a/tests/cli/build/test_build.py
+++ b/tests/cli/build/test_build.py
@@ -269,7 +269,10 @@ def test_explicit_directory_env_var(hatch, temp_dir, helpers):
     )
 
 
-def test_clean(hatch, temp_dir, helpers):
+def test_clean(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -410,7 +413,10 @@ def test_clean_env_var(hatch, temp_dir, helpers):
     )
 
 
-def test_clean_only(hatch, temp_dir, helpers):
+def test_clean_only(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -474,7 +480,10 @@ def test_clean_only(hatch, temp_dir, helpers):
     )
 
 
-def test_clean_only_hooks_only(hatch, temp_dir, helpers):
+def test_clean_only_hooks_only(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -538,7 +547,10 @@ def test_clean_only_hooks_only(hatch, temp_dir, helpers):
     )
 
 
-def test_clean_hooks_after(hatch, temp_dir, helpers):
+def test_clean_hooks_after(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -599,7 +611,10 @@ def test_clean_hooks_after(hatch, temp_dir, helpers):
     )
 
 
-def test_clean_hooks_after_env_var(hatch, temp_dir, helpers):
+def test_clean_hooks_after_env_var(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -660,7 +675,10 @@ def test_clean_hooks_after_env_var(hatch, temp_dir, helpers):
     )
 
 
-def test_clean_only_no_hooks(hatch, temp_dir, helpers):
+def test_clean_only_no_hooks(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -724,7 +742,10 @@ def test_clean_only_no_hooks(hatch, temp_dir, helpers):
     )
 
 
-def test_hooks_only(hatch, temp_dir, helpers):
+def test_hooks_only(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -776,7 +797,10 @@ def test_hooks_only(hatch, temp_dir, helpers):
     )
 
 
-def test_hooks_only_env_var(hatch, temp_dir, helpers):
+def test_hooks_only_env_var(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
@@ -828,7 +852,10 @@ def test_hooks_only_env_var(hatch, temp_dir, helpers):
     )
 
 
-def test_extensions_only(hatch, temp_dir, helpers):
+def test_extensions_only(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
diff --git a/tests/cli/clean/test_clean.py b/tests/cli/clean/test_clean.py
index c0fac02a..2ac235de 100644
--- a/tests/cli/clean/test_clean.py
+++ b/tests/cli/clean/test_clean.py
@@ -10,7 +10,10 @@ def local_builder(mock_backend_process, mocker):
     yield
 
 
-def test(hatch, temp_dir, helpers):
+def test(hatch, temp_dir, helpers, config_file):
+    config_file.model.template.plugins['default']['src-layout'] = False
+    config_file.save()
+
     project_name = 'My.App'
 
     with temp_dir.as_cwd():
diff --git a/tests/cli/config/test_show.py b/tests/cli/config/test_show.py
index abf28ef1..809ad8d2 100644
--- a/tests/cli/config/test_show.py
+++ b/tests/cli/config/test_show.py
@@ -38,7 +38,7 @@ def test_default_scrubbed(hatch, config_file, helpers, default_cache_dir, defaul
         [template.plugins.default]
         tests = true
         ci = false
-        src-layout = false
+        src-layout = true
 
         [terminal.styles]
         info = "bold"
@@ -96,7 +96,7 @@ def test_reveal(hatch, config_file, helpers, default_cache_dir, default_data_dir
         [template.plugins.default]
         tests = true
         ci = false
-        src-layout = false
+        src-layout = true
 
         [terminal.styles]
         info = "bold"
diff --git a/tests/cli/new/test_new.py b/tests/cli/new/test_new.py
index 6bd92656..6c422265 100644
--- a/tests/cli/new/test_new.py
+++ b/tests/cli/new/test_new.py
@@ -66,9 +66,10 @@ def test_default(hatch, helpers, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -90,9 +91,10 @@ def test_default_explicit_path(hatch, helpers, temp_dir):
     assert result.exit_code == 0, result.output
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
-        my_app
-        ├── __about__.py
-        └── __init__.py
+        src
+        └── my_app
+            ├── __about__.py
+            └── __init__.py
         tests
         └── __init__.py
         LICENSE.txt
@@ -119,9 +121,10 @@ def test_default_empty_plugins_table(hatch, helpers, config_file, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -149,9 +152,10 @@ def test_default_no_license_cache(hatch, helpers, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -181,9 +185,10 @@ def test_licenses_multiple(hatch, helpers, config_file, temp_dir):
         ├── LICENSES
         │   ├── Apache-2.0.txt
         │   └── MIT.txt
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── README.md
@@ -209,9 +214,10 @@ def test_licenses_empty(hatch, helpers, config_file, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── README.md
@@ -241,9 +247,10 @@ def test_projects_urls_space_in_label(hatch, helpers, config_file, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -270,9 +277,10 @@ def test_projects_urls_empty(hatch, helpers, config_file, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -297,12 +305,13 @@ def test_feature_cli(hatch, helpers, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── cli
-        │   │   └── __init__.py
-        │   ├── __about__.py
-        │   ├── __init__.py
-        │   └── __main__.py
+        ├── src
+        │   └── my_app
+        │       ├── cli
+        │       │   └── __init__.py
+        │       ├── __about__.py
+        │       ├── __init__.py
+        │       └── __main__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -333,9 +342,10 @@ def test_feature_ci(hatch, helpers, config_file, temp_dir):
         ├── .github
         │   └── workflows
         │       └── test.yml
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -345,8 +355,8 @@ def test_feature_ci(hatch, helpers, config_file, temp_dir):
     )
 
 
-def test_feature_src_layout(hatch, helpers, config_file, temp_dir):
-    config_file.model.template.plugins['default']['src-layout'] = True
+def test_feature_no_src_layout(hatch, helpers, config_file, temp_dir):
+    config_file.model.template.plugins['default']['src-layout'] = False
     config_file.save()
 
     project_name = 'My.App'
@@ -356,17 +366,16 @@ def test_feature_src_layout(hatch, helpers, config_file, temp_dir):
 
     path = temp_dir / 'my-app'
 
-    expected_files = helpers.get_template_files('new.feature_src_layout', project_name)
+    expected_files = helpers.get_template_files('new.feature_no_src_layout', project_name)
     helpers.assert_files(path, expected_files)
 
     assert result.exit_code == 0, result.output
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── src
-        │   └── my_app
-        │       ├── __about__.py
-        │       └── __init__.py
+        ├── my_app
+        │   ├── __about__.py
+        │   └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -394,9 +403,10 @@ def test_feature_tests_disable(hatch, helpers, config_file, temp_dir):
     assert remove_trailing_spaces(result.output) == helpers.dedent(
         """
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── LICENSE.txt
         ├── README.md
         └── pyproject.toml
@@ -435,9 +445,10 @@ def test_interactive(hatch, helpers, temp_dir):
         Description []: {description}
 
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
@@ -466,9 +477,10 @@ def test_no_project_name_enables_interactive(hatch, helpers, temp_dir):
         Description []: {description}
 
         my-app
-        ├── my_app
-        │   ├── __about__.py
-        │   └── __init__.py
+        ├── src
+        │   └── my_app
+        │       ├── __about__.py
+        │       └── __init__.py
         ├── tests
         │   └── __init__.py
         ├── LICENSE.txt
diff --git a/tests/config/test_model.py b/tests/config/test_model.py
index c0d3ea2f..e5f1608d 100644
--- a/tests/config/test_model.py
+++ b/tests/config/test_model.py
@@ -26,7 +26,7 @@ def test_default(default_cache_dir, default_data_dir):
             'name': 'Foo Bar',
             'email': 'foo@bar.baz',
             'licenses': {'default': ['MIT'], 'headers': True},
-            'plugins': {'default': {'ci': False, 'src-layout': False, 'tests': True}},
+            'plugins': {'default': {'ci': False, 'src-layout': True, 'tests': True}},
         },
         'terminal': {
             'styles': {
@@ -1069,9 +1069,9 @@ class TestTemplate:
     def test_plugins_default(self):
         config = RootConfig({})
 
-        assert config.template.plugins == {'default': {'ci': False, 'src-layout': False, 'tests': True}}
+        assert config.template.plugins == {'default': {'ci': False, 'src-layout': True, 'tests': True}}
         assert config.raw_data == {
-            'template': {'plugins': {'default': {'ci': False, 'src-layout': False, 'tests': True}}}
+            'template': {'plugins': {'default': {'ci': False, 'src-layout': True, 'tests': True}}}
         }
 
     def test_plugins_not_table(self, helpers):
diff --git a/tests/helpers/templates/new/basic.py b/tests/helpers/templates/new/basic.py
index 10924ef6..267b9722 100644
--- a/tests/helpers/templates/new/basic.py
+++ b/tests/helpers/templates/new/basic.py
@@ -13,7 +13,7 @@ def get_files(**kwargs):
             ),
         ),
         File(
-            Path(kwargs['package_name'], '__init__.py'),
+            Path('src', kwargs['package_name'], '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -21,7 +21,7 @@ def get_files(**kwargs):
 """,
         ),
         File(
-            Path(kwargs['package_name'], '__about__.py'),
+            Path('src', kwargs['package_name'], '__about__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -92,7 +92,7 @@ Issues = "https://github.com/unknown/{kwargs['project_name_normalized']}/issues"
 Source = "https://github.com/unknown/{kwargs['project_name_normalized']}"
 
 [tool.hatch.version]
-path = "{kwargs['package_name']}/__about__.py"
-""",
+path = "src/{kwargs['package_name']}/__about__.py"
+""",  # noqa: E501
         ),
-    ]  # noqa: E501
+    ]
diff --git a/tests/helpers/templates/new/default.py b/tests/helpers/templates/new/default.py
index 422e0e47..1086ef22 100644
--- a/tests/helpers/templates/new/default.py
+++ b/tests/helpers/templates/new/default.py
@@ -15,7 +15,7 @@ def get_files(**kwargs):
             ),
         ),
         File(
-            Path(kwargs['package_name'], '__init__.py'),
+            Path('src', kwargs['package_name'], '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -23,7 +23,7 @@ def get_files(**kwargs):
 """,
         ),
         File(
-            Path(kwargs['package_name'], '__about__.py'),
+            Path('src', kwargs['package_name'], '__about__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -102,7 +102,7 @@ Issues = "https://github.com/unknown/{kwargs['project_name_normalized']}/issues"
 Source = "https://github.com/unknown/{kwargs['project_name_normalized']}"
 
 [tool.hatch.version]
-path = "{kwargs['package_name']}/__about__.py"
+path = "src/{kwargs['package_name']}/__about__.py"
 
 [tool.hatch.envs.default]
 dependencies = [
@@ -110,7 +110,7 @@ dependencies = [
   "pytest-cov",
 ]
 [tool.hatch.envs.default.scripts]
-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov={kwargs['package_name']} --cov=tests {{args}}"
+cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/{kwargs['package_name']} --cov=tests {{args}}"
 no-cov = "cov --no-cov {{args}}"
 
 [[tool.hatch.envs.test.matrix]]
@@ -120,7 +120,7 @@ python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
 branch = true
 parallel = true
 omit = [
-  "{kwargs['package_name']}/__about__.py",
+  "src/{kwargs['package_name']}/__about__.py",
 ]
 
 [tool.coverage.report]
@@ -129,6 +129,6 @@ exclude_lines = [
   "if __name__ == .__main__.:",
   "if TYPE_CHECKING:",
 ]
-""",
+""",  # noqa: E501
         ),
-    ]  # noqa: E501
+    ]
diff --git a/tests/helpers/templates/new/feature_cli.py b/tests/helpers/templates/new/feature_cli.py
index e82404b2..792ef6f2 100644
--- a/tests/helpers/templates/new/feature_cli.py
+++ b/tests/helpers/templates/new/feature_cli.py
@@ -13,7 +13,7 @@ def get_files(**kwargs):
             ),
         ),
         File(
-            Path(kwargs['package_name'], '__init__.py'),
+            Path('src', kwargs['package_name'], '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -21,7 +21,7 @@ def get_files(**kwargs):
 """,
         ),
         File(
-            Path(kwargs['package_name'], '__about__.py'),
+            Path('src', kwargs['package_name'], '__about__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -30,7 +30,7 @@ __version__ = '0.0.1'
 """,
         ),
         File(
-            Path(kwargs['package_name'], '__main__.py'),
+            Path('src', kwargs['package_name'], '__main__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -44,7 +44,7 @@ if __name__ == '__main__':
 """,
         ),
         File(
-            Path(kwargs['package_name'], 'cli', '__init__.py'),
+            Path('src', kwargs['package_name'], 'cli', '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -137,7 +137,7 @@ Source = "https://github.com/unknown/{kwargs['project_name_normalized']}"
 {kwargs['project_name_normalized']} = "{kwargs['package_name']}.cli:{kwargs['package_name']}"
 
 [tool.hatch.version]
-path = "{kwargs['package_name']}/__about__.py"
+path = "src/{kwargs['package_name']}/__about__.py"
 
 [tool.hatch.envs.default]
 dependencies = [
@@ -145,7 +145,7 @@ dependencies = [
   "pytest-cov",
 ]
 [tool.hatch.envs.default.scripts]
-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov={kwargs['package_name']} --cov=tests {{args}}"
+cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/{kwargs['package_name']} --cov=tests {{args}}"
 no-cov = "cov --no-cov {{args}}"
 
 [[tool.hatch.envs.test.matrix]]
@@ -155,7 +155,7 @@ python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
 branch = true
 parallel = true
 omit = [
-  "{kwargs['package_name']}/__about__.py",
+  "src/{kwargs['package_name']}/__about__.py",
 ]
 
 [tool.coverage.report]
@@ -164,6 +164,6 @@ exclude_lines = [
   "if __name__ == .__main__.:",
   "if TYPE_CHECKING:",
 ]
-""",
+""",  # noqa: E501
         ),
-    ]  # noqa: E501
+    ]
diff --git a/tests/helpers/templates/new/feature_src_layout.py b/tests/helpers/templates/new/feature_no_src_layout.py
similarity index 91%
rename from tests/helpers/templates/new/feature_src_layout.py
rename to tests/helpers/templates/new/feature_no_src_layout.py
index 1086ef22..422e0e47 100644
--- a/tests/helpers/templates/new/feature_src_layout.py
+++ b/tests/helpers/templates/new/feature_no_src_layout.py
@@ -15,7 +15,7 @@ def get_files(**kwargs):
             ),
         ),
         File(
-            Path('src', kwargs['package_name'], '__init__.py'),
+            Path(kwargs['package_name'], '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -23,7 +23,7 @@ def get_files(**kwargs):
 """,
         ),
         File(
-            Path('src', kwargs['package_name'], '__about__.py'),
+            Path(kwargs['package_name'], '__about__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -102,7 +102,7 @@ Issues = "https://github.com/unknown/{kwargs['project_name_normalized']}/issues"
 Source = "https://github.com/unknown/{kwargs['project_name_normalized']}"
 
 [tool.hatch.version]
-path = "src/{kwargs['package_name']}/__about__.py"
+path = "{kwargs['package_name']}/__about__.py"
 
 [tool.hatch.envs.default]
 dependencies = [
@@ -110,7 +110,7 @@ dependencies = [
   "pytest-cov",
 ]
 [tool.hatch.envs.default.scripts]
-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/{kwargs['package_name']} --cov=tests {{args}}"
+cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov={kwargs['package_name']} --cov=tests {{args}}"
 no-cov = "cov --no-cov {{args}}"
 
 [[tool.hatch.envs.test.matrix]]
@@ -120,7 +120,7 @@ python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
 branch = true
 parallel = true
 omit = [
-  "src/{kwargs['package_name']}/__about__.py",
+  "{kwargs['package_name']}/__about__.py",
 ]
 
 [tool.coverage.report]
@@ -129,6 +129,6 @@ exclude_lines = [
   "if __name__ == .__main__.:",
   "if TYPE_CHECKING:",
 ]
-""",  # noqa: E501
+""",
         ),
-    ]
+    ]  # noqa: E501
diff --git a/tests/helpers/templates/new/licenses_empty.py b/tests/helpers/templates/new/licenses_empty.py
index f766d6cb..82223732 100644
--- a/tests/helpers/templates/new/licenses_empty.py
+++ b/tests/helpers/templates/new/licenses_empty.py
@@ -4,8 +4,8 @@ from hatch.utils.fs import Path
 
 def get_files(**kwargs):
     return [
-        File(Path(kwargs['package_name'], '__init__.py')),
-        File(Path(kwargs['package_name'], '__about__.py'), "__version__ = '0.0.1'\n"),
+        File(Path('src', kwargs['package_name'], '__init__.py')),
+        File(Path('src', kwargs['package_name'], '__about__.py'), "__version__ = '0.0.1'\n"),
         File(Path('tests', '__init__.py')),
         File(
             Path('README.md'),
@@ -65,7 +65,7 @@ Issues = "https://github.com/unknown/{kwargs['project_name_normalized']}/issues"
 Source = "https://github.com/unknown/{kwargs['project_name_normalized']}"
 
 [tool.hatch.version]
-path = "{kwargs['package_name']}/__about__.py"
+path = "src/{kwargs['package_name']}/__about__.py"
 
 [tool.hatch.envs.default]
 dependencies = [
@@ -73,7 +73,7 @@ dependencies = [
   "pytest-cov",
 ]
 [tool.hatch.envs.default.scripts]
-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov={kwargs['package_name']} --cov=tests {{args}}"
+cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/{kwargs['package_name']} --cov=tests {{args}}"
 no-cov = "cov --no-cov {{args}}"
 
 [[tool.hatch.envs.test.matrix]]
@@ -83,7 +83,7 @@ python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
 branch = true
 parallel = true
 omit = [
-  "{kwargs['package_name']}/__about__.py",
+  "src/{kwargs['package_name']}/__about__.py",
 ]
 
 [tool.coverage.report]
@@ -92,6 +92,6 @@ exclude_lines = [
   "if __name__ == .__main__.:",
   "if TYPE_CHECKING:",
 ]
-""",
+""",  # noqa: E501
         ),
-    ]  # noqa: E501
+    ]
diff --git a/tests/helpers/templates/new/licenses_multiple.py b/tests/helpers/templates/new/licenses_multiple.py
index a04f9d16..d039778d 100644
--- a/tests/helpers/templates/new/licenses_multiple.py
+++ b/tests/helpers/templates/new/licenses_multiple.py
@@ -14,7 +14,7 @@ def get_files(**kwargs):
             ),
         ),
         File(
-            Path(kwargs['package_name'], '__init__.py'),
+            Path('src', kwargs['package_name'], '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -22,7 +22,7 @@ def get_files(**kwargs):
 """,
         ),
         File(
-            Path(kwargs['package_name'], '__about__.py'),
+            Path('src', kwargs['package_name'], '__about__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -105,7 +105,7 @@ Issues = "https://github.com/unknown/{kwargs['project_name_normalized']}/issues"
 Source = "https://github.com/unknown/{kwargs['project_name_normalized']}"
 
 [tool.hatch.version]
-path = "{kwargs['package_name']}/__about__.py"
+path = "src/{kwargs['package_name']}/__about__.py"
 
 [tool.hatch.envs.default]
 dependencies = [
@@ -113,7 +113,7 @@ dependencies = [
   "pytest-cov",
 ]
 [tool.hatch.envs.default.scripts]
-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov={kwargs['package_name']} --cov=tests {{args}}"
+cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/{kwargs['package_name']} --cov=tests {{args}}"
 no-cov = "cov --no-cov {{args}}"
 
 [[tool.hatch.envs.test.matrix]]
@@ -123,7 +123,7 @@ python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
 branch = true
 parallel = true
 omit = [
-  "{kwargs['package_name']}/__about__.py",
+  "src/{kwargs['package_name']}/__about__.py",
 ]
 
 [tool.coverage.report]
@@ -132,6 +132,6 @@ exclude_lines = [
   "if __name__ == .__main__.:",
   "if TYPE_CHECKING:",
 ]
-""",
+""",  # noqa: E501
         ),
-    ]  # noqa: E501
+    ]
diff --git a/tests/helpers/templates/new/projects_urls_empty.py b/tests/helpers/templates/new/projects_urls_empty.py
index c5974613..d8b0b1e3 100644
--- a/tests/helpers/templates/new/projects_urls_empty.py
+++ b/tests/helpers/templates/new/projects_urls_empty.py
@@ -13,7 +13,7 @@ def get_files(**kwargs):
             ),
         ),
         File(
-            Path(kwargs['package_name'], '__init__.py'),
+            Path('src', kwargs['package_name'], '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -21,7 +21,7 @@ def get_files(**kwargs):
 """,
         ),
         File(
-            Path(kwargs['package_name'], '__about__.py'),
+            Path('src', kwargs['package_name'], '__about__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -97,7 +97,7 @@ dynamic = ["version"]
 [project.urls]
 
 [tool.hatch.version]
-path = "{kwargs['package_name']}/__about__.py"
+path = "src/{kwargs['package_name']}/__about__.py"
 
 [tool.hatch.envs.default]
 dependencies = [
@@ -105,7 +105,7 @@ dependencies = [
   "pytest-cov",
 ]
 [tool.hatch.envs.default.scripts]
-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov={kwargs['package_name']} --cov=tests {{args}}"
+cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/{kwargs['package_name']} --cov=tests {{args}}"
 no-cov = "cov --no-cov {{args}}"
 
 [[tool.hatch.envs.test.matrix]]
@@ -115,7 +115,7 @@ python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
 branch = true
 parallel = true
 omit = [
-  "{kwargs['package_name']}/__about__.py",
+  "src/{kwargs['package_name']}/__about__.py",
 ]
 
 [tool.coverage.report]
@@ -124,6 +124,6 @@ exclude_lines = [
   "if __name__ == .__main__.:",
   "if TYPE_CHECKING:",
 ]
-""",
+""",  # noqa: E501
         ),
-    ]  # noqa: E501
+    ]
diff --git a/tests/helpers/templates/new/projects_urls_space_in_label.py b/tests/helpers/templates/new/projects_urls_space_in_label.py
index 8963552b..115d30dd 100644
--- a/tests/helpers/templates/new/projects_urls_space_in_label.py
+++ b/tests/helpers/templates/new/projects_urls_space_in_label.py
@@ -13,7 +13,7 @@ def get_files(**kwargs):
             ),
         ),
         File(
-            Path(kwargs['package_name'], '__init__.py'),
+            Path('src', kwargs['package_name'], '__init__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -21,7 +21,7 @@ def get_files(**kwargs):
 """,
         ),
         File(
-            Path(kwargs['package_name'], '__about__.py'),
+            Path('src', kwargs['package_name'], '__about__.py'),
             f"""\
 # SPDX-FileCopyrightText: {kwargs['year']}-present {kwargs['author']} <{kwargs['email']}>
 #
@@ -100,7 +100,7 @@ Source = "https://github.com/unknown/{kwargs['project_name_normalized']}"
 "Bug Tracker" = "https://github.com/unknown/{kwargs['project_name_normalized']}/issues"
 
 [tool.hatch.version]
-path = "{kwargs['package_name']}/__about__.py"
+path = "src/{kwargs['package_name']}/__about__.py"
 
 [tool.hatch.envs.default]
 dependencies = [
@@ -108,7 +108,7 @@ dependencies = [
   "pytest-cov",
 ]
 [tool.hatch.envs.default.scripts]
-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov={kwargs['package_name']} --cov=tests {{args}}"
+cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/{kwargs['package_name']} --cov=tests {{args}}"
 no-cov = "cov --no-cov {{args}}"
 
 [[tool.hatch.envs.test.matrix]]
@@ -118,7 +118,7 @@ python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
 branch = true
 parallel = true
 omit = [
-  "{kwargs['package_name']}/__about__.py",
+  "src/{kwargs['package_name']}/__about__.py",
 ]
 
 [tool.coverage.report]
@@ -127,6 +127,6 @@ exclude_lines = [
   "if __name__ == .__main__.:",
   "if TYPE_CHECKING:",
 ]
-""",
+""",  # noqa: E501
         ),
-    ]  # noqa: E501
+    ]
diff --git a/tests/helpers/templates/sdist/standard_default.py b/tests/helpers/templates/sdist/standard_default.py
index 2ffc7e15..7a8e6716 100644
--- a/tests/helpers/templates/sdist/standard_default.py
+++ b/tests/helpers/templates/sdist/standard_default.py
@@ -2,7 +2,7 @@ from hatch.template import File
 from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/sdist/standard_default_build_script_artifacts.py b/tests/helpers/templates/sdist/standard_default_build_script_artifacts.py
index fd3436ad..3f64263c 100644
--- a/tests/helpers/templates/sdist/standard_default_build_script_artifacts.py
+++ b/tests/helpers/templates/sdist/standard_default_build_script_artifacts.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 from hatchling.utils.constants import DEFAULT_BUILD_SCRIPT
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/sdist/standard_default_build_script_extra_dependencies.py b/tests/helpers/templates/sdist/standard_default_build_script_extra_dependencies.py
index 7449df83..7758aeb7 100644
--- a/tests/helpers/templates/sdist/standard_default_build_script_extra_dependencies.py
+++ b/tests/helpers/templates/sdist/standard_default_build_script_extra_dependencies.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 from hatchling.utils.constants import DEFAULT_BUILD_SCRIPT
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/sdist/standard_default_support_legacy.py b/tests/helpers/templates/sdist/standard_default_support_legacy.py
index 668ebae2..9fa4a458 100644
--- a/tests/helpers/templates/sdist/standard_default_support_legacy.py
+++ b/tests/helpers/templates/sdist/standard_default_support_legacy.py
@@ -2,7 +2,7 @@ from hatch.template import File
 from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/sdist/standard_default_vcs_git_exclusion_files.py b/tests/helpers/templates/sdist/standard_default_vcs_git_exclusion_files.py
index a314ac55..7739bfcd 100644
--- a/tests/helpers/templates/sdist/standard_default_vcs_git_exclusion_files.py
+++ b/tests/helpers/templates/sdist/standard_default_vcs_git_exclusion_files.py
@@ -2,7 +2,7 @@ from hatch.template import File
 from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/sdist/standard_default_vcs_mercurial_exclusion_files.py b/tests/helpers/templates/sdist/standard_default_vcs_mercurial_exclusion_files.py
index bc5d5df2..8156eedd 100644
--- a/tests/helpers/templates/sdist/standard_default_vcs_mercurial_exclusion_files.py
+++ b/tests/helpers/templates/sdist/standard_default_vcs_mercurial_exclusion_files.py
@@ -2,7 +2,7 @@ from hatch.template import File
 from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/sdist/standard_include.py b/tests/helpers/templates/sdist/standard_include.py
index f7e0675b..7859c25e 100644
--- a/tests/helpers/templates/sdist/standard_include.py
+++ b/tests/helpers/templates/sdist/standard_include.py
@@ -2,7 +2,7 @@ from hatch.template import File
 from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/sdist/standard_include_config_file.py b/tests/helpers/templates/sdist/standard_include_config_file.py
index 09cfbaec..4967391b 100644
--- a/tests/helpers/templates/sdist/standard_include_config_file.py
+++ b/tests/helpers/templates/sdist/standard_include_config_file.py
@@ -2,7 +2,7 @@ from hatch.template import File
 from hatch.utils.fs import Path
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 
 
 def get_files(**kwargs):
diff --git a/tests/helpers/templates/wheel/standard_default_build_script.py b/tests/helpers/templates/wheel/standard_default_build_script.py
index c1658f2c..f14e8549 100644
--- a/tests/helpers/templates/wheel/standard_default_build_script.py
+++ b/tests/helpers/templates/wheel/standard_default_build_script.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_build_script_artifacts.py b/tests/helpers/templates/wheel/standard_default_build_script_artifacts.py
index a6c0fa60..73308c32 100644
--- a/tests/helpers/templates/wheel/standard_default_build_script_artifacts.py
+++ b/tests/helpers/templates/wheel/standard_default_build_script_artifacts.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_build_script_artifacts_with_src_layout.py b/tests/helpers/templates/wheel/standard_default_build_script_artifacts_with_src_layout.py
index 63af7da8..b72bdb3e 100644
--- a/tests/helpers/templates/wheel/standard_default_build_script_artifacts_with_src_layout.py
+++ b/tests/helpers/templates/wheel/standard_default_build_script_artifacts_with_src_layout.py
@@ -15,10 +15,10 @@ def get_files(**kwargs):
         if str(f.path) == 'LICENSE.txt':
             files.append(File(Path(metadata_directory, 'licenses', f.path), f.contents))
 
-        if f.path.parts[0] != kwargs['package_name']:
+        if f.path.parts[0] != 'src':
             continue
 
-        files.append(f)
+        files.append(File(Path(*f.path.parts[1:]), f.contents))
 
     files.append(File(Path(kwargs['package_name'], 'lib.so'), ''))
     files.append(File(Path('zlib.pyd'), ''))
diff --git a/tests/helpers/templates/wheel/standard_default_build_script_configured_build_hooks.py b/tests/helpers/templates/wheel/standard_default_build_script_configured_build_hooks.py
index c4682eef..3f6507ec 100644
--- a/tests/helpers/templates/wheel/standard_default_build_script_configured_build_hooks.py
+++ b/tests/helpers/templates/wheel/standard_default_build_script_configured_build_hooks.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_build_script_extra_dependencies.py b/tests/helpers/templates/wheel/standard_default_build_script_extra_dependencies.py
index b9b8a6f6..800750c4 100644
--- a/tests/helpers/templates/wheel/standard_default_build_script_extra_dependencies.py
+++ b/tests/helpers/templates/wheel/standard_default_build_script_extra_dependencies.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_build_script_force_include.py b/tests/helpers/templates/wheel/standard_default_build_script_force_include.py
index f82c7659..7dc77555 100644
--- a/tests/helpers/templates/wheel/standard_default_build_script_force_include.py
+++ b/tests/helpers/templates/wheel/standard_default_build_script_force_include.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_extra_metadata.py b/tests/helpers/templates/wheel/standard_default_extra_metadata.py
index e0a916b5..bfdef1b8 100644
--- a/tests/helpers/templates/wheel/standard_default_extra_metadata.py
+++ b/tests/helpers/templates/wheel/standard_default_extra_metadata.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_license_multiple.py b/tests/helpers/templates/wheel/standard_default_license_multiple.py
index f1492652..d8af4ab8 100644
--- a/tests/helpers/templates/wheel/standard_default_license_multiple.py
+++ b/tests/helpers/templates/wheel/standard_default_license_multiple.py
@@ -17,10 +17,10 @@ def get_files(**kwargs):
         if first_part == 'LICENSES':
             files.append(File(Path(metadata_directory, 'licenses', 'LICENSES', f.path.parts[1]), f.contents))
 
-        if first_part != kwargs['package_name']:
+        if f.path.parts[0] != 'src':
             continue
 
-        files.append(f)
+        files.append(File(Path(*f.path.parts[1:]), f.contents))
 
     files.append(
         File(
diff --git a/tests/helpers/templates/wheel/standard_default_license_single.py b/tests/helpers/templates/wheel/standard_default_license_single.py
index 57ca2c9d..95975897 100644
--- a/tests/helpers/templates/wheel/standard_default_license_single.py
+++ b/tests/helpers/templates/wheel/standard_default_license_single.py
@@ -15,10 +15,10 @@ def get_files(**kwargs):
         if str(f.path) == 'LICENSE.txt':
             files.append(File(Path(metadata_directory, 'licenses', f.path), f.contents))
 
-        if f.path.parts[0] != kwargs['package_name']:
+        if f.path.parts[0] != 'src':
             continue
 
-        files.append(f)
+        files.append(File(Path(*f.path.parts[1:]), f.contents))
 
     files.append(
         File(
diff --git a/tests/helpers/templates/wheel/standard_default_namespace_package.py b/tests/helpers/templates/wheel/standard_default_namespace_package.py
index 1af4887a..8f731760 100644
--- a/tests/helpers/templates/wheel/standard_default_namespace_package.py
+++ b/tests/helpers/templates/wheel/standard_default_namespace_package.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_python_constraint.py b/tests/helpers/templates/wheel/standard_default_python_constraint.py
index a3437cbb..013ceecc 100644
--- a/tests/helpers/templates/wheel/standard_default_python_constraint.py
+++ b/tests/helpers/templates/wheel/standard_default_python_constraint.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_shared_data.py b/tests/helpers/templates/wheel/standard_default_shared_data.py
index 8639c0f8..c3f324af 100644
--- a/tests/helpers/templates/wheel/standard_default_shared_data.py
+++ b/tests/helpers/templates/wheel/standard_default_shared_data.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_single_module.py b/tests/helpers/templates/wheel/standard_default_single_module.py
index 9c69d62c..7cd7e65c 100644
--- a/tests/helpers/templates/wheel/standard_default_single_module.py
+++ b/tests/helpers/templates/wheel/standard_default_single_module.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_default_symlink.py b/tests/helpers/templates/wheel/standard_default_symlink.py
index 3d615cf5..311d8a22 100644
--- a/tests/helpers/templates/wheel/standard_default_symlink.py
+++ b/tests/helpers/templates/wheel/standard_default_symlink.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_editable_exact.py b/tests/helpers/templates/wheel/standard_editable_exact.py
index 7c817e45..bb4be693 100644
--- a/tests/helpers/templates/wheel/standard_editable_exact.py
+++ b/tests/helpers/templates/wheel/standard_editable_exact.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_editable_exact_extra_dependencies.py b/tests/helpers/templates/wheel/standard_editable_exact_extra_dependencies.py
index 5b7ce287..89ab9c35 100644
--- a/tests/helpers/templates/wheel/standard_editable_exact_extra_dependencies.py
+++ b/tests/helpers/templates/wheel/standard_editable_exact_extra_dependencies.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_editable_exact_force_include.py b/tests/helpers/templates/wheel/standard_editable_exact_force_include.py
index 0154cbb6..afb8fdfb 100644
--- a/tests/helpers/templates/wheel/standard_editable_exact_force_include.py
+++ b/tests/helpers/templates/wheel/standard_editable_exact_force_include.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_entry_points.py b/tests/helpers/templates/wheel/standard_entry_points.py
index 3c2b7a11..dded899f 100644
--- a/tests/helpers/templates/wheel/standard_entry_points.py
+++ b/tests/helpers/templates/wheel/standard_entry_points.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_no_strict_naming.py b/tests/helpers/templates/wheel/standard_no_strict_naming.py
index 57ca2c9d..38de1c75 100644
--- a/tests/helpers/templates/wheel/standard_no_strict_naming.py
+++ b/tests/helpers/templates/wheel/standard_no_strict_naming.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_only_packages_artifact_override.py b/tests/helpers/templates/wheel/standard_only_packages_artifact_override.py
index c8e2ff48..7413266a 100644
--- a/tests/helpers/templates/wheel/standard_only_packages_artifact_override.py
+++ b/tests/helpers/templates/wheel/standard_only_packages_artifact_override.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents
 
 
diff --git a/tests/helpers/templates/wheel/standard_tests.py b/tests/helpers/templates/wheel/standard_tests.py
index 28e2dcbe..64b35b6d 100644
--- a/tests/helpers/templates/wheel/standard_tests.py
+++ b/tests/helpers/templates/wheel/standard_tests.py
@@ -3,7 +3,7 @@ from hatch.utils.fs import Path
 from hatchling.__about__ import __version__
 from hatchling.metadata.spec import DEFAULT_METADATA_VERSION
 
-from ..new.default import get_files as get_template_files
+from ..new.feature_no_src_layout import get_files as get_template_files
 from .utils import update_record_file_contents