diff --git a/Dockerfile b/Dockerfile
index 1626f97606471a9c2f51639aed209148e200f64c..a2d25e004c9f0622881c84d06aef3cdedd595f94 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -123,12 +123,12 @@ COPY --from=build /install/docs/.build /app/docs/.build
 COPY --from=build /usr/local/bin/nomad /usr/bin/nomad
 # copy the gui
 RUN mkdir -p /app/gui
-COPY --from=gui_build /app/build /app/nomad/app_fastapi/flask/static/gui
+COPY --from=gui_build /app/build /app/nomad/app/flask/static/gui
 # copy the encyclopedia gui production code
-COPY --from=gui_build /encyclopedia /app/nomad/app_fastapi/flask/static/encyclopedia
+COPY --from=gui_build /encyclopedia /app/nomad/app/flask/static/encyclopedia
 # remove the developer config on the gui, will be generated by run.sh from nomad.yaml
-RUN rm -f /app/nomad/app_fastapi/flask/static/gui/env.js
-RUN rm -f /app/nomad/app_fastapi/flask/static/encyclopedia/conf.js
+RUN rm -f /app/nomad/app/flask/static/gui/env.js
+RUN rm -f /app/nomad/app/flask/static/encyclopedia/conf.js
 # build the python package dist
 RUN python setup.py compile
 RUN python setup.py sdist
diff --git a/docs/api_reference.rst b/docs/api_reference.rst
index 2bedb7f251c1a4d221a2a61840be8af2bcd25a19..20f5043679e6eb1d6915de0b3c204abfc7fb98fd 100644
--- a/docs/api_reference.rst
+++ b/docs/api_reference.rst
@@ -11,7 +11,7 @@ consult our *swagger* dashboards:
 Summary
 -------
 
-.. qrefflask:: nomad.app_fastapi.flask:app
+.. qrefflask:: nomad.app.flask:app
   :undoc-static:
 
 
@@ -19,5 +19,5 @@ Summary
 API(s) Details
 --------------
 
-.. autoflask:: nomad.app_fastapi.flask:app
+.. autoflask:: nomad.app.flask:app
   :undoc-static:
diff --git a/nomad/app_fastapi/__init__.py b/nomad/app/__init__.py
similarity index 100%
rename from nomad/app_fastapi/__init__.py
rename to nomad/app/__init__.py
diff --git a/nomad/app_fastapi/flask/.gitignore b/nomad/app/flask/.gitignore
similarity index 100%
rename from nomad/app_fastapi/flask/.gitignore
rename to nomad/app/flask/.gitignore
diff --git a/nomad/app_fastapi/flask/__init__.py b/nomad/app/flask/__init__.py
similarity index 100%
rename from nomad/app_fastapi/flask/__init__.py
rename to nomad/app/flask/__init__.py
diff --git a/nomad/app_fastapi/flask/__main__.py b/nomad/app/flask/__main__.py
similarity index 100%
rename from nomad/app_fastapi/flask/__main__.py
rename to nomad/app/flask/__main__.py
diff --git a/nomad/app_fastapi/flask/api/__init__.py b/nomad/app/flask/api/__init__.py
similarity index 78%
rename from nomad/app_fastapi/flask/api/__init__.py
rename to nomad/app/flask/api/__init__.py
index 37766017d21ff6b971d9207f3736588ac76c4c63..3782d7be92b0fb232a22c91a7127bd5ca2bf392f 100644
--- a/nomad/app_fastapi/flask/api/__init__.py
+++ b/nomad/app/flask/api/__init__.py
@@ -21,11 +21,11 @@ The official NOMAD API.
 
 There is a separate documentation for the API endpoints from a client perspective.
 
