diff --git a/sklearn/cluster/setup.py b/sklearn/cluster/setup.py
index 281d0dfbc4991dea75f183a09e552b11533732f1..672983c7aa9ed5a681d3578f6a459ae8f1b44953 100644
--- a/sklearn/cluster/setup.py
+++ b/sklearn/cluster/setup.py
@@ -45,6 +45,8 @@ def configuration(parent_package='', top_path=None):
         **blas_info
     )
 
+    config.add_subpackage('tests')
+
     return config
 
 if __name__ == '__main__':
diff --git a/sklearn/cross_decomposition/tests/__init__.py b/sklearn/cross_decomposition/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/sklearn/datasets/setup.py b/sklearn/datasets/setup.py
index 5fea622758a958bca70a4253678fabb74198b39b..78327e8b3ffa0b3f728fa96fec4244c40400ec03 100644
--- a/sklearn/datasets/setup.py
+++ b/sklearn/datasets/setup.py
@@ -13,7 +13,7 @@ def configuration(parent_package='', top_path=None):
     config.add_extension('_svmlight_format',
                          sources=['_svmlight_format.c'],
                          include_dirs=[numpy.get_include()])
-
+    config.add_subpackage('tests')
     return config
 
 
diff --git a/sklearn/feature_extraction/setup.py b/sklearn/feature_extraction/setup.py
index de7ec380cdecefab34d2dc6239fc84188f131950..075cac470bf7a68d499aa9639b712c1ed2922b47 100644
--- a/sklearn/feature_extraction/setup.py
+++ b/sklearn/feature_extraction/setup.py
@@ -14,5 +14,6 @@ def configuration(parent_package='', top_path=None):
                          sources=['_hashing.c'],
                          include_dirs=[numpy.get_include()],
                          libraries=libraries)
+    config.add_subpackage("tests")
 
     return config
diff --git a/sklearn/manifold/setup.py b/sklearn/manifold/setup.py
index 18dee2d53774277d861e6c36e768f46957d6b430..d1b6ebf9e0adc2cbcf631388a08998e4ee393b06 100644
--- a/sklearn/manifold/setup.py
+++ b/sklearn/manifold/setup.py
@@ -27,6 +27,8 @@ def configuration(parent_package="", top_path=None):
                                        blas_info.pop('include_dirs', [])],
                          extra_compile_args=eca, **blas_info)
 
+    config.add_subpackage('tests')
+
     return config
 
 if __name__ == "__main__":
diff --git a/sklearn/manifold/tests/__init__.py b/sklearn/manifold/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/sklearn/metrics/setup.py b/sklearn/metrics/setup.py
index f5a6ce27f2ce6a4e3123bf117fb333d51f6b85ad..949c3efcb0f15234f74b31daa399c427cd144468 100644
--- a/sklearn/metrics/setup.py
+++ b/sklearn/metrics/setup.py
@@ -23,6 +23,8 @@ def configuration(parent_package="", top_path=None):
                          extra_compile_args=blas_info.pop('extra_compile_args',
                                                           []),
                          **blas_info)
+    config.add_subpackage('tests')
+    config.add_subpackage('cluster')
 
     return config
 
diff --git a/sklearn/model_selection/tests/__init__.py b/sklearn/model_selection/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/sklearn/neighbors/setup.py b/sklearn/neighbors/setup.py
index 2ddfb8cf3455100ff38cda28fe32662cd358fa09..575b4fce66eedbae3222062ae6b067ea0986e5cb 100644
--- a/sklearn/neighbors/setup.py
+++ b/sklearn/neighbors/setup.py
@@ -32,4 +32,6 @@ def configuration(parent_package='', top_path=None):
                          include_dirs=[numpy.get_include()],
                          libraries=libraries)
 
+    config.add_subpackage('tests')
+
     return config
diff --git a/sklearn/neural_network/tests/__init__.py b/sklearn/neural_network/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/sklearn/setup.py b/sklearn/setup.py
index 63c0b7546a99042c8dc2ebc96fe5a59b6508ccaf..3a87444e91579b396791dde49bbf8150b02bc8cb 100644
--- a/sklearn/setup.py
+++ b/sklearn/setup.py
@@ -14,45 +14,44 @@ def configuration(parent_package='', top_path=None):
 
     config = Configuration('sklearn', parent_package, top_path)
 
+    # submodules with build utilities
     config.add_subpackage('__check_build')
     config.add_subpackage('_build_utils')
-    config.add_subpackage('svm')
-    config.add_subpackage('datasets')
-    config.add_subpackage('datasets/tests')
-    config.add_subpackage('feature_extraction')
-    config.add_subpackage('feature_extraction/tests')
-    config.add_subpackage('cluster')
-    config.add_subpackage('cluster/tests')
+
+    # submodules which do not have their own setup.py
+    # we must manually add sub-submodules & tests
     config.add_subpackage('covariance')
     config.add_subpackage('covariance/tests')
     config.add_subpackage('cross_decomposition')
-    config.add_subpackage('decomposition')
-    config.add_subpackage('decomposition/tests')
-    config.add_subpackage("ensemble")
-    config.add_subpackage("ensemble/tests")
+    config.add_subpackage('cross_decomposition/tests')
     config.add_subpackage('feature_selection')
     config.add_subpackage('feature_selection/tests')
-    config.add_subpackage('utils')
-    config.add_subpackage('utils/tests')
-    config.add_subpackage('externals')
-    config.add_subpackage('mixture')
-    config.add_subpackage('mixture/tests')
     config.add_subpackage('gaussian_process')
     config.add_subpackage('gaussian_process/tests')
-    config.add_subpackage('neighbors')
+    config.add_subpackage('mixture')
+    config.add_subpackage('mixture/tests')
+    config.add_subpackage('model_selection')
+    config.add_subpackage('model_selection/tests')
     config.add_subpackage('neural_network')
+    config.add_subpackage('neural_network/tests')
     config.add_subpackage('preprocessing')
     config.add_subpackage('preprocessing/tests')
+    config.add_subpackage('semi_supervised')
+    config.add_subpackage('semi_supervised/tests')
+
+    # submodules which have their own setup.py
+    # leave out "linear_model" and "utils" for now; add them after cblas below
+    config.add_subpackage('cluster')
+    config.add_subpackage('datasets')
+    config.add_subpackage('decomposition')
+    config.add_subpackage('ensemble')
+    config.add_subpackage('externals')
+    config.add_subpackage('feature_extraction')
     config.add_subpackage('manifold')
     config.add_subpackage('metrics')
-    config.add_subpackage('semi_supervised')
-    config.add_subpackage("tree")
-    config.add_subpackage("tree/tests")
-    config.add_subpackage('metrics/tests')
-    config.add_subpackage('metrics/cluster')
-    config.add_subpackage('metrics/cluster/tests')
-    config.add_subpackage('model_selection')
-    config.add_subpackage('model_selection/tests')
+    config.add_subpackage('neighbors')
+    config.add_subpackage('tree')
+    config.add_subpackage('svm')
 
     # add cython extension module for isotonic regression
     config.add_extension(
diff --git a/sklearn/utils/setup.py b/sklearn/utils/setup.py
index ac321e7d7aa5d796b35b2f57d5651446e2077683..ad1e3bef814d0ab3a79ab0ce9dcdd42cb446ca43 100644
--- a/sklearn/utils/setup.py
+++ b/sklearn/utils/setup.py
@@ -74,6 +74,8 @@ def configuration(parent_package='', top_path=None):
                          include_dirs=[numpy.get_include()],
                          libraries=libraries)
 
+    config.add_subpackage('tests')
+
     return config