diff --git a/.gitignore b/.gitignore
index 0c80b3c18d020e95e9a9056d5406eb0a2d139741..30adfd9d9cf8ce7b36ea4383e1789fb17e68c3d5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,5 @@
 src/subroutines/git.info
 src/subroutines/git.last-commit-hash
 
-/tests
 /missing_dbnomics
 /utils
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 5707f8b121445dc52e347079092357e5768df1db..efd1de9a3d71cdd65595da32e7d99b3707e23b7f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,17 +1,15 @@
 OCTAVE ?= octave-cli
 MATLAB ?= $(shell which matlab)
 
-all: check-octave check-matlab
-
 m-unit-tests/src/mtest.m:
 	git clone https://git.dynare.org/Dynare/m-unit-tests
 
 check-octave: m-unit-tests/src/mtest.m
-	@cd src/subroutines;\
-	$(OCTAVE) --no-init-file --silent --no-history --eval "addpath([pwd() '/../../m-unit-tests/src']); runalltests" && [ ! -f ./failed ] && [ -f ./pass ]
+	@cd tests ;\
+	$(OCTAVE) --no-init-file --silent --no-history --eval "addpath([pwd() '/../m-unit-tests/src']); runalltests" && [ ! -f ./failed ] && [ -f ./pass ]
 
 check-matlab: m-unit-tests/src/mtest.m
-	@$(MATLAB)  -nosplash -nodisplay -r "addpath([pwd '/m-unit-tests/src']); cd src/subroutines; runalltests; quit" && [ ! -f ./tests/failed ] && [ -f ./tests/pass ]
+	@$(MATLAB)  -nosplash -nodisplay -r "addpath([pwd '/m-unit-tests/src']); cd tests; runalltests; quit" && [ ! -f ./tests/failed ] && [ -f ./tests/pass ]
 
 check-clean:
 	rm -f tests/*_test_*.m tests/*.csv tests/*.xls tests/*.xlsx tests/*.mat tests/failed tests/datafile_for_test
diff --git a/archive/template.m b/archive/template.m
index 99d05398a233a40a978a5f8116759a0f0c5799be..51cdb180fad4951c60cf6b556bbbe60d08c71fcd 100644
--- a/archive/template.m
+++ b/archive/template.m
@@ -1,5 +1,5 @@
 % fetch series by provider code and dataset code
-df = fetch_series('provider_code', 'AMECO', 'dataset_code', 'UVGD', 'max_nb_series', 500);
+test = fetch_series('provider_code', 'AMECO', 'dataset_code', 'UVGD', 'max_nb_series', 500);
 ds = to_dseries(df);
 
 % fetch one series by ID
diff --git a/src/subroutines/fetch_series.m b/src/fetch_series.m
similarity index 100%
rename from src/subroutines/fetch_series.m
rename to src/fetch_series.m
diff --git a/src/subroutines/fetch_series_by_api_link.m b/src/fetch_series_by_api_link.m
similarity index 99%
rename from src/subroutines/fetch_series_by_api_link.m
rename to src/fetch_series_by_api_link.m
index dd438fccf450f395a7208e7a0a604c1b32331ce0..1092c459a4de87bb5b115181d8b49f855817123a 100644
--- a/src/subroutines/fetch_series_by_api_link.m
+++ b/src/fetch_series_by_api_link.m
@@ -166,7 +166,7 @@ else
             end
         end
         series_length=series_length+length(flat_series.value);
-    end
+    end    
 end
 end
 
diff --git a/src/initialize_mdbnomics.m b/src/initialize_mdbnomics.m
index fcf56ea6b7ca714f1c6ec2fb50a210158d59d914..34ef0277e844046c72b3da43a1d2b1cdc67f9d31 100644
--- a/src/initialize_mdbnomics.m
+++ b/src/initialize_mdbnomics.m
@@ -21,10 +21,10 @@ function initialize_mdbnomics()
 mdbnomics_src_root = strrep(which('initialize_mdbnomics'), 'initialize_mdbnomics.m', '');
 
 % Set the subfolders to be added in the path.
-p = {'subroutines'};
+p = {'utils'};
 
 % Add missing routines if dynare is not in the path
-if ~exist('contains','builtin')
+if ~exist('OCTAVE_VERSION', 'builtin') || ~exist('contains','builtin')
     p{end+1} = 'missing/contains';
 end
 
diff --git a/src/subroutines/fetch_series_page.m b/src/utils/fetch_series_page.m
similarity index 100%
rename from src/subroutines/fetch_series_page.m
rename to src/utils/fetch_series_page.m
diff --git a/src/subroutines/filter_series.m b/src/utils/filter_series.m
similarity index 100%
rename from src/subroutines/filter_series.m
rename to src/utils/filter_series.m
diff --git a/src/subroutines/flatten_dbnomics_series.m b/src/utils/flatten_dbnomics_series.m
similarity index 100%
rename from src/subroutines/flatten_dbnomics_series.m
rename to src/utils/flatten_dbnomics_series.m
diff --git a/src/subroutines/flatten_editor_series.m b/src/utils/flatten_editor_series.m
similarity index 100%
rename from src/subroutines/flatten_editor_series.m
rename to src/utils/flatten_editor_series.m
diff --git a/src/subroutines/iter_filtered_series.m b/src/utils/iter_filtered_series.m
similarity index 100%
rename from src/subroutines/iter_filtered_series.m
rename to src/utils/iter_filtered_series.m
diff --git a/src/subroutines/iter_series_info.m b/src/utils/iter_series_info.m
similarity index 100%
rename from src/subroutines/iter_series_info.m
rename to src/utils/iter_series_info.m
diff --git a/src/subroutines/normalize_period.m b/src/utils/normalize_period.m
similarity index 100%
rename from src/subroutines/normalize_period.m
rename to src/utils/normalize_period.m
diff --git a/src/subroutines/normalize_value.m b/src/utils/normalize_value.m
similarity index 100%
rename from src/subroutines/normalize_value.m
rename to src/utils/normalize_value.m
diff --git a/src/subroutines/runalltests.m b/tests/runalltests.m
similarity index 85%
rename from src/subroutines/runalltests.m
rename to tests/runalltests.m
index b4e639f2ad04809981576856fdf203e562ff0c58..c23d3c305dc6db395ddbd13d2dacee01360a0db7 100644
--- a/src/subroutines/runalltests.m
+++ b/tests/runalltests.m
@@ -14,6 +14,7 @@ function runalltests()
 %
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+mdbnomics_src_root = []; % Will be updated by calling initialize_dseries_class().
 
 opath = path();
 
@@ -34,7 +35,7 @@ unit_tests_root = strrep(which('runalltests'),'runalltests.m','');
 try
     initialize_mdbnomics();
 catch
-    addpath([unit_tests_root '../']);
+    addpath([unit_tests_root '../src']);
     initialize_mdbnomics();
 end
 
@@ -47,7 +48,7 @@ if isoctave()
     more off;
 end
 
-r = run_unitary_tests_in_directory(unit_tests_root(1:end-1));
+r = run_unitary_tests_in_directory(mdbnomics_src_root(1:end-1));
 
 delete('*.log');