-.. automodule:: nomad.app_fastapi.flask.api.api
-.. automodule:: nomad.app_fastapi.flask.api.auth
-.. automodule:: nomad.app_fastapi.flask.api.upload
-.. automodule:: nomad.app_fastapi.flask.api.repo
-.. automodule:: nomad.app_fastapi.flask.api.archive
+.. automodule:: nomad.app.flask.api.api
+.. automodule:: nomad.app.flask.api.auth
+.. automodule:: nomad.app.flask.api.upload
+.. automodule:: nomad.app.flask.api.repo
+.. automodule:: nomad.app.flask.api.archive
 '''
 
 from .api import api, blueprint
diff --git a/nomad/app_fastapi/flask/api/api.py b/nomad/app/flask/api/api.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/api.py
rename to nomad/app/flask/api/api.py
diff --git a/nomad/app_fastapi/flask/api/archive.py b/nomad/app/flask/api/archive.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/archive.py
rename to nomad/app/flask/api/archive.py
diff --git a/nomad/app_fastapi/flask/api/auth.py b/nomad/app/flask/api/auth.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/auth.py
rename to nomad/app/flask/api/auth.py
diff --git a/nomad/app_fastapi/flask/api/common.py b/nomad/app/flask/api/common.py
similarity index 99%
rename from nomad/app_fastapi/flask/api/common.py
rename to nomad/app/flask/api/common.py
index 10bb8b5023a911822cf31e013e3bac79547f1349..31815fa21cd636aad4706e5f22171bf24bd40d4d 100644
--- a/nomad/app_fastapi/flask/api/common.py
+++ b/nomad/app/flask/api/common.py
@@ -35,7 +35,7 @@ import gzip
 from functools import wraps
 
 from nomad import search, config, datamodel, utils
-from nomad.app_fastapi.optimade import filterparser
+from nomad.app.optimade import filterparser
 from nomad.files import Restricted
 
 from ..common import RFC3339DateTime, rfc3339DateTime
diff --git a/nomad/app_fastapi/flask/api/dataset.py b/nomad/app/flask/api/dataset.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/dataset.py
rename to nomad/app/flask/api/dataset.py
diff --git a/nomad/app_fastapi/flask/api/encyclopedia.py b/nomad/app/flask/api/encyclopedia.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/encyclopedia.py
rename to nomad/app/flask/api/encyclopedia.py
diff --git a/nomad/app_fastapi/flask/api/encyclopedia_grammar.lark b/nomad/app/flask/api/encyclopedia_grammar.lark
similarity index 100%
rename from nomad/app_fastapi/flask/api/encyclopedia_grammar.lark
rename to nomad/app/flask/api/encyclopedia_grammar.lark
diff --git a/nomad/app_fastapi/flask/api/info.py b/nomad/app/flask/api/info.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/info.py
rename to nomad/app/flask/api/info.py
diff --git a/nomad/app_fastapi/flask/api/materialtransformer.py b/nomad/app/flask/api/materialtransformer.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/materialtransformer.py
rename to nomad/app/flask/api/materialtransformer.py
diff --git a/nomad/app_fastapi/flask/api/metainfo.py b/nomad/app/flask/api/metainfo.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/metainfo.py
rename to nomad/app/flask/api/metainfo.py
diff --git a/nomad/app_fastapi/flask/api/mirror.py b/nomad/app/flask/api/mirror.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/mirror.py
rename to nomad/app/flask/api/mirror.py
diff --git a/nomad/app_fastapi/flask/api/raw.py b/nomad/app/flask/api/raw.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/raw.py
rename to nomad/app/flask/api/raw.py
diff --git a/nomad/app_fastapi/flask/api/repo.py b/nomad/app/flask/api/repo.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/repo.py
rename to nomad/app/flask/api/repo.py
diff --git a/nomad/app_fastapi/flask/api/upload.py b/nomad/app/flask/api/upload.py
similarity index 100%
rename from nomad/app_fastapi/flask/api/upload.py
rename to nomad/app/flask/api/upload.py
diff --git a/nomad/app_fastapi/flask/common.py b/nomad/app/flask/common.py
similarity index 100%
rename from nomad/app_fastapi/flask/common.py
rename to nomad/app/flask/common.py
diff --git a/nomad/app_fastapi/flask/dcat/__init__.py b/nomad/app/flask/dcat/__init__.py
similarity index 100%
rename from nomad/app_fastapi/flask/dcat/__init__.py
rename to nomad/app/flask/dcat/__init__.py
diff --git a/nomad/app_fastapi/flask/dcat/api.py b/nomad/app/flask/dcat/api.py
similarity index 100%
rename from nomad/app_fastapi/flask/dcat/api.py
rename to nomad/app/flask/dcat/api.py
diff --git a/nomad/app_fastapi/flask/dcat/catalog.py b/nomad/app/flask/dcat/catalog.py
similarity index 100%
rename from nomad/app_fastapi/flask/dcat/catalog.py
rename to nomad/app/flask/dcat/catalog.py
diff --git a/nomad/app_fastapi/flask/dcat/datasets.py b/nomad/app/flask/dcat/datasets.py
similarity index 100%
rename from nomad/app_fastapi/flask/dcat/datasets.py
rename to nomad/app/flask/dcat/datasets.py
diff --git a/nomad/app_fastapi/flask/dcat/mapping.py b/nomad/app/flask/dcat/mapping.py
similarity index 100%
rename from nomad/app_fastapi/flask/dcat/mapping.py
rename to nomad/app/flask/dcat/mapping.py
diff --git a/nomad/app_fastapi/flask/dist.py b/nomad/app/flask/dist.py
similarity index 100%
rename from nomad/app_fastapi/flask/dist.py
rename to nomad/app/flask/dist.py
diff --git a/nomad/app_fastapi/flask/docs.py b/nomad/app/flask/docs.py
similarity index 100%
rename from nomad/app_fastapi/flask/docs.py
rename to nomad/app/flask/docs.py
diff --git a/nomad/app_fastapi/flask/encyclopedia.py b/nomad/app/flask/encyclopedia.py
similarity index 100%
rename from nomad/app_fastapi/flask/encyclopedia.py
rename to nomad/app/flask/encyclopedia.py
diff --git a/nomad/app_fastapi/flask/gui.py b/nomad/app/flask/gui.py
similarity index 100%
rename from nomad/app_fastapi/flask/gui.py
rename to nomad/app/flask/gui.py
diff --git a/nomad/app_fastapi/main.py b/nomad/app/main.py
similarity index 100%
rename from nomad/app_fastapi/main.py
rename to nomad/app/main.py
diff --git a/nomad/app_fastapi/models.py b/nomad/app/models.py
similarity index 99%
rename from nomad/app_fastapi/models.py
rename to nomad/app/models.py
index 694f1d1a874fa1fa9fe3dc9320e347f479d7af44..f7dc7c31ac69ba97b2abc5297b50845d1daaf727 100644
--- a/nomad/app_fastapi/models.py
+++ b/nomad/app/models.py
@@ -29,7 +29,7 @@ import fnmatch
 from nomad import datamodel  # pylint: disable=unused-import
 from nomad.utils import strip
 from nomad.metainfo import Datetime, MEnum
-from nomad.app_fastapi.utils import parameter_dependency_from_model
+from nomad.app.utils import parameter_dependency_from_model
 from nomad.metainfo.search_extension import metrics, search_quantities
 
 
diff --git a/nomad/app_fastapi/optimade/__init__.py b/nomad/app/optimade/__init__.py
similarity index 98%
rename from nomad/app_fastapi/optimade/__init__.py
rename to nomad/app/optimade/__init__.py
index ec1d289f1510d224ec61792d8593d99fe1523442..b98541bb9b634ac457eb948f406b166add012e35 100644
--- a/nomad/app_fastapi/optimade/__init__.py
+++ b/nomad/app/optimade/__init__.py
@@ -7,7 +7,7 @@ import importlib
 os.environ['OPTIMADE_CONFIG_FILE'] = os.path.join(os.path.dirname(__file__), 'optimade_config.json')
 
 # patch optimade logger (patched module most be outside this module to force import before optimade)
-sys.modules['optimade.server.logger'] = importlib.import_module('nomad.app_fastapi.optimade_logger')
+sys.modules['optimade.server.logger'] = importlib.import_module('nomad.app.optimade_logger')
 
 # patch optimade base path
 from nomad import config, utils  # nopep8
diff --git a/nomad/app_fastapi/optimade/elasticsearch.py b/nomad/app/optimade/elasticsearch.py
similarity index 100%
rename from nomad/app_fastapi/optimade/elasticsearch.py
rename to nomad/app/optimade/elasticsearch.py
diff --git a/nomad/app_fastapi/optimade/filterparser.py b/nomad/app/optimade/filterparser.py
similarity index 100%
rename from nomad/app_fastapi/optimade/filterparser.py
rename to nomad/app/optimade/filterparser.py
diff --git a/nomad/app_fastapi/optimade/optimade_config.json b/nomad/app/optimade/optimade_config.json
similarity index 100%
rename from nomad/app_fastapi/optimade/optimade_config.json
rename to nomad/app/optimade/optimade_config.json
diff --git a/nomad/app_fastapi/optimade_logger.py b/nomad/app/optimade_logger.py
similarity index 100%
rename from nomad/app_fastapi/optimade_logger.py
rename to nomad/app/optimade_logger.py
diff --git a/nomad/app_fastapi/routers/__init__.py b/nomad/app/routers/__init__.py
similarity index 100%
rename from nomad/app_fastapi/routers/__init__.py
rename to nomad/app/routers/__init__.py
diff --git a/nomad/app_fastapi/routers/auth.py b/nomad/app/routers/auth.py
similarity index 97%
rename from nomad/app_fastapi/routers/auth.py
rename to nomad/app/routers/auth.py
index e2801c312caaff3f85424a9fda8fed652e948989..0a7bcb78092311ba8c93c1fb463ae68d23733b60 100644
--- a/nomad/app_fastapi/routers/auth.py
+++ b/nomad/app/routers/auth.py
@@ -22,8 +22,8 @@ from pydantic import BaseModel
 
 from nomad import infrastructure
 from nomad.utils import get_logger, strip
-from nomad.app_fastapi.models import User, HTTPExceptionModel
-from nomad.app_fastapi.utils import create_responses
+from nomad.app.models import User, HTTPExceptionModel
+from nomad.app.utils import create_responses
 
 logger = get_logger(__name__)
 
diff --git a/nomad/app_fastapi/routers/datasets.py b/nomad/app/routers/datasets.py
similarity index 98%
rename from nomad/app_fastapi/routers/datasets.py
rename to nomad/app/routers/datasets.py
index ed091e6c7c343a8b5e6b4dff681e5a22a29cb007..c5099530db4336b344505eb8e32e45c674fc33e5 100644
--- a/nomad/app_fastapi/routers/datasets.py
+++ b/nomad/app/routers/datasets.py
@@ -27,9 +27,9 @@ from nomad.utils import strip, create_uuid
 from nomad.datamodel import Dataset as DatasetDefinitionCls
 from nomad.doi import DOI
 
-from nomad.app_fastapi.routers.auth import get_required_user
-from nomad.app_fastapi.utils import create_responses
-from nomad.app_fastapi.models import (
+from nomad.app.routers.auth import get_required_user
+from nomad.app.utils import create_responses
+from nomad.app.models import (
     pagination_parameters, Pagination, PaginationResponse, Query,
     HTTPExceptionModel, User, Direction, Owner)
 
diff --git a/nomad/app_fastapi/routers/entries.py b/nomad/app/routers/entries.py
similarity index 99%
rename from nomad/app_fastapi/routers/entries.py
rename to nomad/app/routers/entries.py
index 4548e574ac5c5534df965ae5a078a8bb107ad89d..c871461a57e34a368a7b5fe5abe772c9b327d030 100644
--- a/nomad/app_fastapi/routers/entries.py
+++ b/nomad/app/routers/entries.py
@@ -29,9 +29,9 @@ from nomad.utils import strip
 from nomad.archive import (
     query_archive, ArchiveQueryError, compute_required_with_referenced,
     read_partial_archives_from_mongo, filter_archive)
-from nomad.app_fastapi.utils import create_streamed_zipfile, File, create_responses
-from nomad.app_fastapi.routers.auth import get_optional_user
-from nomad.app_fastapi.models import (
+from nomad.app.utils import create_streamed_zipfile, File, create_responses
+from nomad.app.routers.auth import get_optional_user
+from nomad.app.models import (
     Pagination, WithQuery, MetadataRequired, EntriesMetadataResponse, EntriesMetadata,
     EntryMetadataResponse, query_parameters, metadata_required_parameters, Files, Query,
     pagination_parameters, files_parameters, User, Owner, HTTPExceptionModel, EntriesRaw,
diff --git a/nomad/app_fastapi/routers/users.py b/nomad/app/routers/users.py
similarity index 88%
rename from nomad/app_fastapi/routers/users.py
rename to nomad/app/routers/users.py
index b6d54b2fe07061fa1d787714f9246b06a004a8bb..cce273ebed4b1cc443a8b0d41987a542032c37ae 100644
--- a/nomad/app_fastapi/routers/users.py
+++ b/nomad/app/routers/users.py
@@ -18,9 +18,9 @@
 
 from fastapi import Depends, APIRouter, status
 
-from nomad.app_fastapi.routers.auth import get_required_user
-from nomad.app_fastapi.models import User, HTTPExceptionModel
-from nomad.app_fastapi.utils import create_responses
+from nomad.app.routers.auth import get_required_user
+from nomad.app.models import User, HTTPExceptionModel
+from nomad.app.utils import create_responses
 from nomad.utils import strip
 
 router = APIRouter()
diff --git a/nomad/app_fastapi/utils.py b/nomad/app/utils.py
similarity index 100%
rename from nomad/app_fastapi/utils.py
rename to nomad/app/utils.py
diff --git a/nomad/cli/admin/migrate.py b/nomad/cli/admin/migrate.py
index 894fbb95a59cc444ca4c63d0b77a44bc34844fd5..641c1833c70f692ed3a4b37a6686a53d4b6f5918 100644
--- a/nomad/cli/admin/migrate.py
+++ b/nomad/cli/admin/migrate.py
@@ -27,7 +27,7 @@ def migrate(mongo_db: str):
     import pymongo
     import sys
     from nomad import config, processing as proc, doi as nomad_doi, datamodel, infrastructure
-    from nomad.app_fastapi.flask.api.mirror import _upload_data
+    from nomad.app.flask.api.mirror import _upload_data
     from nomad.cli.client.mirror import v0Dot7, fix_time, _Dataset
     from bson.json_util import dumps
 
diff --git a/nomad/cli/admin/run.py b/nomad/cli/admin/run.py
index 76e08c0ed33746692942aa8da338174f0228afa4..499a1bd6afaeee4c93a9009465867ceeadb2a16a 100644
--- a/nomad/cli/admin/run.py
+++ b/nomad/cli/admin/run.py
@@ -47,7 +47,7 @@ def run_app(**kwargs):
     from uvicorn import Server, Config
 
     uv_config = Config(
-        'nomad.app_fastapi.main:app', host='127.0.0.1',
+        'nomad.app.main:app', host='127.0.0.1',
         port=config.services.api_port, log_level='info')
     server = Server(config=uv_config)
     server.run()
diff --git a/nomad/metainfo/flask_extension.py b/nomad/metainfo/flask_extension.py
index 9747ba7e5d39c8d720c3f7b78323270d456bf9ea..7c312216bc842b65655f453c686a784a207de93c 100644
--- a/nomad/metainfo/flask_extension.py
+++ b/nomad/metainfo/flask_extension.py
@@ -18,7 +18,7 @@
 
 from flask_restplus import fields
 
-from nomad.app_fastapi.flask.common import RFC3339DateTime
+from nomad.app.flask.common import RFC3339DateTime
 
 from .metainfo import Section, Quantity, Datetime, Capitalized, MEnum
 
diff --git a/nomad/processing/base.py b/nomad/processing/base.py
index 2a687fa606bed7eccda85edc1585c97ed1737061..8c2423ddd4afb56e38722ca0414ecc16b1efee80 100644
--- a/nomad/processing/base.py
+++ b/nomad/processing/base.py
@@ -528,7 +528,7 @@ def unwarp_task(task, cls_name, self_id, *args, **kwargs):
         try:
             self = cls.get(self_id)
         except KeyError as e:
-            from nomad.app_fastapi import flask
+            from nomad.app import flask
             if flask.app.config['TESTING']:
                 # This only happens in tests, where it is not always avoidable that
                 # tasks from old test-cases bleed over.
diff --git a/nomad/search.py b/nomad/search.py
index c9ed8334ccd06c119a7009f5473b67752d2eaa76..7ee0780eb84646092fcaf9956fbce03b39cf4d85 100644
--- a/nomad/search.py
+++ b/nomad/search.py
@@ -31,8 +31,8 @@ from nomad.datamodel.material import Material
 from nomad import config, datamodel, infrastructure, utils
 from nomad.metainfo.search_extension import (  # pylint: disable=unused-import
     search_quantities, metrics, order_default_quantities, groups)
-from nomad.app_fastapi import models as api_models
-from nomad.app_fastapi.models import (
+from nomad.app import models as api_models
+from nomad.app.models import (
     Pagination, PaginationResponse, Query, MetadataRequired, SearchResponse, Aggregation,
     Statistic, StatisticResponse, AggregationOrderType, AggregationResponse, AggregationDataItem)
 
diff --git a/run.sh b/run.sh
index fd69c688f67d4b15d0d9e41cc4a195634cae26f9..508d4730affb3453f79eee037748751a53cb65f0 100644
--- a/run.sh
+++ b/run.sh
@@ -3,4 +3,4 @@ python -m nomad.cli admin ops gui-config
 params=()
 [ -e gunicorn.conf ] && params+=(--config gunicorn.conf)
 [ -e gunicorn.log.conf ] && params+=(--log-config gunicorn.log.conf)
-python -m gunicorn.app.wsgiapp "${params[@]}" --worker-class=uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 nomad.app_fastapi.main:app
+python -m gunicorn.app.wsgiapp "${params[@]}" --worker-class=uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 nomad.app.main:app
diff --git a/tests/app_fastapi/__init__.py b/tests/app/__init__.py
similarity index 100%
rename from tests/app_fastapi/__init__.py
rename to tests/app/__init__.py
diff --git a/tests/app_fastapi/conftest.py b/tests/app/conftest.py
similarity index 99%
rename from tests/app_fastapi/conftest.py
rename to tests/app/conftest.py
index 131214ee419d09817e8c351ea9c54b2d029f60cb..e6547afaaf646f6fa855c8d0968d4010521abcef 100644
--- a/tests/app_fastapi/conftest.py
+++ b/tests/app/conftest.py
@@ -23,7 +23,7 @@ from datetime import datetime
 
 from nomad import infrastructure, config
 from nomad.archive import write_partial_archive_to_mongo
-from nomad.app_fastapi.main import app
+from nomad.app.main import app
 from nomad.datamodel import EntryArchive, EntryMetadata, DFTMetadata, User
 
 
diff --git a/tests/app_fastapi/flask/__init__.py b/tests/app/flask/__init__.py
similarity index 100%
rename from tests/app_fastapi/flask/__init__.py
rename to tests/app/flask/__init__.py
diff --git a/tests/app_fastapi/flask/bravado.py b/tests/app/flask/bravado.py
similarity index 100%
rename from tests/app_fastapi/flask/bravado.py
rename to tests/app/flask/bravado.py
diff --git a/tests/app_fastapi/flask/conftest.py b/tests/app/flask/conftest.py
similarity index 97%
rename from tests/app_fastapi/flask/conftest.py
rename to tests/app/flask/conftest.py
index 129b051552aa952455bbd97063e3657434248e63..bb978efd19aa5f6518c5184c97cffbe31bde8d1e 100644
--- a/tests/app_fastapi/flask/conftest.py
+++ b/tests/app/flask/conftest.py
@@ -19,7 +19,7 @@
 import pytest
 from bravado.client import SwaggerClient
 
-from nomad.app_fastapi.flask import app as flask_app
+from nomad.app.flask import app as flask_app
 
 from .bravado import FlaskTestHttpClient
 from ..conftest import admin_user_auth, test_user_auth  # pylint: disable=unused-import
diff --git a/tests/app_fastapi/flask/resource.py b/tests/app/flask/resource.py
similarity index 95%
rename from tests/app_fastapi/flask/resource.py
rename to tests/app/flask/resource.py
index acc3d11d6bfb441cb651085fd0e5670104f32fee..f25d7b406c0c806effe73da27eb19c88acb00c8d 100644
--- a/tests/app_fastapi/flask/resource.py
+++ b/tests/app/flask/resource.py
@@ -23,7 +23,7 @@ error handling, etc.
 
 from flask_restplus import Resource
 
-from nomad.app_fastapi.flask.api.api import api
+from nomad.app.flask.api.api import api
 
 
 ns = api.namespace('test', description='Only used for tests.')
diff --git a/tests/app_fastapi/flask/test_api.py b/tests/app/flask/test_api.py
similarity index 99%
rename from tests/app_fastapi/flask/test_api.py
rename to tests/app/flask/test_api.py
index 429eee27238512f14f2c43601952edd89ffe3964..4ba0b65fcd8f13b8aba6ac0c955e6522fdc0a88c 100644
--- a/tests/app_fastapi/flask/test_api.py
+++ b/tests/app/flask/test_api.py
@@ -30,8 +30,8 @@ import base64
 import itertools
 from hashlib import md5
 
-from nomad.app_fastapi.flask.common import rfc3339DateTime
-from nomad.app_fastapi.flask.api.auth import generate_upload_token
+from nomad.app.flask.common import rfc3339DateTime
+from nomad.app.flask.api.auth import generate_upload_token
 from nomad import search, files, config, utils, infrastructure
 from nomad.metainfo import search_extension
 from nomad.files import UploadFiles, PublicUploadFiles
diff --git a/tests/app_fastapi/flask/test_api_encyclopedia.py b/tests/app/flask/test_api_encyclopedia.py
similarity index 99%
rename from tests/app_fastapi/flask/test_api_encyclopedia.py
rename to tests/app/flask/test_api_encyclopedia.py
index 623d2a8e4c5d72bc97c6e6d6c871972ed98f1a48..f2d2c3204c7388e29e3d71cd71ab640c290d7fd5 100644
--- a/tests/app_fastapi/flask/test_api_encyclopedia.py
+++ b/tests/app/flask/test_api_encyclopedia.py
@@ -25,7 +25,7 @@ from nomad import config
 from nomad.cli import cli
 from nomad import processing as proc, infrastructure
 
-from tests.app_fastapi.flask.test_app import BlueprintClient
+from tests.app.flask.test_app import BlueprintClient
 
 silicon_id = "fh3UBjhUVm4nxzeRd2JJuqw5oXYa"
 
diff --git a/tests/app_fastapi/flask/test_app.py b/tests/app/flask/test_app.py
similarity index 100%
rename from tests/app_fastapi/flask/test_app.py
rename to tests/app/flask/test_app.py
diff --git a/tests/app_fastapi/flask/test_bravado.py b/tests/app/flask/test_bravado.py
similarity index 100%
rename from tests/app_fastapi/flask/test_bravado.py
rename to tests/app/flask/test_bravado.py
diff --git a/tests/app_fastapi/flask/test_dcat.py b/tests/app/flask/test_dcat.py
similarity index 95%
rename from tests/app_fastapi/flask/test_dcat.py
rename to tests/app/flask/test_dcat.py
index 91733a8f01da22627675d737c1055eeaa6234df4..3233c0c1213a90537c42b6bd84f04fde36725e37 100644
--- a/tests/app_fastapi/flask/test_dcat.py
+++ b/tests/app/flask/test_dcat.py
@@ -21,10 +21,10 @@ from datetime import datetime
 
 from nomad import infrastructure, config
 from nomad.datamodel import EntryMetadata
-from nomad.app_fastapi.flask.dcat.mapping import Mapping
+from nomad.app.flask.dcat.mapping import Mapping
 
 from tests.conftest import clear_elastic
-from tests.app_fastapi.flask.test_app import BlueprintClient
+from tests.app.flask.test_app import BlueprintClient
 
 
 @pytest.fixture(scope='session')
diff --git a/tests/app_fastapi/flask/utils.py b/tests/app/flask/utils.py
similarity index 100%
rename from tests/app_fastapi/flask/utils.py
rename to tests/app/flask/utils.py
diff --git a/tests/app_fastapi/routers/__init__.py b/tests/app/routers/__init__.py
similarity index 100%
rename from tests/app_fastapi/routers/__init__.py
rename to tests/app/routers/__init__.py
diff --git a/tests/app_fastapi/routers/common.py b/tests/app/routers/common.py
similarity index 100%
rename from tests/app_fastapi/routers/common.py
rename to tests/app/routers/common.py
diff --git a/tests/app_fastapi/routers/test_auth.py b/tests/app/routers/test_auth.py
similarity index 100%
rename from tests/app_fastapi/routers/test_auth.py
rename to tests/app/routers/test_auth.py
diff --git a/tests/app_fastapi/routers/test_datasets.py b/tests/app/routers/test_datasets.py
similarity index 100%
rename from tests/app_fastapi/routers/test_datasets.py
rename to tests/app/routers/test_datasets.py
diff --git a/tests/app_fastapi/routers/test_entries.py b/tests/app/routers/test_entries.py
similarity index 99%
rename from tests/app_fastapi/routers/test_entries.py
rename to tests/app/routers/test_entries.py
index a540fc83200b7a057f488d08105ba87b22d1bcfe..492abc68a143927dcad894e25bf42f69eb3315c8 100644
--- a/tests/app_fastapi/routers/test_entries.py
+++ b/tests/app/routers/test_entries.py
@@ -23,12 +23,12 @@ import io
 import json
 
 from nomad.metainfo.search_extension import search_quantities
-from nomad.app_fastapi.models import AggregateableQuantity, Metric
+from nomad.app.models import AggregateableQuantity, Metric
 
 from tests.utils import assert_at_least
 
 from .common import assert_response
-from tests.app_fastapi.conftest import example_data as data  # pylint: disable=unused-import
+from tests.app.conftest import example_data as data  # pylint: disable=unused-import
 
 '''
 These are the tests for all API operations below ``entries``. The tests are organized
diff --git a/tests/app_fastapi/routers/test_users.py b/tests/app/routers/test_users.py
similarity index 100%
rename from tests/app_fastapi/routers/test_users.py
rename to tests/app/routers/test_users.py
diff --git a/tests/app_fastapi/test_optimade.py b/tests/app/test_optimade.py
similarity index 98%
rename from tests/app_fastapi/test_optimade.py
rename to tests/app/test_optimade.py
index d339f3e4b0237a36f290098d8ee26020c89959a1..77eea728dfb62afe1a3e204f1d35a9f3cad9e1e7 100644
--- a/tests/app_fastapi/test_optimade.py
+++ b/tests/app/test_optimade.py
@@ -21,7 +21,7 @@ import pytest
 
 from nomad.processing import Upload
 from nomad import search
-from nomad.app_fastapi.optimade import parse_filter
+from nomad.app.optimade import parse_filter
 
 from tests.conftest import clear_elastic, clear_raw_files
 
@@ -37,7 +37,7 @@ def test_get_entry(published: Upload):
 
 
 def test_no_optimade(mongo, elastic, raw_files, client):
-    from tests.app_fastapi.flask.utils import Upload
+    from tests.app.flask.utils import Upload
     upload = Upload()
     upload.create_test_structure(1, 2, 1, [], 0)
     upload.create_test_structure(2, 2, 1, [], 0, optimade=False)
@@ -55,7 +55,7 @@ def example_structures(elastic_infra, mongo_infra, raw_files_infra):
     clear_elastic(elastic_infra)
     mongo_infra.drop_database('test_db')
 
-    from tests.app_fastapi.flask.utils import Upload
+    from tests.app.flask.utils import Upload
     upload = Upload()
     upload.create_test_structure(1, 2, 1, [], 0)
     upload.create_test_structure(2, 2, 1, ['C'], 0)
diff --git a/tests/app_fastapi/test_utils.py b/tests/app/test_utils.py
similarity index 96%
rename from tests/app_fastapi/test_utils.py
rename to tests/app/test_utils.py
index 901c850181995eb7981bed7e928eb2842671150d..59c6c69020c9f7bad76258c9854c1fc20757780f 100644
--- a/tests/app_fastapi/test_utils.py
+++ b/tests/app/test_utils.py
@@ -22,7 +22,7 @@ import zipfile
 
 from nomad import config
 from nomad.datamodel import EntryArchive, EntryMetadata
-from nomad.app_fastapi.utils import create_streamed_zipfile, File
+from nomad.app.utils import create_streamed_zipfile, File
 
 from tests.conftest import clear_raw_files
 from tests.test_files import create_test_upload_files
diff --git a/tests/normalizing/test_system.py b/tests/normalizing/test_system.py
index a1137c480bc37d129db73a49527d69f5233cef7a..464f7c6e00a158a0bce5a09869fc3e99310959fa 100644
--- a/tests/normalizing/test_system.py
+++ b/tests/normalizing/test_system.py
@@ -20,7 +20,7 @@ import ase.build
 
 from nomad import datamodel, config
 from nomad.datamodel import EntryArchive
-from nomad.app_fastapi.flask import dump_json
+from nomad.app.flask import dump_json
 from nomad.datamodel.metainfo.public import section_springer_material as SpringerMaterial
 
 from tests.parsing.test_parsing import parsed_vasp_example  # pylint: disable=unused-import
diff --git a/tests/parsing/test_parsing.py b/tests/parsing/test_parsing.py
index daf243a8869e2c930fdff36c675252eb724b2237..d40fe3d4d55d35c26909e8893248570ee13483cf 100644
--- a/tests/parsing/test_parsing.py
+++ b/tests/parsing/test_parsing.py
@@ -27,7 +27,7 @@ from nomad import utils, files, datamodel
 from nomad.datamodel import EntryArchive, EntryMetadata
 from nomad.parsing import BrokenParser, Backend
 from nomad.parsing.parsers import parser_dict, match_parser
-from nomad.app_fastapi.flask import dump_json
+from nomad.app.flask import dump_json
 
 parser_examples = [
     ('parsers/random', 'test/data/parsers/random_0'),
diff --git a/tests/processing/test_data.py b/tests/processing/test_data.py
index cded6111c1342386eed82d23874ac18c03088e39..7dae894bd05861d2b818f632938a7b2d3c4c113d 100644
--- a/tests/processing/test_data.py
+++ b/tests/processing/test_data.py
@@ -31,8 +31,8 @@ from nomad.processing.base import task as task_decorator, FAILURE, SUCCESS
 
 from tests.test_search import assert_search_upload
 from tests.test_files import assert_upload_files
-from tests.app_fastapi.flask.conftest import client, oasis_central_nomad_client, session_client  # pylint: disable=unused-import
-from tests.app_fastapi.conftest import other_test_user_auth, test_user_auth  # pylint: disable=unused-import
+from tests.app.flask.conftest import client, oasis_central_nomad_client, session_client  # pylint: disable=unused-import
+from tests.app.conftest import other_test_user_auth, test_user_auth  # pylint: disable=unused-import
 
 
 def test_send_mail(mails, monkeypatch):
diff --git a/tests/test_cli.py b/tests/test_cli.py
index 2d7bf8947d24e202e213afa9f46805d3a1f77365..cd06a8c22b474299e321f0c161fab0670de61833 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -28,10 +28,10 @@ from nomad.cli import cli
 from nomad.cli.cli import POPO
 from nomad.processing import Upload, Calc
 
-from tests.app_fastapi.flask.test_app import BlueprintClient
-from tests.app_fastapi.flask.conftest import (  # pylint: disable=unused-import
+from tests.app.flask.test_app import BlueprintClient
+from tests.app.flask.conftest import (  # pylint: disable=unused-import
     test_user_bravado_client, client, session_client, admin_user_bravado_client)  # pylint: disable=unused-import
-from tests.app_fastapi.conftest import test_user_auth, admin_user_auth  # pylint: disable=unused-import
+from tests.app.conftest import test_user_auth, admin_user_auth  # pylint: disable=unused-import
 
 # TODO there is much more to test
 
diff --git a/tests/test_client.py b/tests/test_client.py
index 67c8fca6e902806ffe9772b102904e096f9a7b58..b221dcee87ccb9ba959193db1d6ea38dc861c38d 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -23,9 +23,9 @@ from nomad.metainfo import MSection, SubSection
 from nomad.datamodel import EntryArchive, User
 from nomad.datamodel.metainfo.public import section_run
 
-from tests.app_fastapi.flask.conftest import client, session_client  # pylint: disable=unused-import
-from tests.app_fastapi.conftest import other_test_user_auth, test_user_auth  # pylint: disable=unused-import
-from tests.app_fastapi.flask.test_app import BlueprintClient
+from tests.app.flask.conftest import client, session_client  # pylint: disable=unused-import
+from tests.app.conftest import other_test_user_auth, test_user_auth  # pylint: disable=unused-import
+from tests.app.flask.test_app import BlueprintClient
 from tests.processing import test_data as test_processing
 
 
diff --git a/tests/test_search.py b/tests/test_search.py
index 6a7a9e87c976c248d304dbcbad9753eec1535c51..42be98d2499c7ade763b153b366ecff3c7ba9efb 100644
--- a/tests/test_search.py
+++ b/tests/test_search.py
@@ -25,7 +25,7 @@ import json
 from nomad import datamodel, processing, infrastructure, config
 from nomad.metainfo import search_extension
 from nomad.search import entry_document, SearchRequest, search, flat
-from nomad.app_fastapi.models import WithQuery
+from nomad.app.models import WithQuery
 
 
 def test_init_mapping(elastic):