Repository: matchms/matchms
Pull request #781 (2025-03-25 10:16:50)

Added a few reference spectra
As per issue #778, I am adding a handful of reference spectra I am using for tests myself. These are:

* Aspirin
* Cocaine
* Glucose
* Hydroxy-cholesterol
* Phenylalanine
* Salicin

I may add a few more in the future.


Patch:
diff --git a/.github/workflows/CI_generate_dev_requirements.yml b/.github/workflows/CI_generate_dev_requirements.yml
deleted file mode 100644
index 95651eb8..00000000
--- a/.github/workflows/CI_generate_dev_requirements.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: CI Generate Dev Requirements
-
-on:
-  push:
-    branches:
-      - master
-    paths:
-      - pyproject.toml
-  workflow_dispatch:
-    inputs:
-      tag:
-        description: Tag for manually running CI first code check workflow
-        required: False
-        default: ''
-
-jobs:
-  generate-requirements:
-    runs-on: ubuntu-latest
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Set up Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: '3.11'
-
-      - name: Build package and create dev environment
-        run: |
-          python -m pip install --upgrade pip poetry
-          poetry self add poetry-plugin-export
-          poetry install
-
-      - name: Export dev dependencies to dev-requirements.txt
-        run: |
-          poetry export --with dev -f requirements.txt -o dev-requirements.txt --without-hashes
-
-      - name: Commit and push dev-requirements.txt
-        run: |
-          git config user.name "github-actions[bot]"
-          git config user.email "github-actions[bot]@users.noreply.github.com"
-          git add dev-requirements.txt
-          git commit -m "Update dev-requirements.txt"
-          git push
diff --git a/README.rst b/README.rst
index 01d1b8aa..c80ab76b 100644
--- a/README.rst
+++ b/README.rst
@@ -165,11 +165,11 @@ Ecosystem compatibility
      - ms2query Status
    * - .. image:: https://img.shields.io/badge/numpy-1.25-lightgrey?logo=numpy :alt: numpy
      - .. image:: https://img.shields.io/badge/spec2vec-0.8.0-red
-     - .. image:: https://img.shields.io/badge/ms2deepscore-2.5.1-green
+     - .. image:: https://img.shields.io/badge/ms2deepscore-2.4.0-green
      - .. image:: https://img.shields.io/badge/ms2query-1.5.3-red
    * - .. image:: https://img.shields.io/badge/numpy-2.1-lightgrey?logo=numpy :alt: numpy
      - .. image:: https://img.shields.io/badge/spec2vec-0.8.0-red
-     - .. image:: https://img.shields.io/badge/ms2deepscore-2.5.1-green
+     - .. image:: https://img.shields.io/badge/ms2deepscore-2.4.0-green
      - .. image:: https://img.shields.io/badge/ms2query-1.5.3-red
 
 .. compatibility matrix end
@@ -320,14 +320,10 @@ To install matchms, do:
   cd matchms
   conda create --name matchms-dev python=3.11
   conda activate matchms-dev
-
-  # If you use poetry
-  python -m pip install --upgrade pip poetry
-  poetry install --with dev
-
-  # If you use pip
-  pip install -r dev-requirements.txt
-  pip install --editable .
+  # Install rdkit using conda, rest of dependencies can be installed with pip
+  conda install -c conda-forge rdkit
+  python -m pip install --upgrade pip
+  pip install --editable .[dev]  # if this won't work try "poetry install --with dev"
 
 Run the linter with:
 
diff --git a/dev-requirements.txt b/dev-requirements.txt
deleted file mode 100644
index d9ad0c8b..00000000
--- a/dev-requirements.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-annotated-types==0.7.0 ; python_version >= "3.10" and python_version < "3.13"
-anyio==4.9.0 ; python_version >= "3.10" and python_version < "3.13"
-astroid==2.15.8 ; python_version >= "3.10" and python_version < "3.13"
-backports-tarfile==1.2.0 ; python_version >= "3.10" and python_version <= "3.11"
-black==23.12.1 ; python_version >= "3.10" and python_version < "3.13"
-build==1.2.2.post1 ; python_version >= "3.10" and python_version < "3.13"
-cachecontrol==0.14.2 ; python_version >= "3.10" and python_version < "3.13"
-certifi==2025.1.31 ; python_version >= "3.10" and python_version < "3.13"
-cffi==1.17.1 ; python_version >= "3.10" and python_version < "3.13" and (sys_platform == "linux" or sys_platform == "darwin" or platform_python_implementation == "PyPy")
-charset-normalizer==3.4.1 ; python_version >= "3.10" and python_version < "3.13"
-cleo==2.1.0 ; python_version >= "3.10" and python_version < "3.13"
-click==8.1.8 ; python_version >= "3.10" and python_version < "3.13"
-colorama==0.4.6 ; python_version >= "3.10" and python_version < "3.13" and (sys_platform == "win32" or os_name == "nt" or platform_system == "Windows")
-contourpy==1.3.1 ; python_version >= "3.10" and python_version < "3.13"
-coverage==7.7.1 ; python_version >= "3.10" and python_version < "3.13"
-crashtest==0.4.1 ; python_version >= "3.10" and python_version < "3.13"
-cryptography==44.0.2 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "linux"
-cycler==0.12.1 ; python_version >= "3.10" and python_version < "3.13"
-decorator==5.2.1 ; python_version >= "3.10" and python_version < "3.13"
-deprecated==1.2.18 ; python_version >= "3.10" and python_version < "3.13"
-dill==0.3.9 ; python_version >= "3.10" and python_version < "3.13"
-distlib==0.3.9 ; python_version >= "3.10" and python_version < "3.13"
-docutils==0.18.1 ; python_version >= "3.10" and python_version < "3.13"
-dodgy==0.2.1 ; python_version >= "3.10" and python_version < "3.13"
-dulwich==0.22.8 ; python_version >= "3.10" and python_version < "3.13"
-exceptiongroup==1.2.2 ; python_version == "3.10"
-fastjsonschema==2.21.1 ; python_version >= "3.10" and python_version < "3.13"
-filelock==3.18.0 ; python_version >= "3.10" and python_version < "3.13"
-findpython==0.6.3 ; python_version >= "3.10" and python_version < "3.13"
-flake8-polyfill==1.0.2 ; python_version >= "3.10" and python_version < "3.13"
-flake8==6.1.0 ; python_version >= "3.10" and python_version < "3.13"
-fonttools==4.56.0 ; python_version >= "3.10" and python_version < "3.13"
-gitdb==4.0.12 ; python_version >= "3.10" and python_version < "3.13"
-gitpython==3.1.44 ; python_version >= "3.10" and python_version < "3.13"
-h11==0.14.0 ; python_version >= "3.10" and python_version < "3.13"
-httpcore==1.0.7 ; python_version >= "3.10" and python_version < "3.13"
-httpx==0.28.1 ; python_version >= "3.10" and python_version < "3.13"
-id==1.5.0 ; python_version >= "3.10" and python_version < "3.13"
-idna==3.10 ; python_version >= "3.10" and python_version < "3.13"
-importlib-metadata==8.6.1 ; python_version >= "3.10" and python_version < "3.13"
-iniconfig==2.1.0 ; python_version >= "3.10" and python_version < "3.13"
-installer==0.7.0 ; python_version >= "3.10" and python_version < "3.13"
-isort==5.13.2 ; python_version >= "3.10" and python_version < "3.13"
-jaraco-classes==3.4.0 ; python_version >= "3.10" and python_version < "3.13"
-jaraco-context==6.0.1 ; python_version >= "3.10" and python_version < "3.13"
-jaraco-functools==4.1.0 ; python_version >= "3.10" and python_version < "3.13"
-jeepney==0.9.0 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "linux"
-keyring==25.6.0 ; python_version >= "3.10" and python_version < "3.13"
-kiwisolver==1.4.8 ; python_version >= "3.10" and python_version < "3.13"
-lazy-object-proxy==1.10.0 ; python_version >= "3.10" and python_version < "3.13"
-llvmlite==0.43.0 ; python_version >= "3.10" and python_version < "3.13"
-lxml==4.9.4 ; python_version >= "3.10" and python_version < "3.13"
-markdown-it-py==3.0.0 ; python_version >= "3.10" and python_version < "3.13"
-matplotlib==3.10.1 ; python_version >= "3.10" and python_version < "3.13"
-mccabe==0.7.0 ; python_version >= "3.10" and python_version < "3.13"
-mdurl==0.1.2 ; python_version >= "3.10" and python_version < "3.13"
-more-itertools==10.6.0 ; python_version >= "3.10" and python_version < "3.13"
-msgpack==1.1.0 ; python_version >= "3.10" and python_version < "3.13"
-mypy-extensions==1.0.0 ; python_version >= "3.10" and python_version < "3.13"
-networkx==3.4.2 ; python_version >= "3.10" and python_version < "3.13"
-nh3==0.2.21 ; python_version >= "3.10" and python_version < "3.13"
-numba==0.60.0 ; python_version >= "3.10" and python_version < "3.13"
-numpy==2.0.2 ; python_version >= "3.10" and python_version < "3.13"
-packaging==24.2 ; python_version >= "3.10" and python_version < "3.13"
-pandas==2.2.3 ; python_version >= "3.10" and python_version < "3.13"
-pathspec==0.12.1 ; python_version >= "3.10" and python_version < "3.13"
-pbs-installer==2025.3.17 ; python_version >= "3.10" and python_version < "3.13"
-pep8-naming==0.10.0 ; python_version >= "3.10" and python_version < "3.13"
-pickydict==0.5.0 ; python_version >= "3.10" and python_version < "3.13"
-pillow==11.1.0 ; python_version >= "3.10" and python_version < "3.13"
-pkginfo==1.12.1.2 ; python_version >= "3.10" and python_version < "3.13"
-platformdirs==4.3.7 ; python_version >= "3.10" and python_version < "3.13"
-pluggy==1.5.0 ; python_version >= "3.10" and python_version < "3.13"
-poetry-bumpversion==0.3.3 ; python_version >= "3.10" and python_version < "3.13"
-poetry-core==2.1.1 ; python_version >= "3.10" and python_version < "3.13"
-poetry==2.1.1 ; python_version >= "3.10" and python_version < "3.13"
-prospector==1.11.0 ; python_version >= "3.10" and python_version < "3.13"
-pubchempy==1.0.4 ; python_version >= "3.10" and python_version < "3.13"
-pycodestyle==2.11.1 ; python_version >= "3.10" and python_version < "3.13"
-pycparser==2.22 ; python_version >= "3.10" and python_version < "3.13" and (sys_platform == "linux" or sys_platform == "darwin" or platform_python_implementation == "PyPy")
-pydantic-core==2.27.2 ; python_version >= "3.10" and python_version < "3.13"
-pydantic==2.10.6 ; python_version >= "3.10" and python_version < "3.13"
-pydocstyle==6.3.0 ; python_version >= "3.10" and python_version < "3.13"
-pyflakes==3.1.0 ; python_version >= "3.10" and python_version < "3.13"
-pygments==2.19.1 ; python_version >= "3.10" and python_version < "3.13"
-pylint-celery==0.3 ; python_version >= "3.10" and python_version < "3.13"
-pylint-django==2.5.3 ; python_version >= "3.10" and python_version < "3.13"
-pylint-flask==0.6 ; python_version >= "3.10" and python_version < "3.13"
-pylint-plugin-utils==0.7 ; python_version >= "3.10" and python_version < "3.13"
-pylint==2.17.7 ; python_version >= "3.10" and python_version < "3.13"
-pyparsing==3.2.3 ; python_version >= "3.10" and python_version < "3.13"
-pyproject-hooks==1.2.0 ; python_version >= "3.10" and python_version < "3.13"
-pyroma==4.2 ; python_version >= "3.10" and python_version < "3.13"
-pyteomics==4.7.5 ; python_version >= "3.10" and python_version < "3.13"
-pytest-cov==4.1.0 ; python_version >= "3.10" and python_version < "3.13"
-pytest==7.4.4 ; python_version >= "3.10" and python_version < "3.13"
-python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "3.13"
-pytz==2025.2 ; python_version >= "3.10" and python_version < "3.13"
-pywin32-ctypes==0.2.3 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "win32"
-pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "3.13"
-rapidfuzz==3.12.2 ; python_version >= "3.10" and python_version < "3.13"
-rdkit==2024.9.6 ; python_version >= "3.10" and python_version < "3.13"
-readme-renderer==43.0 ; python_version >= "3.10" and python_version < "3.13"
-requests-toolbelt==1.0.0 ; python_version >= "3.10" and python_version < "3.13"
-requests==2.32.3 ; python_version >= "3.10" and python_version < "3.13"
-requirements-detector==1.2.2 ; python_version >= "3.10" and python_version < "3.13"
-rfc3986==2.0.0 ; python_version >= "3.10" and python_version < "3.13"
-rich==13.9.4 ; python_version >= "3.10" and python_version < "3.13"
-scipy==1.15.2 ; python_version >= "3.10" and python_version < "3.13"
-secretstorage==3.3.3 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "linux"
-semver==3.0.4 ; python_version >= "3.10" and python_version < "3.13"
-setoptconf-tmp==0.3.1 ; python_version >= "3.10" and python_version < "3.13"
-setuptools==78.0.2 ; python_version >= "3.10" and python_version < "3.13"
-shellingham==1.5.4 ; python_version >= "3.10" and python_version < "3.13"
-six==1.17.0 ; python_version >= "3.10" and python_version < "3.13"
-smmap==5.0.2 ; python_version >= "3.10" and python_version < "3.13"
-sniffio==1.3.1 ; python_version >= "3.10" and python_version < "3.13"
-snowballstemmer==2.2.0 ; python_version >= "3.10" and python_version < "3.13"
-sparsestack==0.6.4 ; python_version >= "3.10" and python_version < "3.13"
-testfixtures==7.2.2 ; python_version >= "3.10" and python_version < "3.13"
-toml==0.10.2 ; python_version >= "3.10" and python_version < "3.13"
-tomli==2.2.1 ; python_version >= "3.10" and python_version < "3.13"
-tomlkit==0.13.2 ; python_version >= "3.10" and python_version < "3.13"
-tqdm==4.67.1 ; python_version >= "3.10" and python_version < "3.13"
-trove-classifiers==2025.3.19.19 ; python_version >= "3.10" and python_version < "3.13"
-twine==6.1.0 ; python_version >= "3.10" and python_version < "3.13"
-typing-extensions==4.12.2 ; python_version >= "3.10" and python_version < "3.13"
-tzdata==2025.2 ; python_version >= "3.10" and python_version < "3.13"
-urllib3==2.3.0 ; python_version >= "3.10" and python_version < "3.13"
-virtualenv==20.29.3 ; python_version >= "3.10" and python_version < "3.13"
-wrapt==1.17.2 ; python_version >= "3.10" and python_version < "3.13"
-xattr==1.1.4 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "darwin"
-yapf==0.40.2 ; python_version >= "3.10" and python_version < "3.13"
-zipp==3.21.0 ; python_version >= "3.10" and python_version < "3.13"
-zstandard==0.23.0 ; python_version >= "3.10" and python_version < "3.13"
diff --git a/matchms/exporting/__init__.py b/matchms/exporting/__init__.py
index 78d7f65c..982ad6dc 100644
--- a/matchms/exporting/__init__.py
+++ b/matchms/exporting/__init__.py
@@ -5,11 +5,15 @@ Functions for exporting mass spectral data
 Individual :meth:`~matchms.Spectrum`, or lists of :meth:`~matchms.Spectrum`
 can be exported to json, mgf, or msp files.
 """
-
 from .save_as_json import save_as_json
 from .save_as_mgf import save_as_mgf
 from .save_as_msp import save_as_msp
 from .save_spectra import save_spectra
 
 
-__all__ = ["save_as_json", "save_as_mgf", "save_as_msp", "save_spectra"]
+__all__ = [
+    "save_as_json",
+    "save_as_mgf",
+    "save_as_msp",
+    "save_spectra"
+]
diff --git a/matchms/exporting/metadata_export.py b/matchms/exporting/metadata_export.py
index 373eecc1..280c485c 100644
--- a/matchms/exporting/metadata_export.py
+++ b/matchms/exporting/metadata_export.py
@@ -10,9 +10,7 @@ from ..utils import filter_empty_spectra, rename_deprecated_params
 logger = logging.getLogger("matchms")
 
 
-def _get_metadata_dict(
-    spectrum: Spectrum, include_fields: Optional[List[str]] = None
-) -> Dict[str, Any]:
+def _get_metadata_dict(spectrum: Spectrum, include_fields: Optional[List[str]] = None) -> Dict[str, Any]:
     """Extract keys from spectrum metadata. Will silently continue if a key is not found.
 
     Args:
@@ -28,15 +26,13 @@ def _get_metadata_dict(
         logger.warning("'Include_fields' must be 'all' or list of keys.")
         return None
 
-    return {
-        key: spectrum.metadata[key] for key in spectrum.metadata.keys() & include_fields
-    }
+    return {key: spectrum.metadata[key] for key in spectrum.metadata.keys()
+            & include_fields}
 
 
 @rename_deprecated_params(param_mapping={"spectrums": "spectra"}, version="0.26.5")
-def export_metadata_as_json(
-    spectra: List[Spectrum], filename: str, include_fields: Optional[List[str]] = None
-):
+def export_metadata_as_json(spectra: List[Spectrum], filename: str,
+                            include_fields: Optional[List[str]] = None):
     """Export metadata to json file.
 
     Parameters
@@ -55,16 +51,13 @@ def export_metadata_as_json(
         if metadata_dict:
             metadata_dicts.append(metadata_dict)
 
-    with open(filename, "w", encoding="utf-8") as fout:
+    with open(filename, 'w', encoding="utf-8") as fout:
         json.dump(metadata_dicts, fout)
 
 
-def export_metadata_as_csv(
-    spectra: List[Spectrum],
-    filename: str,
-    include_fields: Optional[List[str]] = None,
-    delimiter: str = ",",
-):
+def export_metadata_as_csv(spectra: List[Spectrum], filename: str,
+                           include_fields: Optional[List[str]] = None,
+                           delimiter: str = ','):
     """Export metadata to csv file.
 
     Parameters
@@ -82,16 +75,14 @@ def export_metadata_as_csv(
     if include_fields is not None:
         metadata, columns = _subset_metadata(include_fields, metadata, columns)
 
-    with open(filename, "a+", encoding="utf-8") as csvfile:
+    with open(filename, 'a+', encoding="utf-8") as csvfile:
         writer = csv.writer(csvfile, delimiter=delimiter)
         writer.writerow(columns)
         for data in metadata:
             writer.writerow(data)
 
 
-def _subset_metadata(
-    include_fields: List[str], metadata: np.array, columns: Set[str]
-) -> Tuple[np.array, Set[str]]:
+def _subset_metadata(include_fields: List[str], metadata: np.array, columns: Set[str]) -> Tuple[np.array, Set[str]]:
     """Subset metadata to 'include_fields' and return intersection of columns.
 
     Parameters
diff --git a/matchms/exporting/save_as_json.py b/matchms/exporting/save_as_json.py
index 92ad588b..d8baf2ba 100644
--- a/matchms/exporting/save_as_json.py
+++ b/matchms/exporting/save_as_json.py
@@ -6,7 +6,9 @@ from ..utils import (filter_empty_spectra, fingerprint_export_warning,
 
 
 @rename_deprecated_params(param_mapping={"spectrums": "spectra"}, version="0.26.5")
-def save_as_json(spectra: List[Spectrum], filename: str, export_style: str = "matchms"):
+def save_as_json(spectra: List[Spectrum],
+                 filename: str,
+                 export_style: str = "matchms"):
     """Save spectrum(s) as json file.
 
     Example:
@@ -38,7 +40,7 @@ def save_as_json(spectra: List[Spectrum], filename: str, export_style: str = "ma
         Default is "matchms"
     """
     if not isinstance(spectra, list):
-        # Assume that input was a single Spectrum.
+        # Assume that input was single Spectrum
         spectra = [spectra]
 
     spectra = filter_empty_spectra(spectra)
@@ -59,5 +61,4 @@ def create_spectrum_json_encoder(export_style):
                 spec.pop("fingerprint", None)
                 return spec
             return super().default(o)
-
     return CustomSpectrumJSONEncoder
diff --git a/matchms/exporting/save_as_mgf.py b/matchms/exporting/save_as_mgf.py
index 6dd415c4..ca6eb327 100644
--- a/matchms/exporting/save_as_mgf.py
+++ b/matchms/exporting/save_as_mgf.py
@@ -1,4 +1,3 @@
-import logging
 from typing import List, Union
 import pyteomics.mgf as py_mgf
 from ..Spectrum import Spectrum
@@ -6,15 +5,10 @@ from ..utils import (filter_empty_spectra, fingerprint_export_warning,
                      rename_deprecated_params)
 
 
-logger = logging.getLogger("matchms")
-
-
 @rename_deprecated_params(param_mapping={"spectrums": "spectra"}, version="0.26.5")
 def save_as_mgf(spectra: Union[List[Spectrum], Spectrum],
                 filename: str,
-                export_style: str = "matchms",
-                file_mode: str = "a",
-                ) -> None:
+                export_style: str = "matchms"):
     """Save spectrum(s) as mgf file.
 
     Example:
@@ -44,12 +38,9 @@ def save_as_mgf(spectra: Union[List[Spectrum], Spectrum],
     export_style:
         Converts the keys to the required export style. One of ["matchms", "massbank", "nist", "riken", "gnps"].
         Default is "matchms"
-    file_mode: str
-        This is an optional parameter which defines the mode the file will be opened in.  
-        Default is "a" (append). The other option is "w" (write). If set worngly it will default to "a".
     """
     if not isinstance(spectra, list):
-        # Assume that input was a single Spectrum.
+        # Assume that input was single Spectrum
         spectra = [spectra]
 
     spectra = filter_empty_spectra(spectra)
@@ -58,14 +49,11 @@ def save_as_mgf(spectra: Union[List[Spectrum], Spectrum],
     def spectrum_dict_generator(matchms_spectra):
         """Generates dictionaries in the format expected by py_mgf"""
         for spectrum in matchms_spectra:
-            spectrum_dict = {
-                "m/z array": spectrum.peaks.mz,
-                "intensity array": spectrum.peaks.intensities,
-                "params": spectrum.metadata_dict(export_style),
-            }
-            if "fingerprint" in spectrum_dict["params"]:
+            spectrum_dict = {"m/z array": spectrum.peaks.mz,
+                             "intensity array": spectrum.peaks.intensities,
+                             "params": spectrum.metadata_dict(export_style)}
+            if 'fingerprint' in spectrum_dict["params"]:
                 del spectrum_dict["params"]["fingerprint"]
             yield spectrum_dict
-    if file_mode not in ["a", "w"]:
-        file_mode = "a"
-    py_mgf.write(spectrum_dict_generator(spectra), filename, file_mode=file_mode, encoding="utf-8")
\ No newline at end of file
+
+    py_mgf.write(spectrum_dict_generator(spectra), filename, file_mode="a", encoding="utf-8")
diff --git a/matchms/exporting/save_as_msp.py b/matchms/exporting/save_as_msp.py
index 2c1f5539..af58b4b5 100644
--- a/matchms/exporting/save_as_msp.py
+++ b/matchms/exporting/save_as_msp.py
@@ -8,17 +8,15 @@ from ..utils import (filter_empty_spectra, fingerprint_export_warning,
 
 
 logger = logging.getLogger("matchms")
-_extensions_not_allowed = ["mzml", "mzxml", "json", "mgf"]
+
+
+_extentions_not_allowed = ["mzml", "mzxml", "json", "mgf"]
 
 
 @rename_deprecated_params(param_mapping={"spectrums": "spectra"}, version="0.26.5")
-def save_as_msp(
-    spectra: List[Spectrum],
-    filename: str,
-    write_peak_comments: bool = True,
-    mode: str = "a",
-    style: str = "matchms",
-):
+def save_as_msp(spectra: List[Spectrum], filename: str,
+                write_peak_comments: bool = True,
+                mode: str = "a", style: str = "matchms"):
     """Save spectrum(s) as msp file.
 
     Example:
@@ -54,34 +52,26 @@ def save_as_msp(
         Converts the keys to required Export style. One of ["massbank", "nist", "riken", "gnps"].
         Default is "matchms"
     """
-    if not isinstance(spectra, list):
-        # Assume that input was a single Spectrum.
-        spectra = [spectra]
-
-    spectra = filter_empty_spectra(spectra)
-    fingerprint_export_warning(spectra)
-
     file_extension = filename.split(".")[-1]
-    assert (
-        file_extension.lower() not in _extensions_not_allowed
-    ), f"File extension '.{file_extension}' not allowed."
+    assert file_extension.lower() not in _extentions_not_allowed, \
+        f"File extension '.{file_extension}' not allowed."
     if not filename.endswith(".msp"):
-        logger.warning(
-            "Spectrum(s) will be stored as msp file with extension .%s",
-            filename.split(".")[-1],
-        )
+        logger.warning("Spectrum(s) will be stored as msp file with extension .%s",
+                       filename.split(".")[-1])
+    spectra = _ensure_list(spectra)
+    spectra = filter_empty_spectra(spectra)
+
+    fingerprint_export_warning(spectra)
 
     with open(filename, mode, encoding="utf-8") as outfile:
         for spectrum in spectra:
             _write_spectrum(spectrum, outfile, write_peak_comments, style)
 
 
-def _write_spectrum(
-    spectrum: Spectrum,
-    outfile: IO,
-    write_peak_comments: bool,
-    export_style: str = "matchms",
-):
+def _write_spectrum(spectrum: Spectrum,
+                    outfile: IO,
+                    write_peak_comments: bool,
+                    export_style: str = "matchms"):
     _write_metadata(spectrum.metadata_dict(export_style), outfile)
     if write_peak_comments is True:
         _write_peaks(spectrum.peaks, spectrum.peak_comments, outfile)
@@ -110,7 +100,7 @@ def _format_peak_comment(mz: Union[int, float], peak_comments: Dict):
     peak_comment = peak_comments.get(mz, None)
     if peak_comment is None:
         return ""
-    return f'\t"{peak_comment}"'
+    return f"\t\"{peak_comment}\""
 
 
 def _is_num_peaks(key: str) -> bool:
@@ -123,3 +113,10 @@ def _is_peak_comments(key: str) -> bool:
 
 def _is_fingerprint(key: str) -> bool:
     return key.lower().startswith("fingerprint")
+
+
+def _ensure_list(spectra) -> List[Spectrum]:
+    if not isinstance(spectra, list):
+        # Assume that input was single Spectrum
+        spectra = [spectra]
+    return spectra
diff --git a/matchms/exporting/save_spectra.py b/matchms/exporting/save_spectra.py
index 8c3c0c6e..67d6e183 100644
--- a/matchms/exporting/save_spectra.py
+++ b/matchms/exporting/save_spectra.py
@@ -11,57 +11,45 @@ logger = logging.getLogger("matchms")
 
 
 @rename_deprecated_params(param_mapping={"spectrums": "spectra"}, version="0.26.5")
-def save_spectra(
-    spectra: List[Spectrum],
-    file: str,
-    export_style: str = "matchms",
-    append: bool = False,
-) -> None:
+def save_spectra(spectra: List[Spectrum],
+                 file: str,
+                 export_style: str = "matchms",
+                 append: bool = False,
+                 ) -> None:
     """Saves spectra as the file type specified.
 
-    The following file extensions can be used: .json, .mgf, and .msp.
+    The following file extensions can be used:
+    "json", "mgf", "msp"
 
     Args:
     -----
     spectra:
         The spectra that are saved.
     file:
-        Path to file containing spectra, with file extension ".json", ".mgf", ".msp".
+        Path to file containing spectra, with file extension ".json", ".mgf", ".msp"
     export_style:
-        Converts the keys to the required export style.
-        One of ["matchms", "massbank", "nist", "riken", "gnps"]. Default is "matchms".
+        Converts the keys to the required export style. One of ["matchms", "massbank", "nist", "riken", "gnps"].
+        Default is "matchms"
     append:
-        Only supported for ".mgf", and ".msp" filetypes. If True, will try to append
-        to an existing file, instead of creating a new file. Default is `False`.
+        Only supported for ".mgf", and ".msp" filetypes. If True, will try to append to an existing file, instead of creating
+        a new file. Default is `False`.
     """
     if os.path.exists(file) and not append:
         raise FileExistsError(f"The specified file: {file} already exists.")
 
     ftype = os.path.splitext(file)[1].lower()[1:]
-    if append and ftype not in ("mgf", "msp"):
+    if append and ftype not in ('mgf', 'msp'):
         raise ValueError(f"{ftype} isn't supported for when `append` is True")
 
-    if not isinstance(spectra, list):
-        spectra = [spectra]
-
-    if len(spectra) == 0:
-        logger.warning("No spectra to save. File will be empty.")
-        with open(file, "w", encoding="utf-8"):
-            pass
-        return
-
     if ftype == "json":
         save_as_json(spectra, file, export_style)
     elif ftype == "mgf":
         save_as_mgf(spectra, file, export_style)
     elif ftype == "msp":
-        save_as_msp(spectra, file, style=export_style, mode="a")
+        save_as_msp(spectra, file, style=export_style, mode='a')
     elif ftype == "pickle":
         if export_style != "matchms":
-            logger.error(
-                "The only available export style for pickle is 'matchms', your export style %s",
-                export_style,
-            )
+            logger.error("The only available export style for pickle is 'matchms', your export style %s", export_style)
         save_as_pickled_file(spectra, file)
     else:
         raise TypeError(f"File extension of file: {file} is not recognized")
diff --git a/matchms/filtering/SpectrumProcessor.py b/matchms/filtering/SpectrumProcessor.py
index 27242f8b..5c9dac17 100644
--- a/matchms/filtering/SpectrumProcessor.py
+++ b/matchms/filtering/SpectrumProcessor.py
@@ -152,21 +152,8 @@ class SpectrumProcessor:
         """
         if processing_report is not None:
             processing_report.counter_number_processed += 1
-
-        clone = processing_report is not None
-
         for filter_func in self.filters:
-            method_params = inspect.signature(filter_func).parameters
-
-            if not filter_func.__name__.startswith("require_"):
-                if clone and "clone" not in method_params:
-                    logger.error(
-                        "Processing report is set to True, but the filter function %s does not support cloning.",
-                        filter_func.__name__)
-
-            # Ensures that filter function can be used, even if it does not support cloning
-            spectrum_out = filter_func(spectrum, **({"clone": clone} if "clone" in method_params else {}))
-
+            spectrum_out = filter_func(spectrum)
             if processing_report is not None:
                 processing_report.add_to_report(spectrum, spectrum_out, filter_func.__name__)
             if spectrum_out is None:
@@ -178,8 +165,7 @@ class SpectrumProcessor:
                 reason="This method is deprecated and will be removed in the future. Use 'process_spectra()' instead.")
     def process_spectrums(self, spectra: list,
                           progress_bar: bool = True,
-                          cleaned_spectra_file=None,
-                          create_report: Optional[bool] = False
+                          cleaned_spectra_file=None
                           ):
         """
         Wrapper method for process_spectra()
@@ -202,12 +188,11 @@ class SpectrumProcessor:
         processing_report
             A ProcessingReport containing the effect of the filters.
         """
-        return self.process_spectra(spectra, progress_bar, cleaned_spectra_file, create_report)
+        return self.process_spectra(spectra, progress_bar, cleaned_spectra_file)
 
     def process_spectra(self, spectra: list,
                           progress_bar: bool = True,
-                          cleaned_spectra_file=None,
-                          create_report: Optional[bool] = False
+                          cleaned_spectra_file=None
                           ):
         """
         Process a list of spectra with all filters in the processing pipeline.
@@ -235,23 +220,16 @@ class SpectrumProcessor:
                 raise FileExistsError("The specified save references file already exists")
             ftype = os.path.splitext(cleaned_spectra_file)[1].lower()[1:]
             incremental_save = ftype in ('mgf', 'msp')
-        else:
-            incremental_save = False
 
         if not self.filters:
             logger.warning("No filters have been specified, so spectra were not filtered")
-
-        processing_report = ProcessingReport(self.filters) if create_report else None
+        processing_report = ProcessingReport(self.filters)
 
         processed_spectra = []
         for s in tqdm(spectra, disable=(not progress_bar), desc="Processing spectra"):
             if s is None:
                 continue  # empty spectra will be discarded
-
-            # Clone spectrum once, if no ProcessingReport is created. ProcessingReport needs cloning in every filter.
-            spectrum = s.clone() if not create_report else s
-            processed_spectrum = self.process_spectrum(spectrum, processing_report)
-
+            processed_spectrum = self.process_spectrum(s, processing_report)
             if processed_spectrum is not None:
                 processed_spectra.append(processed_spectrum)
 
diff --git a/matchms/filtering/metadata_processing/add_compound_name.py b/matchms/filtering/metadata_processing/add_compound_name.py
index 08fc3969..e2868809 100644
--- a/matchms/filtering/metadata_processing/add_compound_name.py
+++ b/matchms/filtering/metadata_processing/add_compound_name.py
@@ -1,30 +1,16 @@
 import logging
-from typing import Optional
 from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def add_compound_name(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Add compound_name to correct field: "compound_name" in metadata.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added compound name, or `None` if not present.
-    """
+def add_compound_name(spectrum_in: SpectrumType) -> SpectrumType:
+    """Add compound_name to correct field: "compound_name" in metadata."""
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if spectrum.get("compound_name", None) is None:
         if isinstance(spectrum.get("name", None), str):
diff --git a/matchms/filtering/metadata_processing/add_fingerprint.py b/matchms/filtering/metadata_processing/add_fingerprint.py
index 0e6931d0..1469be4b 100644
--- a/matchms/filtering/metadata_processing/add_fingerprint.py
+++ b/matchms/filtering/metadata_processing/add_fingerprint.py
@@ -11,7 +11,7 @@ logger = logging.getLogger("matchms")
 
 
 def add_fingerprint(spectrum_in: Optional[SpectrumType], fingerprint_type: str = "daylight",
-                    nbits: int = 2048, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                    nbits: int = 2048) -> Optional[SpectrumType]:
     """Add molecular finterprint to spectrum.
 
     If smiles or inchi present in metadata, derive a molecular finterprint and
@@ -26,18 +26,11 @@ def add_fingerprint(spectrum_in: Optional[SpectrumType], fingerprint_type: str =
         are "daylight", "morgan1", "morgan2", "morgan3". Default is "daylight".
     nbits:
         Dimension or number of bits of generated fingerprint. Default is 2048.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added fingerprint derived from SMILES or INCHI, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     # First try to get fingerprint from smiles
     if spectrum.get("smiles", None):
diff --git a/matchms/filtering/metadata_processing/add_parent_mass.py b/matchms/filtering/metadata_processing/add_parent_mass.py
index 6b0d1f3f..6d160631 100644
--- a/matchms/filtering/metadata_processing/add_parent_mass.py
+++ b/matchms/filtering/metadata_processing/add_parent_mass.py
@@ -3,7 +3,6 @@ from typing import Optional
 from matchms.filtering.filter_utils.derive_precursor_mz_and_parent_mass import \
     derive_parent_mass_from_precursor_mz
 from matchms.Spectrum import Spectrum
-from matchms.typing import SpectrumType
 from ...utils import get_first_common_element
 from ..filter_utils.get_neutral_mass_from_smiles import \
     get_monoisotopic_neutral_mass
@@ -20,7 +19,7 @@ _accepted_missing_entries = ["", "N/A", "NA", "n/a"]
 
 def add_parent_mass(spectrum_in: Spectrum, estimate_from_adduct: bool = True,
                     overwrite_existing_entry: bool = False,
-                    estimate_from_charge: bool = True, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                    estimate_from_charge: bool = True) -> Optional[Spectrum]:
     """Add estimated parent mass to metadata (if not present yet).
 
     Method to calculate the parent mass from given precursor m/z together
@@ -32,29 +31,22 @@ def add_parent_mass(spectrum_in: Spectrum, estimate_from_adduct: bool = True,
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum_in
         Input spectrum.
-    estimate_from_adduct:
+    estimate_from_adduct
         When set to True, use adduct to estimate actual molecular mass ("parent mass").
         Default is True. Switches back to charge-based estimate if adduct does not match
         a known adduct.
-    overwrite_existing_entry:
+    overwrite_existing_entry
         Default is False. If set to True, a newly computed value will replace existing ones.
-    estimate_from_charge:
+    estimate_from_charge
         Default is True. If set to True, the charge will be used to estimate the parent mass.
         Adduct of the form [M+H]+, [M+H]2+, [M-H]- etc are assumed.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added parent mass, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     parent_mass = _get_parent_mass(spectrum.metadata)
     if parent_mass is not None and not overwrite_existing_entry:
diff --git a/matchms/filtering/metadata_processing/add_precursor_mz.py b/matchms/filtering/metadata_processing/add_precursor_mz.py
index 7be0ce6b..cc4e902f 100644
--- a/matchms/filtering/metadata_processing/add_precursor_mz.py
+++ b/matchms/filtering/metadata_processing/add_precursor_mz.py
@@ -1,6 +1,4 @@
 import logging
-from typing import Optional
-from matchms.typing import SpectrumType
 from matchms.utils import get_first_common_element
 
 
@@ -13,28 +11,16 @@ _accepted_types = (float, str, int)
 _accepted_missing_entries = ["", "N/A", "NA", "n/a"]
 
 
-def add_precursor_mz(spectrum_in, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def add_precursor_mz(spectrum_in):
     """Add precursor_mz to correct field and make it a float.
 
     For missing precursor_mz field: check if there is "pepmass"" entry instead.
     For string parsed as precursor_mz: convert to float.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added precursor mz metadata, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     metadata_updated = _add_precursor_mz_metadata(spectrum.metadata)
     spectrum.metadata = metadata_updated
diff --git a/matchms/filtering/metadata_processing/add_retention.py b/matchms/filtering/metadata_processing/add_retention.py
index a3257c76..e8feb218 100644
--- a/matchms/filtering/metadata_processing/add_retention.py
+++ b/matchms/filtering/metadata_processing/add_retention.py
@@ -98,17 +98,15 @@ def _add_retention(metadata: dict, target_key: str, accepted_keys: List[str]) ->
     return metadata
 
 
-def add_retention_time(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def add_retention_time(spectrum_in: SpectrumType) -> SpectrumType:
     """Add retention time information to the 'retention_time' key as float.
     Negative values and those not convertible to a float result in 'retention_time'
     being 'None'.
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum
         Spectrum with retention time information.
-    clone:
-        Optionally clone the Spectrum.
 
     Returns
     -------
@@ -117,23 +115,21 @@ def add_retention_time(spectrum_in: SpectrumType, clone: Optional[bool] = True)
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     target_key = "retention_time"
     spectrum.metadata = _add_retention(spectrum.metadata, target_key, _retention_time_keys)
     return spectrum
 
 
-def add_retention_index(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def add_retention_index(spectrum_in: SpectrumType) -> SpectrumType:
     """Add retention index into 'retention_index' key if present.
 
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum
         Spectrum with RI information.
-    clone:
-        Optionally clone the Spectrum.
     Returns
     -------
     Spectrum with RI info stored under 'retention_index'.
@@ -141,7 +137,7 @@ def add_retention_index(spectrum_in: SpectrumType, clone: Optional[bool] = True)
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     target_key = "retention_index"
     spectrum.metadata = _add_retention(spectrum.metadata, target_key, _retention_index_keys)
diff --git a/matchms/filtering/metadata_processing/clean_adduct.py b/matchms/filtering/metadata_processing/clean_adduct.py
index 9efb6809..3b7fa31a 100644
--- a/matchms/filtering/metadata_processing/clean_adduct.py
+++ b/matchms/filtering/metadata_processing/clean_adduct.py
@@ -1,39 +1,29 @@
 import logging
 import re
-from typing import Optional
 from matchms.filtering.filter_utils.interpret_unknown_adduct import \
     get_charge_of_adduct
 from matchms.filtering.filter_utils.load_known_adducts import \
     load_known_adduct_conversions
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def clean_adduct(spectrum_in, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def clean_adduct(spectrum_in):
     """Clean adduct and make it consistent in style.
     Will transform adduct strings of type 'M+H+' to '[M+H]+'.
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum_in
         Matchms Spectrum object.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with cleaned adduct, or `None` if not present.
     """
     if spectrum_in is None:
         return None
     adduct = spectrum_in.get("adduct")
     if adduct is None:
         return spectrum_in
-
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     cleaned_adduct = _clean_adduct(adduct, spectrum.get('charge'))
 
diff --git a/matchms/filtering/metadata_processing/clean_compound_name.py b/matchms/filtering/metadata_processing/clean_compound_name.py
index ffe523e0..ee314a3c 100644
--- a/matchms/filtering/metadata_processing/clean_compound_name.py
+++ b/matchms/filtering/metadata_processing/clean_compound_name.py
@@ -1,34 +1,21 @@
 import logging
 import re
-from typing import Optional
 from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def clean_compound_name(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def clean_compound_name(spectrum_in: SpectrumType) -> SpectrumType:
     """Clean compound name.
 
     A list of frequently seen name additions that do not belong to the compound
     name will be removed.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Matchms Spectrum object.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with cleaned compound name, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if spectrum.get("compound_name", None) is not None:
         name = spectrum.get("compound_name")
diff --git a/matchms/filtering/metadata_processing/correct_charge.py b/matchms/filtering/metadata_processing/correct_charge.py
index b2db4268..6c108fb9 100644
--- a/matchms/filtering/metadata_processing/correct_charge.py
+++ b/matchms/filtering/metadata_processing/correct_charge.py
@@ -1,5 +1,4 @@
 import logging
-from typing import Optional
 import numpy as np
 from matchms.typing import SpectrumType
 
@@ -7,7 +6,7 @@ from matchms.typing import SpectrumType
 logger = logging.getLogger("matchms")
 
 
-def correct_charge(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def correct_charge(spectrum_in: SpectrumType) -> SpectrumType:
     """Correct charge values based on given ionmode.
 
     For some spectra, the charge value is either undefined or inconsistent with its
@@ -15,21 +14,14 @@ def correct_charge(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> O
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum_in
         Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with corrected charge derived from ionmode, or `None` if not present.
     """
 
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     ionmode = spectrum.get("ionmode", None)
     if ionmode:
diff --git a/matchms/filtering/metadata_processing/derive_adduct_from_name.py b/matchms/filtering/metadata_processing/derive_adduct_from_name.py
index e88cb249..e48668aa 100644
--- a/matchms/filtering/metadata_processing/derive_adduct_from_name.py
+++ b/matchms/filtering/metadata_processing/derive_adduct_from_name.py
@@ -4,7 +4,6 @@ from typing import List, Optional
 from matchms.filtering.filter_utils.interpret_unknown_adduct import \
     get_multiplier_and_mass_from_adduct
 from matchms.Spectrum import Spectrum
-from matchms.typing import SpectrumType
 from ..filter_utils.load_known_adducts import load_known_adducts
 from .clean_adduct import _clean_adduct
 
@@ -13,7 +12,7 @@ logger = logging.getLogger("matchms")
 
 
 def derive_adduct_from_name(spectrum_in: Spectrum,
-                            remove_adduct_from_name: bool = True, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                            remove_adduct_from_name: bool = True) -> Optional[Spectrum]:
     """Find adduct in compound name and add to metadata (if not present yet).
 
     Method to interpret the given compound name to find the adduct.
@@ -24,18 +23,11 @@ def derive_adduct_from_name(spectrum_in: Spectrum,
         Input spectrum.
     remove_adduct_from_name:
         Remove found adducts from compound name if set to True. Default is True.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added adduct, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     compound_name = spectrum.get("compound_name", None)
     if compound_name is None:
diff --git a/matchms/filtering/metadata_processing/derive_annotation_from_compound_name.py b/matchms/filtering/metadata_processing/derive_annotation_from_compound_name.py
index 5c097148..ed50cba0 100644
--- a/matchms/filtering/metadata_processing/derive_annotation_from_compound_name.py
+++ b/matchms/filtering/metadata_processing/derive_annotation_from_compound_name.py
@@ -12,7 +12,6 @@ import pubchempy
 from matchms import Spectrum
 from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import (
     is_valid_inchi, is_valid_inchikey, is_valid_smiles)
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
@@ -20,7 +19,7 @@ logger = logging.getLogger("matchms")
 
 def derive_annotation_from_compound_name(spectrum_in: Spectrum,
                                          annotated_compound_names_file: Optional[str] = None,
-                                         mass_tolerance: float = 0.1, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                         mass_tolerance: float = 0.1):
     """Adds smiles, inchi, inchikey based on compound name by searching pubchem
 
     This filter is only run, if there is not yet a valid smiles or inchi in the metadata.
@@ -38,19 +37,10 @@ def derive_annotation_from_compound_name(spectrum_in: Spectrum,
         The csv file should contain the columns ["compound_name", "smiles", "inchi", "inchikey", "monoisotopic_mass"]
     mass_tolerance:
         Acceptable mass difference between query compound and pubchem result.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added annotation, or `None` if not present.
     """
     if spectrum_in is None:
         return None
-
-    spectrum = spectrum_in.clone() if clone else spectrum_in
-
+    spectrum = spectrum_in.clone()
     # Only run this function if it does not yet have a useful annotation
     if is_valid_inchi(spectrum.get("inchi")) or is_valid_smiles(spectrum.get("smiles")):
         return spectrum
diff --git a/matchms/filtering/metadata_processing/derive_formula_from_name.py b/matchms/filtering/metadata_processing/derive_formula_from_name.py
index 8463c2bd..4e10d69b 100644
--- a/matchms/filtering/metadata_processing/derive_formula_from_name.py
+++ b/matchms/filtering/metadata_processing/derive_formula_from_name.py
@@ -1,6 +1,5 @@
 import logging
 import re
-from typing import Optional
 from matchms.typing import SpectrumType
 
 
@@ -8,7 +7,7 @@ logger = logging.getLogger("matchms")
 
 
 def derive_formula_from_name(spectrum_in: SpectrumType,
-                             remove_formula_from_name: bool = True, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                             remove_formula_from_name: bool = True) -> SpectrumType:
     """Detect and remove misplaced formula in compound name and add to metadata.
 
     Method to find misplaced formulas in compound name based on regular expression.
@@ -21,18 +20,11 @@ def derive_formula_from_name(spectrum_in: SpectrumType,
         Input spectrum.
     remove_formula_from_name:
         Remove found formula from compound name if set to True. Default is True.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with cleaned formula, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if spectrum.get("compound_name", None) is not None:
         name = spectrum.get("compound_name")
diff --git a/matchms/filtering/metadata_processing/derive_formula_from_smiles.py b/matchms/filtering/metadata_processing/derive_formula_from_smiles.py
index d7d366ff..b39fa0cb 100644
--- a/matchms/filtering/metadata_processing/derive_formula_from_smiles.py
+++ b/matchms/filtering/metadata_processing/derive_formula_from_smiles.py
@@ -1,34 +1,15 @@
 import logging
-from typing import Optional
 from rdkit import Chem
 from rdkit.Chem.rdMolDescriptors import CalcMolFormula
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def derive_formula_from_smiles(spectrum_in, overwrite=True, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Adds the molecule’s formula from SMILES.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    overwrite:
-        If True, will overwrite the formula. Default is True.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added molecular formular, or `None` if not present.
-    """
-
+def derive_formula_from_smiles(spectrum_in, overwrite=True):
     if spectrum_in is None:
         return None
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
     if spectrum.get("formula") is not None:
         if overwrite is False:
             return spectrum
diff --git a/matchms/filtering/metadata_processing/derive_inchi_from_smiles.py b/matchms/filtering/metadata_processing/derive_inchi_from_smiles.py
index 30c5079d..0202c6ad 100644
--- a/matchms/filtering/metadata_processing/derive_inchi_from_smiles.py
+++ b/matchms/filtering/metadata_processing/derive_inchi_from_smiles.py
@@ -1,5 +1,4 @@
 import logging
-from typing import Optional
 from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import (
     convert_smiles_to_inchi, is_valid_inchi, is_valid_smiles)
 from matchms.typing import SpectrumType
@@ -8,25 +7,12 @@ from matchms.typing import SpectrumType
 logger = logging.getLogger("matchms")
 
 
-def derive_inchi_from_smiles(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Find missing Inchi and derive from smiles where possible.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added INCHI, or `None` if not present.
-    """
+def derive_inchi_from_smiles(spectrum_in: SpectrumType) -> SpectrumType:
+    """Find missing Inchi and derive from smiles where possible."""
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
     inchi = spectrum.get("inchi")
     smiles = spectrum.get("smiles")
 
diff --git a/matchms/filtering/metadata_processing/derive_inchikey_from_inchi.py b/matchms/filtering/metadata_processing/derive_inchikey_from_inchi.py
index f3d86ffc..f44f2cae 100644
--- a/matchms/filtering/metadata_processing/derive_inchikey_from_inchi.py
+++ b/matchms/filtering/metadata_processing/derive_inchikey_from_inchi.py
@@ -1,5 +1,4 @@
 import logging
-from typing import Optional
 from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import (
     convert_inchi_to_inchikey, is_valid_inchi, is_valid_inchikey)
 from matchms.typing import SpectrumType
@@ -8,25 +7,12 @@ from matchms.typing import SpectrumType
 logger = logging.getLogger("matchms")
 
 
-def derive_inchikey_from_inchi(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Find missing InchiKey and derive from Inchi where possible.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added INCHIKEY, or `None` if not present.
-    """
+def derive_inchikey_from_inchi(spectrum_in: SpectrumType) -> SpectrumType:
+    """Find missing InchiKey and derive from Inchi where possible."""
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
     inchi = spectrum.get("inchi")
     inchikey = spectrum.get("inchikey")
 
diff --git a/matchms/filtering/metadata_processing/derive_ionmode.py b/matchms/filtering/metadata_processing/derive_ionmode.py
index 4a9b95e3..905dd592 100644
--- a/matchms/filtering/metadata_processing/derive_ionmode.py
+++ b/matchms/filtering/metadata_processing/derive_ionmode.py
@@ -1,7 +1,5 @@
 import logging
-from typing import Optional
 from matchms.Spectrum import Spectrum
-from matchms.typing import SpectrumType
 from ..filter_utils.load_known_adducts import load_known_adducts
 from .clean_adduct import _clean_adduct
 
@@ -9,7 +7,7 @@ from .clean_adduct import _clean_adduct
 logger = logging.getLogger("matchms")
 
 
-def derive_ionmode(spectrum_in: Spectrum, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def derive_ionmode(spectrum_in: Spectrum) -> Spectrum:
     """Derive missing ionmode based on adduct.
 
     Some input formates (e.g. MGF files) do not always provide a correct ionmode.
@@ -18,10 +16,8 @@ def derive_ionmode(spectrum_in: Spectrum, clone: Optional[bool] = True) -> Optio
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum
         Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
 
     Returns
     -------
@@ -31,7 +27,7 @@ def derive_ionmode(spectrum_in: Spectrum, clone: Optional[bool] = True) -> Optio
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     ionmode = spectrum.get("ionmode")
     if ionmode in ["positive", "negative"]:
diff --git a/matchms/filtering/metadata_processing/derive_smiles_from_inchi.py b/matchms/filtering/metadata_processing/derive_smiles_from_inchi.py
index 607735a3..f123a0bd 100644
--- a/matchms/filtering/metadata_processing/derive_smiles_from_inchi.py
+++ b/matchms/filtering/metadata_processing/derive_smiles_from_inchi.py
@@ -1,5 +1,4 @@
 import logging
-from typing import Optional
 from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import (
     convert_inchi_to_smiles, is_valid_inchi, is_valid_smiles)
 from matchms.typing import SpectrumType
@@ -8,25 +7,12 @@ from matchms.typing import SpectrumType
 logger = logging.getLogger("matchms")
 
 
-def derive_smiles_from_inchi(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Find missing smiles and derive from Inchi where possible.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.#
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added SMILES, or `None` if not present.
-    """
+def derive_smiles_from_inchi(spectrum_in: SpectrumType) -> SpectrumType:
+    """Find missing smiles and derive from Inchi where possible."""
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
     inchi = spectrum.get("inchi")
     smiles = spectrum.get("smiles")
 
diff --git a/matchms/filtering/metadata_processing/harmonize_undefined_inchi.py b/matchms/filtering/metadata_processing/harmonize_undefined_inchi.py
index 66d61f18..7c8ad04a 100644
--- a/matchms/filtering/metadata_processing/harmonize_undefined_inchi.py
+++ b/matchms/filtering/metadata_processing/harmonize_undefined_inchi.py
@@ -1,32 +1,23 @@
-from typing import List, Optional
+from typing import List
 from matchms.typing import SpectrumType
 
 
 def harmonize_undefined_inchi(spectrum_in: SpectrumType, undefined: str = "",
-                              aliases: List[str] = None, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                              aliases: List[str] = None) -> SpectrumType:
     """Replace all aliases for empty/undefined inchi entries by value of ``undefined`` argument.
 
     Parameters
     ----------
-    spectrum_in:
-        Input spectrum.
     undefined:
         Give desired entry for undefined inchi fields. Default is "".
     aliases:
         Enter list of strings that are expected to represent undefined entries.
         Default is ["", "N/A", "NA", "n/a"].
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with undefined INCHI if not present or N/A, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if aliases is None:
         aliases = [
diff --git a/matchms/filtering/metadata_processing/harmonize_undefined_inchikey.py b/matchms/filtering/metadata_processing/harmonize_undefined_inchikey.py
index d14dc422..08463df8 100644
--- a/matchms/filtering/metadata_processing/harmonize_undefined_inchikey.py
+++ b/matchms/filtering/metadata_processing/harmonize_undefined_inchikey.py
@@ -1,32 +1,23 @@
-from typing import List, Optional
+from typing import List
 from matchms.typing import SpectrumType
 
 
 def harmonize_undefined_inchikey(spectrum_in: SpectrumType, undefined: str = "",
-                                 aliases: List[str] = None, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                 aliases: List[str] = None) -> SpectrumType:
     """Replace all aliases for empty/undefined inchikey entries by ``undefined``.
 
     Parameters
     ----------
-    spectrum_in:
-        Input spectrum.
     undefined:
         Give desired entry for undefined inchikey fields. Default is "".
     aliases:
         Enter list of strings that are expected to represent undefined entries.
         Default is ["", "N/A", "NA", "n/a", "no data"].
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with undefined INCHIKEY if not present or N/A, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if aliases is None:
         aliases = [
diff --git a/matchms/filtering/metadata_processing/harmonize_undefined_smiles.py b/matchms/filtering/metadata_processing/harmonize_undefined_smiles.py
index f1d32fa2..3eebee7d 100644
--- a/matchms/filtering/metadata_processing/harmonize_undefined_smiles.py
+++ b/matchms/filtering/metadata_processing/harmonize_undefined_smiles.py
@@ -1,32 +1,23 @@
-from typing import List, Optional
+from typing import List
 from matchms.typing import SpectrumType
 
 
 def harmonize_undefined_smiles(spectrum_in: SpectrumType, undefined: str = "",
-                               aliases: List[str] = None, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                               aliases: List[str] = None) -> SpectrumType:
     """Replace all aliases for empty/undefined smiles entries by ``undefined``.
 
     Parameters
     ----------
-    spectrum_in:
-        Input spectrum.
     undefined:
         Give desired entry for undefined smiles fields. Default is "".
     aliases:
         Enter list of strings that are expected to represent undefined entries.
         Default is ["", "N/A", "NA", "n/a", "no data"].
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with undefined SMILES if not present or N/A, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if aliases is None:
         aliases = [
diff --git a/matchms/filtering/metadata_processing/interpret_pepmass.py b/matchms/filtering/metadata_processing/interpret_pepmass.py
index f5189d62..cffe96a1 100644
--- a/matchms/filtering/metadata_processing/interpret_pepmass.py
+++ b/matchms/filtering/metadata_processing/interpret_pepmass.py
@@ -1,8 +1,6 @@
 import logging
 import re
-from typing import Optional
 import numpy as np
-from matchms.typing import SpectrumType
 from .make_charge_int import _convert_charge_to_int
 
 
@@ -11,30 +9,18 @@ _accepted_types = (float, str, int)
 _accepted_missing_entries = ["", "N/A", "NA", "n/a"]
 
 
-def interpret_pepmass(spectrum_in, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def interpret_pepmass(spectrum_in):
     """Reads pepmass field (if present) and adds values to correct field(s).
 
     The field "pepmass" or "PEPMASS" is often used to describe the precursor ion.
     This function will interpret the values as (mz, intensity, charge) tuple. Those
     will be splitted (if present) added to the fields "precursor_mz",
     "precursor_intensity", and "charge".
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with added pepmass, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     metadata_updated = _interpret_pepmass_metadata(spectrum.metadata)
     spectrum.metadata = metadata_updated
@@ -90,7 +76,7 @@ def _get_mz_intensity_charge(pepmass):
                 try:
                     pepmass = float(pepmass)
                 except ValueError:
-                    return None, None, None
+                    return None, None, None 
         length = len(pepmass)
         values = [None, None, None]
         for i in range(length):
diff --git a/matchms/filtering/metadata_processing/make_charge_int.py b/matchms/filtering/metadata_processing/make_charge_int.py
index ae57516c..90a75efc 100644
--- a/matchms/filtering/metadata_processing/make_charge_int.py
+++ b/matchms/filtering/metadata_processing/make_charge_int.py
@@ -1,30 +1,16 @@
 import logging
-from typing import Optional
 from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def make_charge_int(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Convert charge field to integer (if possible).
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with converted charge, or `None` if not present.
-    """
+def make_charge_int(spectrum_in: SpectrumType) -> SpectrumType:
+    """Convert charge field to integer (if possible)."""
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     charge = spectrum.get("charge", None)
     charge_int = _convert_charge_to_int(charge)
diff --git a/matchms/filtering/metadata_processing/repair_adduct_and_parent_mass_based_on_smiles.py b/matchms/filtering/metadata_processing/repair_adduct_and_parent_mass_based_on_smiles.py
index d74a4514..05532400 100644
--- a/matchms/filtering/metadata_processing/repair_adduct_and_parent_mass_based_on_smiles.py
+++ b/matchms/filtering/metadata_processing/repair_adduct_and_parent_mass_based_on_smiles.py
@@ -1,9 +1,7 @@
 import logging
-from typing import Optional
 from matchms import Spectrum
 from matchms.filtering.filter_utils.get_neutral_mass_from_smiles import \
     get_monoisotopic_neutral_mass
-from matchms.typing import SpectrumType
 from ..filter_utils.derive_precursor_mz_and_parent_mass import \
     derive_parent_mass_from_precursor_mz
 from .repair_adduct_based_on_parent_mass import _get_matching_adduct
@@ -13,7 +11,7 @@ logger = logging.getLogger("matchms")
 
 
 def repair_adduct_and_parent_mass_based_on_smiles(spectrum_in: Spectrum,
-                                                  mass_tolerance: float, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                                  mass_tolerance: float):
     """
     Corrects the adduct and parent mass of a spectrum based on its SMILES representation and the precursor m/z.
 
@@ -30,18 +28,10 @@ def repair_adduct_and_parent_mass_based_on_smiles(spectrum_in: Spectrum,
     mass_tolerance : float
         Maximum allowed mass difference between the calculated parent mass and the neutral
         monoisotopic mass derived from the SMILES.
-
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with repaired parent mass, or `None` if not present.
     """
     if spectrum_in is None:
         return None
-    changed_spectrum = spectrum_in.clone() if clone else spectrum_in
+    changed_spectrum = spectrum_in.clone()
     smiles_mass = get_monoisotopic_neutral_mass(changed_spectrum.get("smiles"))
     if smiles_mass is None:
         return spectrum_in
diff --git a/matchms/filtering/metadata_processing/repair_adduct_based_on_parent_mass.py b/matchms/filtering/metadata_processing/repair_adduct_based_on_parent_mass.py
index 6bcdec19..a957f66f 100644
--- a/matchms/filtering/metadata_processing/repair_adduct_based_on_parent_mass.py
+++ b/matchms/filtering/metadata_processing/repair_adduct_based_on_parent_mass.py
@@ -1,7 +1,5 @@
 import logging
-from typing import Optional
 from matchms import Spectrum
-from matchms.typing import SpectrumType
 from ..filter_utils.load_known_adducts import load_known_adducts
 
 
@@ -9,7 +7,7 @@ logger = logging.getLogger("matchms")
 
 
 def repair_adduct_based_on_parent_mass(spectrum_in: Spectrum,
-                                       mass_tolerance: float, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                       mass_tolerance: float):
     """
     Corrects the adduct of a spectrum based on its parent_mass representation and the precursor m/z.
 
@@ -20,18 +18,10 @@ def repair_adduct_based_on_parent_mass(spectrum_in: Spectrum,
 
     mass_tolerance : float
         Maximum allowed mass difference between the parent mass and the parent mass based on the adduct.
-
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with repaired parent adduct, or `None` if not present.
     """
     if spectrum_in is None:
         return None
-    changed_spectrum = spectrum_in.clone() if clone else spectrum_in
+    changed_spectrum = spectrum_in.clone()
 
     new_adduct = _get_matching_adduct(precursor_mz=spectrum_in.get("precursor_mz"),
                                       parent_mass=spectrum_in.get("parent_mass"),
diff --git a/matchms/filtering/metadata_processing/repair_inchi_inchikey_smiles.py b/matchms/filtering/metadata_processing/repair_inchi_inchikey_smiles.py
index 53ae88dc..2497b082 100644
--- a/matchms/filtering/metadata_processing/repair_inchi_inchikey_smiles.py
+++ b/matchms/filtering/metadata_processing/repair_inchi_inchikey_smiles.py
@@ -1,29 +1,16 @@
-from typing import Optional
 from matchms.filtering.SpeciesString import SpeciesString
 from matchms.typing import SpectrumType
 
 
-def repair_inchi_inchikey_smiles(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def repair_inchi_inchikey_smiles(spectrum_in: SpectrumType) -> SpectrumType:
     """Check if inchi, inchikey, and smiles entries seem correct. Detect and correct
     if any of those entries clearly belongs into one of the other two fields (e.g.
     inchikey found in inchi field).
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with repaired INCHI, INCHIKEY and SMILES, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     # interpret available data and clean each
     inchi = spectrum.get("inchi", "")
diff --git a/matchms/filtering/metadata_processing/repair_not_matching_annotation.py b/matchms/filtering/metadata_processing/repair_not_matching_annotation.py
index 99a8934f..ff0451ae 100644
--- a/matchms/filtering/metadata_processing/repair_not_matching_annotation.py
+++ b/matchms/filtering/metadata_processing/repair_not_matching_annotation.py
@@ -1,5 +1,4 @@
 import logging
-from typing import Optional
 from matchms import Spectrum
 from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import (
     convert_inchi_to_inchikey, convert_inchi_to_smiles,
@@ -7,13 +6,12 @@ from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import (
     is_valid_smiles)
 from matchms.filtering.metadata_processing.require_parent_mass_match_smiles import \
     _check_smiles_and_parent_mass_match
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def repair_not_matching_annotation(spectrum_in: Spectrum, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def repair_not_matching_annotation(spectrum_in: Spectrum):
     """
     Repairs mismatches in a spectrum's annotations related to SMILES, InChI, and InChIKey.
 
@@ -34,8 +32,6 @@ def repair_not_matching_annotation(spectrum_in: Spectrum, clone: Optional[bool]
     ----------
     spectrum_in : Spectrum
         The input spectrum containing annotations to be checked and repaired.
-    clone:
-        Optionally clone the Spectrum.
 
     Returns:
     -------
@@ -46,7 +42,7 @@ def repair_not_matching_annotation(spectrum_in: Spectrum, clone: Optional[bool]
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if not _check_repairing_is_possible(spectrum.get("smiles"), spectrum.get("inchi"), spectrum.get("inchikey")):
         # Repairing is not possible, since not all annotations are valid entries.
diff --git a/matchms/filtering/metadata_processing/repair_parent_mass_from_smiles.py b/matchms/filtering/metadata_processing/repair_parent_mass_from_smiles.py
index 86cfe42d..ad4d673d 100644
--- a/matchms/filtering/metadata_processing/repair_parent_mass_from_smiles.py
+++ b/matchms/filtering/metadata_processing/repair_parent_mass_from_smiles.py
@@ -1,33 +1,18 @@
 import logging
-from typing import Optional
 from matchms import Spectrum
 from matchms.filtering.filter_utils.get_neutral_mass_from_smiles import \
     get_monoisotopic_neutral_mass
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
 def repair_parent_mass_from_smiles(spectrum_in: Spectrum,
-                                        mass_tolerance: float = 0.1, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Sets the parent mass to match the smiles mass, if not already close to smiles mass
-
-    Parameters:
-    ----------
-    spectrum_in : Spectrum
-        The input spectrum containing annotations to be checked and repaired.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with repaired parent mass, or `None` if not present.
-    """
+                                        mass_tolerance: float = 0.1):
+    """Sets the parent mass to match the smiles mass, if not already close to smiles mass"""
     if spectrum_in is None:
         return None
-    changed_spectrum = spectrum_in.clone() if clone else spectrum_in
+    changed_spectrum = spectrum_in.clone()
     smiles_mass = get_monoisotopic_neutral_mass(changed_spectrum.get("smiles"))
     if smiles_mass is None:
         return spectrum_in
diff --git a/matchms/filtering/metadata_processing/repair_parent_mass_is_molar_mass.py b/matchms/filtering/metadata_processing/repair_parent_mass_is_molar_mass.py
index c428acfd..27e8c904 100644
--- a/matchms/filtering/metadata_processing/repair_parent_mass_is_molar_mass.py
+++ b/matchms/filtering/metadata_processing/repair_parent_mass_is_molar_mass.py
@@ -1,15 +1,13 @@
 import logging
-from typing import Optional
 from matchms import Spectrum
 from matchms.filtering.filter_utils.get_neutral_mass_from_smiles import (
     get_molecular_weight_neutral_mass, get_monoisotopic_neutral_mass)
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def repair_parent_mass_is_molar_mass(spectrum_in: Spectrum, mass_tolerance: float, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def repair_parent_mass_is_molar_mass(spectrum_in: Spectrum, mass_tolerance: float):
     """Changes the parent mass from molar mass into monoistopic mass
 
     Manual entered parent mass is sometimes wrongly added as Molar mass instead of monoisotopic mass
@@ -18,25 +16,10 @@ def repair_parent_mass_is_molar_mass(spectrum_in: Spectrum, mass_tolerance: floa
 
     The molar mass is an average mass based on the average of all common isotopes and will therefore differ from what
     is measured in mass spectrometry.
-
-    Parameters:
-    ----------
-    spectrum_in : Spectrum
-        The input spectrum containing annotations to be checked and repaired.
-    mass_tolerance:
-        Maximum allowed mass difference between the calculated parent mass and the neutral
-        monoisotopic mass derived from the SMILES.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with repaired parent mass, or `None` if not present.
     """
     if spectrum_in is None:
         return None
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     parent_mass = spectrum.get("parent_mass")
     smiles = spectrum.get("smiles")
diff --git a/matchms/filtering/metadata_processing/repair_parent_mass_match_smiles_wrapper.py b/matchms/filtering/metadata_processing/repair_parent_mass_match_smiles_wrapper.py
index a085daf3..ccc3c562 100644
--- a/matchms/filtering/metadata_processing/repair_parent_mass_match_smiles_wrapper.py
+++ b/matchms/filtering/metadata_processing/repair_parent_mass_match_smiles_wrapper.py
@@ -13,27 +13,11 @@ logger = logging.getLogger("matchms")
 
 
 def repair_parent_mass_match_smiles_wrapper(spectrum_in: SpectrumType,
-                                            mass_tolerance: float = 0.2, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Wrapper function for repairing a mismatch between parent mass and smiles mass
-
-    Parameters:
-    ----------
-    spectrum_in : Spectrum
-        The input spectrum containing annotations to be checked and repaired.
-    mass_tolerance:
-        Maximum allowed mass difference between the calculated parent mass and the neutral
-        monoisotopic mass derived from the SMILES. Defaults to 0.2.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with repaired parent mass, or `None` if not present.
-    """
+                                            mass_tolerance: float = 0.2) -> Optional[SpectrumType]:
+    """Wrapper function for repairing a mismatch between parent mass and smiles mass"""
     if spectrum_in is None:
         return None
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     filters_to_apply = [repair_smiles_of_salts,
                         repair_parent_mass_is_molar_mass,
diff --git a/matchms/filtering/metadata_processing/repair_smiles_of_salts.py b/matchms/filtering/metadata_processing/repair_smiles_of_salts.py
index 9d4cea1d..1e8d58f3 100644
--- a/matchms/filtering/metadata_processing/repair_smiles_of_salts.py
+++ b/matchms/filtering/metadata_processing/repair_smiles_of_salts.py
@@ -1,40 +1,22 @@
 import itertools
 import logging
-from typing import Optional
 from matchms.filtering.filter_utils.get_neutral_mass_from_smiles import \
     get_monoisotopic_neutral_mass
 from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import \
     is_valid_smiles
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
 def repair_smiles_of_salts(spectrum_in,
-                           mass_tolerance: float, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                           mass_tolerance):
     """Repairs the smiles of a salt to match the parent mass.
     E.g. C1=NC2=NC=NC(=C2N1)N.Cl is converted to 1=NC2=NC=NC(=C2N1)N if this matches the parent mass
-    Checks if parent mass matches one of the ions
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    mass_tolerance:
-        Maximum allowed mass difference between the calculated parent mass and the neutral
-        monoisotopic mass derived from the SMILES.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with repaired SMILES, or `None` if not present.
-    """
+    Checks if parent mass matches one of the ions"""
     if spectrum_in is None:
         return None
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     smiles = spectrum.get("smiles")
     if smiles is None:
diff --git a/matchms/filtering/metadata_processing/require_correct_ionmode.py b/matchms/filtering/metadata_processing/require_correct_ionmode.py
index 46360f1c..9a92f666 100644
--- a/matchms/filtering/metadata_processing/require_correct_ionmode.py
+++ b/matchms/filtering/metadata_processing/require_correct_ionmode.py
@@ -9,8 +9,8 @@ logger = logging.getLogger("matchms")
 def require_correct_ionmode(spectrum_in: SpectrumType,
                             ion_mode_to_keep) -> Optional[SpectrumType]:
     """
-    Validates the ion mode of a given spectrum. If the spectrum's ion mode
-    doesn't match the `ion_mode_to_keep`, it will be removed and a log message
+    Validates the ion mode of a given spectrum. If the spectrum's ion mode 
+    doesn't match the `ion_mode_to_keep`, it will be removed and a log message 
     will be generated.
 
     Parameters
@@ -19,7 +19,7 @@ def require_correct_ionmode(spectrum_in: SpectrumType,
         The input spectrum to be validated. If `None`, the function will return `None`.
 
     ion_mode_to_keep: str
-        Desired ion mode ('positive', 'negative', or 'both'). If not one of these,
+        Desired ion mode ('positive', 'negative', or 'both'). If not one of these, 
         a `ValueError` is raised.
 
     Returns
@@ -29,9 +29,7 @@ def require_correct_ionmode(spectrum_in: SpectrumType,
     """
     if spectrum_in is None:
         return None
-
-    spectrum = spectrum_in
-
+    spectrum = spectrum_in.clone()
     if ion_mode_to_keep not in {"positive", "negative", "both"}:
         raise ValueError("ion_mode_to_keep should be 'positive', 'negative' or 'both'")
     ion_mode = spectrum.get("ionmode")
diff --git a/matchms/filtering/metadata_processing/require_matching_adduct_and_ionmode.py b/matchms/filtering/metadata_processing/require_matching_adduct_and_ionmode.py
index 93f15d01..d844d5b9 100644
--- a/matchms/filtering/metadata_processing/require_matching_adduct_and_ionmode.py
+++ b/matchms/filtering/metadata_processing/require_matching_adduct_and_ionmode.py
@@ -1,14 +1,12 @@
 import logging
-from typing import Optional
 from matchms.filtering.filter_utils.interpret_unknown_adduct import \
     get_charge_of_adduct
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def require_matching_adduct_and_ionmode(spectrum) -> Optional[SpectrumType]:
+def require_matching_adduct_and_ionmode(spectrum):
     if spectrum is None:
         return None
     ionmode = spectrum.get("ionmode")
diff --git a/matchms/filtering/metadata_processing/require_matching_adduct_precursor_mz_parent_mass.py b/matchms/filtering/metadata_processing/require_matching_adduct_precursor_mz_parent_mass.py
index 36ca2afd..9cbc5cda 100644
--- a/matchms/filtering/metadata_processing/require_matching_adduct_precursor_mz_parent_mass.py
+++ b/matchms/filtering/metadata_processing/require_matching_adduct_precursor_mz_parent_mass.py
@@ -1,16 +1,14 @@
 import logging
 import math
-from typing import Optional
 from matchms.filtering.filter_utils.interpret_unknown_adduct import \
     get_multiplier_and_mass_from_adduct
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
 def require_matching_adduct_precursor_mz_parent_mass(spectrum,
-                                                     tolerance=0.1) -> Optional[SpectrumType]:
+                                                     tolerance=0.1):
     """Checks if the adduct precursor mz and parent mass match within the tolerance"""
     if spectrum is None:
         return None
diff --git a/matchms/filtering/metadata_processing/require_parent_mass_match_smiles.py b/matchms/filtering/metadata_processing/require_parent_mass_match_smiles.py
index 16b27b64..758d95c4 100644
--- a/matchms/filtering/metadata_processing/require_parent_mass_match_smiles.py
+++ b/matchms/filtering/metadata_processing/require_parent_mass_match_smiles.py
@@ -28,8 +28,7 @@ def require_parent_mass_match_smiles(spectrum_in: SpectrumType,
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in
-
+    spectrum = spectrum_in.clone()
     # Check if parent mass matches the smiles mass
     if _check_smiles_and_parent_mass_match(spectrum.get("smiles"), spectrum.get("parent_mass"), mass_tolerance):
         return spectrum
diff --git a/matchms/filtering/metadata_processing/require_precursor_mz.py b/matchms/filtering/metadata_processing/require_precursor_mz.py
index 45341872..8ce34174 100644
--- a/matchms/filtering/metadata_processing/require_precursor_mz.py
+++ b/matchms/filtering/metadata_processing/require_precursor_mz.py
@@ -1,5 +1,5 @@
 import logging
-from typing import Optional
+from typing import Optional, Union
 from matchms.typing import SpectrumType
 
 
@@ -8,9 +8,8 @@ logger = logging.getLogger("matchms")
 
 def require_precursor_mz(spectrum_in: SpectrumType,
                          minimum_accepted_mz: Optional[float] = 10.0,
-                         maximum_mz: Optional[float] = None,
-                         clone: Optional[bool] = True
-                         ) -> Optional[SpectrumType]:
+                         maximum_mz: Optional[float] = None
+                         ) -> Union[SpectrumType, None]:
 
     """Returns None if there is no precursor_mz or if <= minimum_accepted_mz
 
@@ -22,18 +21,11 @@ def require_precursor_mz(spectrum_in: SpectrumType,
         Set to minimum acceptable value for precursor m/z. Default is set to 10.0.
     maximum_mz:
         Set the maximum value for precursor m/z.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with precursor_mz, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     precursor_mz = spectrum.get("precursor_mz", None)
     if precursor_mz is None:
diff --git a/matchms/filtering/metadata_processing/require_retention_index.py b/matchms/filtering/metadata_processing/require_retention_index.py
index 05a745e0..70665434 100644
--- a/matchms/filtering/metadata_processing/require_retention_index.py
+++ b/matchms/filtering/metadata_processing/require_retention_index.py
@@ -1,22 +1,18 @@
 import logging
-from typing import Optional
+from typing import Union
 from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
-def require_retention_index(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def require_retention_index(spectrum_in: SpectrumType) -> Union[SpectrumType, None]:
     """
     This function checks if the input spectrum has a 'retention_index' in its metadata.
     If the input spectrum is None or doesn't have a 'retention_index', the function returns None.
     Otherwise, it returns a clone of the input spectrum.
 
-    Parameters
-    ----------
-    spectrum_in (SpectrumType):
-        The input spectrum to check.
-    clone:
-        Optionally clone the Spectrum.
+    Parameters:
+    spectrum_in (SpectrumType): The input spectrum to check.
 
     Returns:
     SpectrumType: A clone of the input spectrum if it has a 'retention_index', None otherwise.
@@ -24,7 +20,7 @@ def require_retention_index(spectrum_in: SpectrumType, clone: Optional[bool] = T
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     retention_index = spectrum.get("retention_index", None)
     if retention_index is None:
diff --git a/matchms/filtering/metadata_processing/require_retention_time.py b/matchms/filtering/metadata_processing/require_retention_time.py
index 15e085d2..f4fb4099 100644
--- a/matchms/filtering/metadata_processing/require_retention_time.py
+++ b/matchms/filtering/metadata_processing/require_retention_time.py
@@ -1,5 +1,5 @@
 import logging
-from typing import Optional
+from typing import Union
 from matchms.typing import SpectrumType
 
 
@@ -8,18 +8,14 @@ logger = logging.getLogger("matchms")
 
 def require_retention_time(spectrum_in: SpectrumType,
                            minimum_rt=None,
-                           maximum_rt=None, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                           maximum_rt=None) -> Union[SpectrumType, None]:
     """
     This function checks if the input spectrum has a 'retention_time' in its metadata.
     If the input spectrum is None or doesn't have a 'retention_time', the function returns None.
     Otherwise, it returns a clone of the input spectrum.
 
-    Parameters
-    ----------
-    spectrum_in (SpectrumType):
-        The input spectrum to check.
-    clone:
-        Optionally clone the Spectrum.
+    Parameters:
+    spectrum_in (SpectrumType): The input spectrum to check.
 
     Returns:
     SpectrumType: A clone of the input spectrum if it has a 'retention_time', None otherwise.
@@ -27,7 +23,7 @@ def require_retention_time(spectrum_in: SpectrumType,
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     retention_time = spectrum.get("retention_time", None)
     if retention_time is None:
diff --git a/matchms/filtering/metadata_processing/require_valid_annotation.py b/matchms/filtering/metadata_processing/require_valid_annotation.py
index 9478bef8..0e98730f 100644
--- a/matchms/filtering/metadata_processing/require_valid_annotation.py
+++ b/matchms/filtering/metadata_processing/require_valid_annotation.py
@@ -1,16 +1,14 @@
 import logging
-from typing import Optional
 from matchms import Spectrum
 from matchms.filtering.filter_utils.smile_inchi_inchikey_conversions import (
     convert_inchi_to_inchikey, convert_smiles_to_inchi, is_valid_inchi,
     is_valid_inchikey, is_valid_smiles)
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def require_valid_annotation(spectrum: Spectrum) -> Optional[SpectrumType]:
+def require_valid_annotation(spectrum: Spectrum):
     """Removes spectra that are not fully annotated (correct and matching, smiles, inchi and inchikey)"""
     if spectrum is None:
         return None
diff --git a/matchms/filtering/peak_processing/normalize_intensities.py b/matchms/filtering/peak_processing/normalize_intensities.py
index 966b929f..1cf3a4d1 100644
--- a/matchms/filtering/peak_processing/normalize_intensities.py
+++ b/matchms/filtering/peak_processing/normalize_intensities.py
@@ -1,5 +1,4 @@
 import logging
-from typing import Optional
 import numpy as np
 from matchms.typing import SpectrumType
 from ...Fragments import Fragments
@@ -8,26 +7,13 @@ from ...Fragments import Fragments
 logger = logging.getLogger("matchms")
 
 
-def normalize_intensities(spectrum_in: SpectrumType, clone: Optional[bool] = True) -> Optional[SpectrumType]:
-    """Normalize intensities of peaks to unit height.
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with mormalized Intensities, or `None` if not present.
-    """
+def normalize_intensities(spectrum_in: SpectrumType) -> SpectrumType:
+    """Normalize intensities of peaks to unit height."""
 
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if len(spectrum.peaks) == 0:
         return spectrum
@@ -35,9 +21,8 @@ def normalize_intensities(spectrum_in: SpectrumType, clone: Optional[bool] = Tru
     max_intensity = np.max(spectrum.peaks.intensities)
 
     if max_intensity <= 0:
-        logger.warning("Peaks of spectrum with all peak intensities <= 0 were deleted.")
-        spectrum.peaks = Fragments(mz=np.array([]), intensities=np.array([]))
-        return spectrum
+        logger.warning("Spectrum with all peak intensities <= 0 was set to None.")
+        return None
 
     # Normalize peak intensities
     mz, intensities = spectrum.peaks.mz, spectrum.peaks.intensities
diff --git a/matchms/filtering/peak_processing/reduce_to_number_of_peaks.py b/matchms/filtering/peak_processing/reduce_to_number_of_peaks.py
index bc6ce630..7084ec93 100644
--- a/matchms/filtering/peak_processing/reduce_to_number_of_peaks.py
+++ b/matchms/filtering/peak_processing/reduce_to_number_of_peaks.py
@@ -10,12 +10,12 @@ logger = logging.getLogger("matchms")
 
 
 def reduce_to_number_of_peaks(spectrum_in: SpectrumType, n_required: int = 0, n_max: int = np.inf,
-                              ratio_desired: Optional[float] = None, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                              ratio_desired: Optional[float] = None) -> SpectrumType:
     """Lowest intensity peaks will be removed when it has more peaks than desired.
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum_in
         Input spectrum.
     n_required:
         Number of minimum required peaks. Spectra with fewer peaks will be set
@@ -27,13 +27,6 @@ def reduce_to_number_of_peaks(spectrum_in: SpectrumType, n_required: int = 0, n_
         For spectra without parent mass (e.g. GCMS spectra) this will raise an
         error when ratio_desired is used.
         Default is None.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with reduced lowest peaks, or `None` if not present.
     """
     def _set_maximum_number_of_peaks_to_keep():
         parent_mass = spectrum.get("parent_mass", None)
@@ -54,7 +47,7 @@ def reduce_to_number_of_peaks(spectrum_in: SpectrumType, n_required: int = 0, n_
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     if spectrum.peaks.intensities.size < n_required:
         logger.info("Spectrum with %s (<%s) peaks was set to None.",
diff --git a/matchms/filtering/peak_processing/remove_noise_below_frequent_intensities.py b/matchms/filtering/peak_processing/remove_noise_below_frequent_intensities.py
index a292d0cf..562793eb 100644
--- a/matchms/filtering/peak_processing/remove_noise_below_frequent_intensities.py
+++ b/matchms/filtering/peak_processing/remove_noise_below_frequent_intensities.py
@@ -1,17 +1,15 @@
 import logging
-from typing import Optional
 import numpy as np
 from matchms.Fragments import Fragments
 from matchms.Spectrum import Spectrum
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def remove_noise_below_frequent_intensities(spectrum_in: Spectrum,
+def remove_noise_below_frequent_intensities(spectrum: Spectrum,
                                             min_count_of_frequent_intensities: int = 5,
-                                            noise_level_multiplier: float = 2.0, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                            noise_level_multiplier: float = 2.0):
     """Removes noise if intensities exactly match frequently
 
     When no noise filtering has been applied to a spectrum, many spectra show repeating intensities.
@@ -23,25 +21,17 @@ def remove_noise_below_frequent_intensities(spectrum_in: Spectrum,
 
     Parameters
     ----------
-    spectrum_in:
+    spectrum
         Input spectrum.
     min_count_of_frequent_intensities:
         Minimum number of repeating intensities.
     noise_level_multiplier:
         From all intensities that repeat more than min_count_of_frequent_intensities the highest is selected.
-        The noise level is set to this intensity * noise_level_multiplier.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with removed intensities, or `None` if not present.
+    The noise level is set to this intensity * noise_level_multiplier.
     """
-    if spectrum_in is None:
+    if spectrum is None:
         return None
-
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum.clone()
 
     highest_frequent_peak = _select_highest_frequent_peak(spectrum.intensities, min_count_of_frequent_intensities)
     if highest_frequent_peak != -1:
diff --git a/matchms/filtering/peak_processing/remove_peaks_around_precursor_mz.py b/matchms/filtering/peak_processing/remove_peaks_around_precursor_mz.py
index 6b144e7b..7d29af5c 100644
--- a/matchms/filtering/peak_processing/remove_peaks_around_precursor_mz.py
+++ b/matchms/filtering/peak_processing/remove_peaks_around_precursor_mz.py
@@ -1,10 +1,9 @@
-from typing import Optional
 import numpy as np
 from matchms.Fragments import Fragments
 from matchms.typing import SpectrumType
 
 
-def remove_peaks_around_precursor_mz(spectrum_in: SpectrumType, mz_tolerance: float = 17, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def remove_peaks_around_precursor_mz(spectrum_in: SpectrumType, mz_tolerance: float = 17) -> SpectrumType:
 
     """Remove peaks that are within mz_tolerance (in Da) of
        the precursor mz, exlcuding the precursor peak.
@@ -16,18 +15,11 @@ def remove_peaks_around_precursor_mz(spectrum_in: SpectrumType, mz_tolerance: fl
     mz_tolerance:
         Tolerance of mz values that are not allowed to lie
         within the precursor mz. Default is 17 Da.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with removed peaks, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     precursor_mz = spectrum.get("precursor_mz", None)
     assert precursor_mz is not None, "Precursor mz absent."
diff --git a/matchms/filtering/peak_processing/remove_peaks_outside_top_k.py b/matchms/filtering/peak_processing/remove_peaks_outside_top_k.py
index d10eded0..467197a4 100644
--- a/matchms/filtering/peak_processing/remove_peaks_outside_top_k.py
+++ b/matchms/filtering/peak_processing/remove_peaks_outside_top_k.py
@@ -1,11 +1,10 @@
-from typing import Optional
 import numpy as np
 from matchms.Fragments import Fragments
 from matchms.typing import SpectrumType
 
 
 def remove_peaks_outside_top_k(spectrum_in: SpectrumType, k: int = 6,
-                               mz_window: float = 50, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                               mz_window: float = 50) -> SpectrumType:
 
     """Remove all peaks which are not within *mz_window* of at least one
        of the *k* highest intensity peaks of the spectrum.
@@ -19,18 +18,11 @@ def remove_peaks_outside_top_k(spectrum_in: SpectrumType, k: int = 6,
     mz_window:
         Window of mz values (in Da) that are allowed to lie within
         the top k peaks. Default is 50 Da.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with removed peaks, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     assert k >= 1, "k must be a positive nonzero integer."
     assert mz_window >= 0, "mz_window must be a positive scalar."
diff --git a/matchms/filtering/peak_processing/remove_profiled_spectra.py b/matchms/filtering/peak_processing/remove_profiled_spectra.py
index de410bc9..4a250c6c 100644
--- a/matchms/filtering/peak_processing/remove_profiled_spectra.py
+++ b/matchms/filtering/peak_processing/remove_profiled_spectra.py
@@ -1,14 +1,12 @@
 import logging
-from typing import Optional
 import numpy as np
 from matchms.Spectrum import Spectrum
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
-def remove_profiled_spectra(spectrum_in: Spectrum, mz_window=0.5, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+def remove_profiled_spectra(spectrum: Spectrum, mz_window=0.5):
     """Remove profiled spectra
 
     Spectra are removed if within the mz_window of 0.5 of the highest peak at least 2 peaks next to the main peak are of
@@ -16,27 +14,9 @@ def remove_profiled_spectra(spectrum_in: Spectrum, mz_window=0.5, clone: Optiona
 
     Reproduced from MZmine.
     https://github.com/mzmine/mzmine3/blob/master/src/main/java/io/github/mzmine/util/scans/ScanUtils.java#L609
-
-    Parameters
-    ----------
-    spectrum_in:
-        Input spectrum.
-    mz_window:
-        Window of mz values (in Da) that are allowed to lie within
-        the top k peaks. Default is 50 Da.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        None if the spectrum is likely profile data, else the input spectrum.
     """
-    if spectrum_in is None:
+    if spectrum is None:
         return None
-
-    spectrum = spectrum_in.clone() if clone else spectrum_in
-
     peaks_n = spectrum.mz.shape[0]
     if peaks_n < 3:
         return spectrum
diff --git a/matchms/filtering/peak_processing/require_maximum_number_of_peaks.py b/matchms/filtering/peak_processing/require_maximum_number_of_peaks.py
index dd68c799..f3f9e959 100644
--- a/matchms/filtering/peak_processing/require_maximum_number_of_peaks.py
+++ b/matchms/filtering/peak_processing/require_maximum_number_of_peaks.py
@@ -1,14 +1,13 @@
 import logging
 from typing import Optional
 from matchms.Spectrum import Spectrum
-from matchms.typing import SpectrumType
 
 
 logger = logging.getLogger("matchms")
 
 
 def require_maximum_number_of_peaks(spectrum_in: Spectrum,
-                                    maximum_number_of_fragments: int = 1000, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                    maximum_number_of_fragments: int = 1000) -> Optional[Spectrum]:
     """Spectrum will be set to None when it has more peaks than maximum_number_of_fragments.
 
     Parameters
@@ -18,22 +17,13 @@ def require_maximum_number_of_peaks(spectrum_in: Spectrum,
     maximum_number_of_fragments:
         Number of minimum required peaks. Spectra with fewer peaks will be set
         to 'None'.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Untouched Spectrum or 'None'.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
-
-    if spectrum.peaks.intensities.size > maximum_number_of_fragments:
+    if spectrum_in.peaks.intensities.size > maximum_number_of_fragments:
         logger.info("Spectrum with %s (>%s) peaks was set to None.",
-                    str(spectrum.peaks.intensities.size), str(maximum_number_of_fragments))
+                    str(spectrum_in.peaks.intensities.size), str(maximum_number_of_fragments))
         return None
 
-    return spectrum
+    return spectrum_in
diff --git a/matchms/filtering/peak_processing/require_minimum_number_of_high_peaks.py b/matchms/filtering/peak_processing/require_minimum_number_of_high_peaks.py
index 85bc752f..4a9d2d95 100644
--- a/matchms/filtering/peak_processing/require_minimum_number_of_high_peaks.py
+++ b/matchms/filtering/peak_processing/require_minimum_number_of_high_peaks.py
@@ -1,5 +1,4 @@
 import logging
-from typing import Optional
 from matchms.typing import SpectrumType
 from .select_by_relative_intensity import select_by_relative_intensity
 
@@ -8,7 +7,7 @@ logger = logging.getLogger("matchms")
 
 
 def require_minimum_number_of_high_peaks(spectrum_in: SpectrumType, no_peaks: int = 5,
-                                  intensity_percent: float = 2.0, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                  intensity_percent: float = 2.0) -> SpectrumType:
 
     """Returns None if the number of peaks with relative intensity
        above or equal to intensity_percent is less than no_peaks.
@@ -23,19 +22,12 @@ def require_minimum_number_of_high_peaks(spectrum_in: SpectrumType, no_peaks: in
         Default is 5.
     intensity_percent:
         Minimum relative intensity (as a percentage between 0-100) for
-        peaks that are searched. Default is 2.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Untouched Spectrum or 'None'.
+        peaks that are searched. Default is 2
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     assert no_peaks >= 1, "no_peaks must be a positive nonzero integer."
     assert 0 <= intensity_percent <= 100, "intensity_percent must be a scalar between 0-100."
diff --git a/matchms/filtering/peak_processing/require_minimum_number_of_peaks.py b/matchms/filtering/peak_processing/require_minimum_number_of_peaks.py
index d67ecf77..872a6258 100644
--- a/matchms/filtering/peak_processing/require_minimum_number_of_peaks.py
+++ b/matchms/filtering/peak_processing/require_minimum_number_of_peaks.py
@@ -9,7 +9,7 @@ logger = logging.getLogger("matchms")
 
 def require_minimum_number_of_peaks(spectrum_in: SpectrumType,
                                     n_required: int = 10,
-                                    ratio_required: Optional[float] = None, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                    ratio_required: Optional[float] = None) -> SpectrumType:
     """Spectrum will be set to None when it has fewer peaks than required.
 
     Parameters
@@ -22,18 +22,12 @@ def require_minimum_number_of_peaks(spectrum_in: SpectrumType,
     ratio_required:
         Set desired ratio between minimum number of peaks and parent mass.
         Default is None.
-    clone:
-        Optionally clone the Spectrum.
 
-    Returns
-    -------
-    Spectrum or None
-        Untouched Spectrum or 'None'.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     parent_mass = spectrum.get("parent_mass", None)
     if parent_mass and ratio_required:
diff --git a/matchms/filtering/peak_processing/select_by_intensity.py b/matchms/filtering/peak_processing/select_by_intensity.py
index a2040b42..ce77a356 100644
--- a/matchms/filtering/peak_processing/select_by_intensity.py
+++ b/matchms/filtering/peak_processing/select_by_intensity.py
@@ -1,35 +1,25 @@
-from typing import Optional
 import numpy as np
 from matchms.Fragments import Fragments
 from matchms.typing import SpectrumType
 
 
 def select_by_intensity(spectrum_in: SpectrumType, intensity_from: float = 10.0,
-                        intensity_to: float = 200.0, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                        intensity_to: float = 200.0) -> SpectrumType:
     """Keep only peaks within set intensity range (keep if
     intensity_from >= intensity >= intensity_to). In most cases it is adviced to
     use :py:func:`select_by_relative_intensity` function instead.
 
     Parameters
     ----------
-    spectrum_in:
-        Input spectrum.
     intensity_from:
         Set lower threshold for peak intensity. Default is 10.0.
     intensity_to:
         Set upper threshold for peak intensity. Default is 200.0.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with peaks within the specified intensity range, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     assert intensity_from <= intensity_to, "'intensity_from' should be smaller than or equal to 'intensity_to'."
 
diff --git a/matchms/filtering/peak_processing/select_by_mz.py b/matchms/filtering/peak_processing/select_by_mz.py
index 7b5e1061..3617963a 100644
--- a/matchms/filtering/peak_processing/select_by_mz.py
+++ b/matchms/filtering/peak_processing/select_by_mz.py
@@ -1,33 +1,23 @@
-from typing import Optional
 import numpy as np
 from matchms.Fragments import Fragments
 from matchms.typing import SpectrumType
 
 
 def select_by_mz(spectrum_in: SpectrumType, mz_from: float = 0.0,
-                 mz_to: float = 1000.0, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                 mz_to: float = 1000.0) -> SpectrumType:
     """Keep only peaks between mz_from and mz_to (keep if mz_from >= m/z >= mz_to).
 
     Parameters
     ----------
-    spectrum_in:
-        Input spectrum.
     mz_from:
         Set lower threshold for m/z peak positions. Default is 0.0.
     mz_to:
         Set upper threshold for m/z peak positions. Default is 1000.0.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with peaks within the specified mz range, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     assert mz_from <= mz_to, "'mz_from' should be smaller than or equal to 'mz_to'."
 
diff --git a/matchms/filtering/peak_processing/select_by_relative_intensity.py b/matchms/filtering/peak_processing/select_by_relative_intensity.py
index 712fc16c..55ccbc39 100644
--- a/matchms/filtering/peak_processing/select_by_relative_intensity.py
+++ b/matchms/filtering/peak_processing/select_by_relative_intensity.py
@@ -1,34 +1,24 @@
-from typing import Optional
 import numpy as np
 from matchms.Fragments import Fragments
 from matchms.typing import SpectrumType
 
 
 def select_by_relative_intensity(spectrum_in: SpectrumType, intensity_from: float = 0.0,
-                                 intensity_to: float = 1.0, clone: Optional[bool] = True) -> Optional[SpectrumType]:
+                                 intensity_to: float = 1.0) -> SpectrumType:
     """Keep only peaks within set relative intensity range (keep if
     intensity_from >= intensity >= intensity_to).
 
     Parameters
     ----------
-    spectrum_in:
-        Input spectrum.
     intensity_from:
         Set lower threshold for relative peak intensity. Default is 0.0.
     intensity_to:
         Set upper threshold for relative peak intensity. Default is 1.0.
-    clone:
-        Optionally clone the Spectrum.
-
-    Returns
-    -------
-    Spectrum or None
-        Spectrum with peaks within the relative intensity range, or `None` if not present.
     """
     if spectrum_in is None:
         return None
 
-    spectrum = spectrum_in.clone() if clone else spectrum_in
+    spectrum = spectrum_in.clone()
 
     assert intensity_from >= 0.0, "'intensity_from' should be larger than or equal to 0."
     assert intensity_to <= 1.0, "'intensity_to' should be smaller than or equal to 1.0."
diff --git a/matchms/importing/load_from_mgf.py b/matchms/importing/load_from_mgf.py
index f34aff7d..1a7bead3 100644
--- a/matchms/importing/load_from_mgf.py
+++ b/matchms/importing/load_from_mgf.py
@@ -1,12 +1,11 @@
 import os
-from pathlib import Path
 from typing import Generator, TextIO, Union
 from pyteomics.mgf import MGF
 from matchms.importing.parsing_utils import parse_spectrum_dict
 from matchms.Spectrum import Spectrum
 
 
-def load_from_mgf(filename: Union[str, Path, TextIO],
+def load_from_mgf(filename: Union[str, TextIO],
                   metadata_harmonization: bool = True) -> Generator[Spectrum, None, None]:
     """Load spectrum(s) from mgf file.
 
@@ -35,18 +34,14 @@ def load_from_mgf(filename: Union[str, Path, TextIO],
         Set to False if metadata harmonization to default keys is not desired.
         The default is True.
     """
-    if isinstance(filename, str) and not os.path.isfile(filename):
+    if not os.path.isfile(filename):
         raise FileNotFoundError(f"The specified file: {filename} doesn't exist.")
 
-    if isinstance(filename, Path):
-        filename = str(filename)  # pyteomics does not support pathlib.Path
-
     def parse_file():
         with MGF(filename, convert_arrays=1, encoding="utf-8") as reader:
             for pyteomics_spectrum in reader:
                 yield parse_spectrum_dict(
                     spectrum=pyteomics_spectrum,
-                    metadata_harmonization=metadata_harmonization,
-                )
+                    metadata_harmonization=metadata_harmonization)
 
     return parse_file()
diff --git a/matchms/importing/load_from_mzml.py b/matchms/importing/load_from_mzml.py
index 01898c8e..f7540177 100644
--- a/matchms/importing/load_from_mzml.py
+++ b/matchms/importing/load_from_mzml.py
@@ -1,5 +1,4 @@
-from pathlib import Path
-from typing import Generator, Union
+from typing import Generator
 import numpy as np
 from pyteomics.mzml import read
 from matchms.importing.parsing_utils import (parse_mzml_mzxml_metadata,
@@ -7,7 +6,7 @@ from matchms.importing.parsing_utils import (parse_mzml_mzxml_metadata,
 from matchms.Spectrum import Spectrum
 
 
-def load_from_mzml(filename: Union[str, Path], ms_level: int = 2,
+def load_from_mzml(filename: str, ms_level: int = 2,
                    metadata_harmonization: bool = True) -> Generator[Spectrum, None, None]:
     """Load spectrum(s) from mzml file.
 
@@ -34,9 +33,6 @@ def load_from_mzml(filename: Union[str, Path], ms_level: int = 2,
         Set to False if metadata harmonization to default keys is not desired.
         The default is True.
     """
-    if isinstance(filename, Path):
-        filename = str(filename)  # pyteomics does not support pathlib.Path
-
     with read(filename, dtype=dict) as reader:
         for pyteomics_spectrum in reader:
             if "ms level" in pyteomics_spectrum and pyteomics_spectrum["ms level"] == ms_level:
diff --git a/matchms/importing/load_from_mzxml.py b/matchms/importing/load_from_mzxml.py
index 0e9967cc..06bee882 100644
--- a/matchms/importing/load_from_mzxml.py
+++ b/matchms/importing/load_from_mzxml.py
@@ -1,5 +1,4 @@
-from pathlib import Path
-from typing import Generator, Union
+from typing import Generator
 import numpy as np
 from pyteomics.mzxml import read
 from matchms.importing.parsing_utils import (parse_mzml_mzxml_metadata,
@@ -7,7 +6,7 @@ from matchms.importing.parsing_utils import (parse_mzml_mzxml_metadata,
 from matchms.Spectrum import Spectrum
 
 
-def load_from_mzxml(filename: Union[str, Path], ms_level: int = 2,
+def load_from_mzxml(filename: str, ms_level: int = 2,
                     metadata_harmonization: bool = True) -> Generator[Spectrum, None, None]:
     """Load spectrum(s) from mzml file.
 
@@ -34,9 +33,6 @@ def load_from_mzxml(filename: Union[str, Path], ms_level: int = 2,
         Set to False if metadata harmonization to default keys is not desired.
         The default is True.
     """
-    if isinstance(filename, Path):
-        filename = str(filename)  # pyteomics does not support pathlib.Path
-
     with read(filename, dtype=dict) as reader:
         for pyteomics_spectrum in reader:
             if ("ms level" in pyteomics_spectrum and pyteomics_spectrum["ms level"] == ms_level
diff --git a/matchms/importing/load_from_usi.py b/matchms/importing/load_from_usi.py
index c7079c60..208d3e85 100644
--- a/matchms/importing/load_from_usi.py
+++ b/matchms/importing/load_from_usi.py
@@ -8,7 +8,7 @@ from ..Spectrum import Spectrum
 logger = logging.getLogger("matchms")
 
 
-def load_from_usi(usi: str, server: str = "https://metabolomics-usi.gnps2.org",
+def load_from_usi(usi: str, server: str = "https://metabolomics-usi.ucsd.edu",
                   metadata_harmonization: bool = True):
     """Load spectrum from metabolomics USI.
 
@@ -39,10 +39,6 @@ def load_from_usi(usi: str, server: str = "https://metabolomics-usi.gnps2.org",
 
     if response.status_code == 404:
         return None
-
-    if "application/json" not in response.headers.get("Content-Type"):
-        return None
-
     # Extract data and create Spectrum object
     try:
         spectral_data = response.json()
diff --git a/matchms/importing/load_spectra.py b/matchms/importing/load_spectra.py
index c0fb2efa..c9026a03 100644
--- a/matchms/importing/load_spectra.py
+++ b/matchms/importing/load_spectra.py
@@ -1,5 +1,4 @@
 import os
-from itertools import chain
 from typing import Generator, List, Optional, Union
 from matchms.importing import (load_from_json, load_from_mgf, load_from_msp,
                                load_from_mzml, load_from_mzxml,
@@ -58,4 +57,10 @@ def load_list_of_spectrum_files(spectrum_files: Union[List[str], str]
     spectrum_generators = [load_spectra(spectrum_file) for
                            spectrum_file in spectrum_files]
 
-    return chain.from_iterable(spectrum_generators)
+    def chain(*iterables):
+        """Combines multiple iterators (and generators) into a single iterator"""
+        # chain('ABC', 'DEF') --> A B C D E F
+        for it in iterables:
+            for element in it:
+                yield element
+    return chain(*spectrum_generators)
diff --git a/matchms/reference_spectra/__init__.py b/matchms/reference_spectra/__init__.py
new file mode 100644
index 00000000..e22637ab
--- /dev/null
+++ b/matchms/reference_spectra/__init__.py
@@ -0,0 +1,17 @@
+"""Submodule providing reference spectra for tests, examples and tutorials."""
+
+from .aspirin import aspirin
+from .cocaine import cocaine
+from .glucose import glucose
+from .hydroxy_cholesterol import hydroxy_cholesterol
+from .phenylalanine import phenylalanine
+from .salicin import salicin
+
+__all__ = [
+    "aspirin",
+    "cocaine",
+    "glucose",
+    "hydroxy_cholesterol",
+    "phenylalanine",
+    "salicin",
+]
diff --git a/matchms/reference_spectra/aspirin.py b/matchms/reference_spectra/aspirin.py
new file mode 100644
index 00000000..213b4915
--- /dev/null
+++ b/matchms/reference_spectra/aspirin.py
@@ -0,0 +1,84 @@
+"""Submodule providing a reference spectrum for aspirin."""
+
+import numpy as np
+from ..Spectrum import Spectrum
+
+
+ASPIRIN_PRECURSOR_MZ: float = 181.0490
+
+ASPIRIN_MZ: np.ndarray = np.array(
+    [
+        50.0149,
+        51.0228,
+        53.0385,
+        55.0177,
+        65.0384,
+        77.0383,
+        79.054,
+        80.0254,
+        81.0334,
+        91.0541,
+        92.0254,
+        93.0333,
+        94.0411,
+        95.049,
+        98.0361,
+        105.0333,
+        105.0445,
+        107.0489,
+        111.0439,
+        120.0203,
+        121.0282,
+        121.0394,
+        133.0282,
+        135.0438,
+        138.0308,
+        149.0231,
+        163.0386,
+        167.0337,
+        181.0491,
+    ]
+)
+
+ASPIRIN_INTENSITIES: np.ndarray = np.array(
+    [
+        49377.4,
+        53422.1,
+        454244.5,
+        57881.0,
+        1997532.0,
+        825848.2,
+        1153465.5,
+        96202.8,
+        58626.8,
+        44573.8,
+        394779.8,
+        1129287.8,
+        56357.2,
+        1654496.5,
+        72487.3,
+        707899.4,
+        1119356.4,
+        207437.4,
+        587441.8,
+        166384.0,
+        9695889.0,
+        2506571.2,
+        5824675.0,
+        6124332.0,
+        78621.8,
+        34285450.0,
+        18191732.0,
+        69049.3,
+        120675.9,
+    ]
+)
+
+
+def aspirin() -> Spectrum:
+    """Return a reference spectrum for aspirin."""
+    return Spectrum(
+        mz=ASPIRIN_MZ,
+        intensities=ASPIRIN_INTENSITIES,
+        metadata={"precursor_mz": ASPIRIN_PRECURSOR_MZ},
+    )
diff --git a/matchms/reference_spectra/cocaine.py b/matchms/reference_spectra/cocaine.py
new file mode 100644
index 00000000..eeecd633
--- /dev/null
+++ b/matchms/reference_spectra/cocaine.py
@@ -0,0 +1,44 @@
+"""Submodule providing a reference spectrum for cocaine."""
+
+import numpy as np
+from ..Spectrum import Spectrum
+
+
+COCAINE_PRECURSOR_MZ: float = 304.153137
+
+COCAINE_MZ: np.ndarray = np.array(
+    [
+        82.064789,
+        105.033249,
+        109.213745,
+        119.04921,
+        150.0914,
+        182.117676,
+        185.804688,
+        226.579071,
+        304.153137,
+    ]
+)
+
+COCAINE_INTENSITIES: np.ndarray = np.array(
+    [
+        13342.493164,
+        3264.133545,
+        1584.27478,
+        2382.930908,
+        3257.366211,
+        133504.296875,
+        1849.140137,
+        1391.734497,
+        86052.375,
+    ]
+)
+
+
+def cocaine() -> Spectrum:
+    """Return a reference spectrum for cocaine."""
+    return Spectrum(
+        mz=COCAINE_MZ,
+        intensities=COCAINE_INTENSITIES,
+        metadata={"precursor_mz": COCAINE_PRECURSOR_MZ},
+    )
diff --git a/matchms/reference_spectra/glucose.py b/matchms/reference_spectra/glucose.py
new file mode 100644
index 00000000..cec85518
--- /dev/null
+++ b/matchms/reference_spectra/glucose.py
@@ -0,0 +1,54 @@
+"""Submodule providing a reference spectrum for glucose."""
+
+import numpy as np
+from ..Spectrum import Spectrum
+
+
+GLUCOSE_PRECURSOR_MZ: float = 203.05
+
+GLUCOSE_MZ: np.ndarray = np.array(
+    [
+        82.952148,
+        105.270447,
+        112.789398,
+        121.208,
+        129.116699,
+        131.104095,
+        131.990692,
+        135.007935,
+        142.50119,
+        143.102905,
+        158.092255,
+        160.235291,
+        173.100464,
+        185.152679,
+    ]
+)
+
+GLUCOSE_INTENSITIES: np.ndarray = np.array(
+    [
+        798.858887,
+        1257.253418,
+        3923.249023,
+        1952.965454,
+        169.587341,
+        412.055176,
+        309.939514,
+        520.569153,
+        555.742432,
+        13786.814453,
+        1758.816406,
+        408.889771,
+        892.346924,
+        9220.535156,
+    ]
+)
+
+
+def glucose() -> Spectrum:
+    """Return a reference spectrum for glucose."""
+    return Spectrum(
+        mz=GLUCOSE_MZ,
+        intensities=GLUCOSE_INTENSITIES,
+        metadata={"precursor_mz": GLUCOSE_PRECURSOR_MZ},
+    )
diff --git a/matchms/reference_spectra/hydroxy_cholesterol.py b/matchms/reference_spectra/hydroxy_cholesterol.py
new file mode 100644
index 00000000..1125c65c
--- /dev/null
+++ b/matchms/reference_spectra/hydroxy_cholesterol.py
@@ -0,0 +1,288 @@
+"""Submodule providing a reference spectrum for hydroxy-cholesterol."""
+
+import numpy as np
+from ..Spectrum import Spectrum
+
+
+HYDROXY_CHOLESTEROL_PRECURSOR_MZ: float = 385.345
+
+HYDROXY_CHOLESTEROL_MZ: np.ndarray = np.array(
+    [
+        79.306831,
+        81.036896,
+        83.170624,
+        95.116501,
+        97.141312,
+        103.330635,
+        105.13884,
+        107.099525,
+        109.088669,
+        111.171356,
+        117.067558,
+        119.17308,
+        121.166855,
+        123.211304,
+        125.549042,
+        129.067566,
+        131.025848,
+        133.06012,
+        135.10881,
+        137.158203,
+        139.159882,
+        143.095245,
+        144.09375,
+        145.11795,
+        147.135376,
+        149.237,
+        151.340973,
+        155.078186,
+        156.218506,
+        157.128006,
+        159.123199,
+        160.329163,
+        161.145004,
+        163.198151,
+        165.245865,
+        167.088364,
+        169.130753,
+        170.001282,
+        171.115753,
+        173.205078,
+        175.229889,
+        177.121674,
+        179.243744,
+        181.121948,
+        182.870956,
+        185.176254,
+        187.167389,
+        188.135376,
+        189.40036,
+        191.186417,
+        193.249725,
+        197.140747,
+        199.207489,
+        201.150269,
+        202.018677,
+        203.189331,
+        205.19397,
+        207.164642,
+        209.172241,
+        210.234711,
+        211.334076,
+        213.274597,
+        214.419525,
+        215.139832,
+        217.144775,
+        218.287445,
+        219.207062,
+        221.182129,
+        223.02652,
+        224.174591,
+        225.354797,
+        227.09613,
+        229.292114,
+        231.228241,
+        233.224274,
+        239.40976,
+        241.226135,
+        243.170807,
+        245.26358,
+        247.416382,
+        249.43924,
+        251.274628,
+        253.427612,
+        255.29483,
+        257.357147,
+        259.194214,
+        261.212494,
+        263.759247,
+        267.261414,
+        269.225983,
+        271.266144,
+        272.015472,
+        273.283508,
+        274.167114,
+        283.198181,
+        285.315887,
+        287.210297,
+        288.743622,
+        289.402252,
+        291.233917,
+        293.318817,
+        295.074127,
+        297.280762,
+        299.349792,
+        301.309204,
+        303.264313,
+        305.25528,
+        309.267731,
+        311.262543,
+        313.286377,
+        315.270203,
+        324.4086,
+        325.427856,
+        327.317963,
+        327.939636,
+        329.279388,
+        338.460541,
+        339.459991,
+        340.288177,
+        341.369415,
+        343.326355,
+        349.281647,
+        354.272034,
+        357.45163,
+        365.516479,
+        367.329041,
+        368.233795,
+        368.874878,
+        384.32431,
+        385.305664,
+        386.437317,
+    ]
+)
+
+HYDROXY_CHOLESTEROL_INTENSITIES: np.ndarray = np.array(
+    [
+        4.979912,
+        22.765455,
+        16.608736,
+        84.772972,
+        70.130226,
+        11.714973,
+        31.981926,
+        54.602894,
+        91.455025,
+        46.116692,
+        37.930031,
+        74.307091,
+        41.617023,
+        54.827194,
+        3.832052,
+        68.119186,
+        102.478645,
+        114.723343,
+        107.749023,
+        12.766851,
+        6.991966,
+        17.36504,
+        16.665106,
+        121.05883,
+        66.699089,
+        78.691193,
+        21.242491,
+        17.17906,
+        18.209969,
+        16.721523,
+        220.098206,
+        7.839384,
+        180.722809,
+        176.15947,
+        85.956116,
+        18.90317,
+        36.619061,
+        14.848515,
+        26.946314,
+        195.633636,
+        74.910393,
+        184.579041,
+        174.899841,
+        63.308514,
+        11.29303,
+        37.871227,
+        325.631165,
+        7.312701,
+        98.873009,
+        323.946899,
+        71.510201,
+        16.049942,
+        64.065384,
+        192.031296,
+        14.154707,
+        120.749435,
+        368.516785,
+        226.5923,
+        28.575651,
+        15.240299,
+        6.454416,
+        176.759491,
+        10.867487,
+        91.041054,
+        85.689346,
+        7.409761,
+        365.31958,
+        28.595486,
+        40.717285,
+        11.677838,
+        11.328114,
+        145.452393,
+        80.116074,
+        263.121277,
+        252.111954,
+        11.013158,
+        319.304626,
+        56.70892,
+        139.755737,
+        57.950039,
+        23.482685,
+        14.781034,
+        22.184134,
+        454.479736,
+        154.093491,
+        368.519592,
+        56.954346,
+        42.744823,
+        19.643261,
+        88.461494,
+        94.910172,
+        16.442837,
+        413.641632,
+        7.44519,
+        41.749924,
+        87.47644,
+        128.763336,
+        64.673119,
+        14.391298,
+        13.502331,
+        75.397293,
+        49.663109,
+        169.150269,
+        12.272851,
+        152.579407,
+        113.564987,
+        30.968838,
+        16.352489,
+        310.930267,
+        41.870014,
+        20.039595,
+        72.416031,
+        155.088058,
+        234.508896,
+        24.093281,
+        83.271744,
+        53.767117,
+        85.915543,
+        40.059822,
+        35.149338,
+        25.068996,
+        30.07332,
+        9.299104,
+        60.239254,
+        6.935501,
+        14848.887695,
+        179.36615,
+        46.81424,
+        46.517662,
+        447.72229,
+        12.113778,
+    ]
+)
+
+
+def hydroxy_cholesterol() -> Spectrum:
+    """Return a reference spectrum for hydroxy-cholesterol."""
+    return Spectrum(
+        mz=HYDROXY_CHOLESTEROL_MZ,
+        intensities=HYDROXY_CHOLESTEROL_INTENSITIES,
+        metadata={"precursor_mz": HYDROXY_CHOLESTEROL_PRECURSOR_MZ},
+    )
diff --git a/matchms/reference_spectra/phenylalanine.py b/matchms/reference_spectra/phenylalanine.py
new file mode 100644
index 00000000..97dc263b
--- /dev/null
+++ b/matchms/reference_spectra/phenylalanine.py
@@ -0,0 +1,72 @@
+"""Submodule providing a reference spectrum for phenylalanine."""
+
+import numpy as np
+from ..Spectrum import Spectrum
+
+
+PHENYLANINE_PRECURSOR_MZ: float = 166.086
+
+PHENYLANINE_MZ: np.ndarray = np.array(
+    [
+        84.329651,
+        95.261452,
+        104.255539,
+        107.151161,
+        108.493408,
+        120.354172,
+        121.332741,
+        122.174088,
+        123.061447,
+        123.876312,
+        125.26976,
+        127.950974,
+        131.030273,
+        131.898819,
+        132.987488,
+        133.966949,
+        135.217804,
+        136.683533,
+        138.050446,
+        148.049011,
+        149.007416,
+        149.634232,
+        150.754486,
+    ]
+)
+
+PHENYLANINE_INTENSITIES: np.ndarray = np.array(
+    [
+        802.63324,
+        527.747314,
+        232.556427,
+        297.472168,
+        113.401199,
+        8457614.0,
+        5223.298828,
+        1784.401855,
+        733.603821,
+        514.92334,
+        680.641602,
+        341.421326,
+        44541.625,
+        596.891602,
+        781.120422,
+        2167.02002,
+        130.054764,
+        264.539215,
+        1620.135986,
+        55389.789062,
+        364218.59375,
+        4676.80957,
+        590.623291,
+    ]
+)
+
+
+def phenylalanine() -> Spectrum:
+    """Return a reference spectrum for phenylalanine."""
+    return Spectrum(
+        mz=PHENYLANINE_MZ,
+        intensities=PHENYLANINE_INTENSITIES,
+        metadata={"precursor_mz": PHENYLANINE_PRECURSOR_MZ},
+    )
diff --git a/matchms/reference_spectra/salicin.py b/matchms/reference_spectra/salicin.py
new file mode 100644
index 00000000..c665806a
--- /dev/null
+++ b/matchms/reference_spectra/salicin.py
@@ -0,0 +1,68 @@
+"""Submodule providing a reference spectrum for salicin."""
+
+import numpy as np
+from ..Spectrum import Spectrum
+
+
+SALICIN_PRECURSOR_MZ: float = 321.0750
+
+SALICIN_MZ: np.ndarray = np.array(
+    [
+        52.27001,
+        55.74109,
+        57.76688,
+        60.32213,
+        64.12009,
+        82.39278,
+        87.02966,
+        91.02013,
+        92.37563,
+        93.13435,
+        112.07272,
+        116.92837,
+        123.04468,
+        138.61075,
+        140.95815,
+        146.96143,
+        174.95708,
+        184.95059,
+        238.55797,
+        305.44812,
+        321.07443,
+    ]
+)
+
+SALICIN_INTENSITIES: np.ndarray = np.array(
+    [
+        2309.0,
+        1977.0,
+        2003.0,
+        2102.0,
+        2177.0,
+        2127.0,
+        2376.0,
+        2380.0,
+        2703.0,
+        2200.0,
+        2232.0,
+        2923.0,
+        2173.0,
+        2257.0,
+        2367.0,
+        4363.0,
+        31526.0,
+        5119.0,
+        2252.0,
+        2233.0,
+        22755.0,
+    ]
+)
+
+
+def salicin() -> Spectrum:
+    """Return a reference spectrum for salicin."""
+    return Spectrum(
+        mz=SALICIN_MZ,
+        intensities=SALICIN_INTENSITIES,
+        metadata={"precursor_mz": SALICIN_PRECURSOR_MZ},
+    )
diff --git a/matchms/similarity/BaseSimilarity.py b/matchms/similarity/BaseSimilarity.py
index 1dbb9ccb..0ab33c46 100644
--- a/matchms/similarity/BaseSimilarity.py
+++ b/matchms/similarity/BaseSimilarity.py
@@ -2,7 +2,6 @@ from abc import abstractmethod
 from typing import List
 import numpy as np
 from sparsestack import StackedSparseArray
-from tqdm import tqdm
 from matchms.typing import SpectrumType
 
 
@@ -65,13 +64,12 @@ class BaseSimilarity:
         n_cols = len(queries)
 
         if is_symmetric and n_rows != n_cols:
-            raise ValueError(f"Found unequal number of spectra {n_rows} and {n_cols} while `is_symmetric` is True.")
+            raise ValueError(f"Found unequal number of spectra {n_rows} and {n_cols} in while `is_symmetric` is True.")
 
         idx_row = []
         idx_col = []
         scores = []
-        # Wrap the outer loop with tqdm to track progress
-        for i_ref, reference in enumerate(tqdm(references[:n_rows], desc="Calculating similarities")):
+        for i_ref, reference in enumerate(references[:n_rows]):
             if is_symmetric and self.is_commutative:
                 for i_query, query in enumerate(queries[i_ref:n_cols], start=i_ref):
                     score = self.pair(reference, query)
@@ -130,8 +128,7 @@ class BaseSimilarity:
 
         assert idx_row.shape == idx_col.shape, "col and row indices must be of same shape"
         scores = np.zeros((len(idx_row)), dtype=self.score_datatype)  # TODO: switch to sparse matrix
-        # Use tqdm to track progress through the indices
-        for i, row in enumerate(tqdm(idx_row, desc="Calculating sparse similarities")):
+        for i, row in enumerate(idx_row):
             col = idx_col[i]
             scores[i] = self.pair(references[row], queries[col])
         return scores
diff --git a/pyproject.toml b/pyproject.toml
index 4dd7b9ca..4fe93e90 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -54,7 +54,7 @@ pytest = "^7.4.0"
 pytest-cov = "^4.1.0"
 yapf = "^0.40.1"
 testfixtures = "^7.1.0"
-twine = "^6.1.0"
+twine = "^5.1.0"
 black = "^23.7.0"
 poetry-bumpversion = "^0.3.1"
 


Test patch:
diff --git a/tests/exporting/test_save_as_mgf.py b/tests/exporting/test_save_as_mgf.py
index ad0433a2..7c3c4ee1 100644
--- a/tests/exporting/test_save_as_mgf.py
+++ b/tests/exporting/test_save_as_mgf.py
@@ -28,13 +28,10 @@ def test_save_as_mgf_single_spectrum():
     # Write to test file
     with tempfile.TemporaryDirectory() as d:
         filename = os.path.join(d, "test.mgf")
-        filename2 = os.path.join(d, "test2.mgf")
         save_as_mgf(spectrum, filename)
-        save_as_mgf(spectrum, filename2, file_mode="w")
 
         # test if file exists
         assert os.path.isfile(filename)
-        assert os.path.isfile(filename2)
 
         # Test if content of mgf file is correct
         with open(filename, "r", encoding="utf-8") as f:
diff --git a/tests/filtering/test_all_filter_order.py b/tests/filtering/test_all_filter_order.py
index c8a6e352..b10f7b33 100644
--- a/tests/filtering/test_all_filter_order.py
+++ b/tests/filtering/test_all_filter_order.py
@@ -67,17 +67,11 @@ def test_all_filter_order(early_filters: List[Callable], later_filters: List[Cal
     """Tests if early_filter is run before later_filter"""
     for early_filter in early_filters:
         for later_filter in later_filters:
-            early_filter_index = None
-            later_filter_index = None
-
             for filter_index, filter_function in enumerate(ALL_FILTERS):
                 if early_filter == filter_function:
                     early_filter_index = filter_index
                 if later_filter == filter_function:
                     later_filter_index = filter_index
-
-            assert early_filter_index is not None, f"{early_filter.__name__} not found in ALL_FILTERS"
-            assert later_filter_index is not None, f"{later_filter.__name__} not found in ALL_FILTERS"
             assert later_filter_index > early_filter_index, \
                 f"The filter {early_filter.__name__} should be before {later_filter.__name__}"
 
diff --git a/tests/filtering/test_normalize_intensities.py b/tests/filtering/test_normalize_intensities.py
index 4b149525..e5713d62 100644
--- a/tests/filtering/test_normalize_intensities.py
+++ b/tests/filtering/test_normalize_intensities.py
@@ -52,9 +52,8 @@ def test_normalize_intensities_all_zeros(caplog):
 
     spectrum = normalize_intensities(spectrum_in)
 
-    assert len(spectrum.peaks.intensities) == 0, "Expected no peak intensities."
-    assert len(spectrum.peaks.mz) == 0, "Expected no m/z values. "
-    msg = "Peaks of spectrum with all peak intensities <= 0 were deleted."
+    assert spectrum is None, "Expected spectrum to be set to None."
+    msg = "Spectrum with all peak intensities <= 0 was set to None."
     assert msg in caplog.text, "Expected log message."
 
 
diff --git a/tests/filtering/test_spectrum_processor.py b/tests/filtering/test_spectrum_processor.py
index 6ce2f705..0ddffcf9 100644
--- a/tests/filtering/test_spectrum_processor.py
+++ b/tests/filtering/test_spectrum_processor.py
@@ -1,4 +1,3 @@
-import logging
 import os
 import re
 import numpy as np
@@ -44,23 +43,20 @@ def test_filter_sorting_and_output():
     actual_filters = [x.__name__ for x in processing.filters]
     assert actual_filters == expected_filters
     # 2nd way to access the filter names via processing_steps attribute:
-    expected_filters = [
-        ('make_charge_int', {'clone': True}),
-        ('derive_adduct_from_name', {'remove_adduct_from_name': True, 'clone': True}),
-        ('interpret_pepmass', {'clone': True}),
-        ('derive_ionmode', {'clone': True}),
-        ('correct_charge', {'clone': True}),
-    ]
-
+    expected_filters = ['make_charge_int',
+                        ('derive_adduct_from_name', {'remove_adduct_from_name': True}),
+                        'interpret_pepmass',
+                        'derive_ionmode',
+                        'correct_charge']
     assert processing.processing_steps == expected_filters
 
 
 @pytest.mark.parametrize("filter_step, expected", [
-    [("add_parent_mass", {'estimate_from_adduct': False, 'clone': True}),
+    [("add_parent_mass", {'estimate_from_adduct': False}),
      ('add_parent_mass', {'estimate_from_adduct': False, 'overwrite_existing_entry': False,
-                          'estimate_from_charge': True, 'clone': True})],
+                          'estimate_from_charge': True})],
     ["derive_adduct_from_name",
-     ('derive_adduct_from_name', {'remove_adduct_from_name': True, 'clone': True})],
+     ('derive_adduct_from_name', {'remove_adduct_from_name': True})],
     [("require_correct_ionmode", {"ion_mode_to_keep": "both"}),
      ("require_correct_ionmode", {"ion_mode_to_keep": "both"})],
 ])
@@ -89,9 +85,8 @@ def test_string_output():
                                             "derive_ionmode",
                                             "correct_charge",
                                             ])
-    expected_str = "Processing steps:\n- - make_charge_int\n  - clone: true\n- - interpret_pepmass\n  - clone: true" \
-                   "\n- - derive_ionmode\n  - clone: true\n- - correct_charge\n  - clone: true\n"
-
+    expected_str = "Processing steps:\n- make_charge_int\n- interpret_pepmass" \
+                   "\n- derive_ionmode\n- correct_charge\n"
     assert str(processing) == expected_str
 
 
@@ -108,13 +103,12 @@ def test_filter_spectra(spectra):
                                            "derive_ionmode",
                                            "correct_charge",
                                            ])
-    spectra, report = processor.process_spectra(spectra)
+    spectra, _ = processor.process_spectra(spectra)
 
     assert len(spectra) == 3
     actual_masses = [s.get("precursor_mz") for s in spectra]
     expected_masses = [100, 102, 104]
     assert actual_masses == expected_masses
-    assert report is None
 
 
 def test_filter_spectra_report(spectra):
@@ -124,7 +118,7 @@ def test_filter_spectra_report(spectra):
                                            "correct_charge",
                                            ])
     processor.parse_and_add_filter(filter_description=("require_minimum_number_of_peaks", {"n_required": 2}))
-    spectra, report = processor.process_spectra(spectra, create_report=True)
+    spectra, report = processor.process_spectra(spectra)
     assert len(spectra) == 2
     actual_masses = [s.get("precursor_mz") for s in spectra]
     expected_masses = [100, 102]
@@ -163,43 +157,12 @@ def test_processing_report_class(spectra):
     assert re.search(expected_repr_parts, repr(processing_report)) is not None
 
 
-def test_filter_report_filter_does_not_support_cloning(spectra, caplog):
+def test_adding_custom_filter(spectra):
     def nonsense_inchikey(s):
         s_in = s.clone()
         s_in.set("inchikey", "NONSENSE")
         return s_in
 
-    processor = SpectrumProcessor(filters=["make_charge_int",
-                                           "interpret_pepmass",
-                                           "derive_ionmode",
-                                           "correct_charge",
-                                           ])
-    processor.parse_and_add_filter(nonsense_inchikey)
-
-    with caplog.at_level(logging.ERROR):
-        spectra, report = processor.process_spectra(spectra, create_report=True)
-
-    assert report is not None
-    assert "Processing report is set to True, but the filter function nonsense_inchikey does not support cloning." in caplog.text
-
-
-def test_filter_no_report_filter_skip_cloning(spectra):
-    def test_filter(s, clone=True):
-        assert clone is False, f"Expected clone=False in Filter, but got {clone}"
-        return s
-
-    processor = SpectrumProcessor(filters=())
-    processor.parse_and_add_filter(test_filter)
-    spectra, report = processor.process_spectra(spectra, create_report=False)
-    assert report is None
-
-
-def test_adding_custom_filter(spectra):
-    def nonsense_inchikey(s, clone=True):
-        s_in = s.clone() if clone else s
-        s_in.set("inchikey", "NONSENSE")
-        return s_in
-
     processor = SpectrumProcessor(filters=["make_charge_int",
                                            "interpret_pepmass",
                                            "derive_ionmode",
@@ -208,7 +171,7 @@ def test_adding_custom_filter(spectra):
     processor.parse_and_add_filter(nonsense_inchikey)
     filters = processor.filters
     assert filters[-1].__name__ == "nonsense_inchikey"
-    spectra, report = processor.process_spectra(spectra, create_report=True)
+    spectra, report = processor.process_spectra(spectra)
     assert report.counter_number_processed == 3
     assert report.counter_changed_metadata == {'make_charge_int': 2, 'interpret_pepmass': 3,
                                                'derive_ionmode': 3, 'nonsense_inchikey': 3}
@@ -216,8 +179,8 @@ def test_adding_custom_filter(spectra):
 
 
 def test_adding_custom_filter_with_parameters(spectra):
-    def nonsense_inchikey_multiple(s, number, clone=True):
-        s_in = s.clone() if clone else s
+    def nonsense_inchikey_multiple(s, number):
+        s_in = s.clone()
         s_in.set("inchikey", number * "NONSENSE")
         return s_in
 
@@ -229,7 +192,7 @@ def test_adding_custom_filter_with_parameters(spectra):
     processor.parse_and_add_filter((nonsense_inchikey_multiple, {"number": 2}))
     filters = processor.filters
     assert filters[-1].__name__ == "nonsense_inchikey_multiple"
-    spectra, report = processor.process_spectra(spectra, create_report=True)
+    spectra, report = processor.process_spectra(spectra)
     assert report.counter_number_processed == 3
     assert report.counter_changed_metadata == {'make_charge_int': 2, 'interpret_pepmass': 3,
                                                'derive_ionmode': 3, 'nonsense_inchikey_multiple': 3}
@@ -279,8 +242,7 @@ def test_add_matchms_filter_in_position():
 
 
 def test_add_custom_filter_with_parameters(spectra):
-    def nonsense_inchikey_multiple(s, number, clone=True):
-        s = s.clone() if clone else s
+    def nonsense_inchikey_multiple(s, number):
         s.set("inchikey", number * "NONSENSE")
         return s
 
@@ -293,7 +255,7 @@ def test_add_custom_filter_with_parameters(spectra):
     filters = processor.filters
 
     assert filters[-1].__name__ == "nonsense_inchikey_multiple"
-    spectra, _ = processor.process_spectra(spectra, create_report=True)
+    spectra, _ = processor.process_spectra(spectra)
     assert spectra[0].get("inchikey") == "NONSENSENONSENSE", "Custom filter not executed properly"
 
 
@@ -316,7 +278,7 @@ def test_add_matchms_filter(filter_description, spectra):
 
 
 @pytest.mark.parametrize("filter_description", [
-    ("derive_adduct_from_name", {"remove_adduct_from_name": False, "clone": True}),
+    ("derive_adduct_from_name", {"remove_adduct_from_name": False}),
 ])
 def test_add_duplicated_filter_to_existing_pipeline(filter_description):
     """Tests if adding a filter that is already in the basic pipeline is overwritten and not duplicated"""
@@ -333,17 +295,16 @@ def test_add_filter_twice():
     processor = SpectrumProcessor(filters=())
     processor.parse_and_add_filter(("derive_adduct_from_name", {"remove_adduct_from_name": False}))
     processor.parse_and_add_filter("derive_adduct_from_name")
-    assert processor.processing_steps == [("derive_adduct_from_name", {"remove_adduct_from_name": True, 'clone': True})]
+    assert processor.processing_steps == [("derive_adduct_from_name", {"remove_adduct_from_name": True})]
 
 
 def test_add_all_filter_types(spectra):
-    def nonsense_inchikey_multiple(s, number, clone=True):
-        s = s.clone() if clone else s
+    def nonsense_inchikey_multiple(s, number):
         s.set("inchikey", number * "NONSENSE")
         return s
 
-    def nonsense_inchikey(s, clone=True):
-        s_in = s.clone() if clone else s
+    def nonsense_inchikey(s):
+        s_in = s.clone()
         s_in.set("inchikey", "NONSENSE")
         return s_in
 
diff --git a/tests/importing/test_load_from_mgf.py b/tests/importing/test_load_from_mgf.py
index 8323086c..26596417 100644
--- a/tests/importing/test_load_from_mgf.py
+++ b/tests/importing/test_load_from_mgf.py
@@ -1,6 +1,4 @@
 import os
-from io import StringIO
-from pathlib import Path
 import pytest
 from matchms import Spectrum
 from matchms.importing import load_from_mgf
@@ -15,101 +13,7 @@ def test_load_from_mgf_using_filepath():
     assert len(spectra) > 0
     assert isinstance(spectra[0], Spectrum)
 
-    spectra_file_path = Path(module_root).joinpath("testdata", "pesticides.mgf")
-    spectra = list(load_from_mgf(spectra_file_path))
-
-    assert len(spectra) > 0
-    assert isinstance(spectra[0], Spectrum)
-
 
 def test_load_missing_mgf_raises():
     with pytest.raises(FileNotFoundError):
-        load_from_mgf("does-not-exist.mgf")
-
-
-def test_load_from_stream():
-    spectra = list(load_from_mgf(TEXT_IO))
-
-    assert len(spectra) > 0
-    assert isinstance(spectra[0], Spectrum)
-
-
-TEXT_IO = StringIO(
-    """
-BEGIN IONS
-PEPMASS=183.057
-CHARGE=1
-MSLEVEL=2
-SOURCE_INSTRUMENT= -Q-Exactive Plus Orbitrap Res 70k
-FILENAME=Pesticide_Mix6_neg.mzXML
-SEQ=*..*
-IONMODE=negative
-ORGANISM=GNPS-COLLECTIONS-PESTICIDES-NEGATIVE
-NAME=Pesticide6_Fuberidazole_C11H8N2O_2-(2-Furyl)-1H-benzimidazole M-H
-PI=Dorrestein/Touboul
-DATACOLLECTOR=lfnothias
-SMILES=C1=CC=C2C(=C1)NC(=N2)C3=CC=CO3
-INCHI=InChI=1S/C11H8N2O/c1-2-5-9-8(4-1)12-11(13-9)10-6-3-7-14-10/h1-7H,(H,12,13)
-INCHIAUX=N/A
-PUBMED=n/a
-SUBMITUSER=mwang87
-TAGS=
-LIBRARYQUALITY=1
-SPECTRUMID=CCMSLIB00001058235
-SCANS=675
-70.786774	213.612045
-72.976173	241.782242
-73.493057	210.330109
-73.515923	211.937332
-74.17305	209.306686
-75.004799	313.5
-77.80809	210.065475
-82.050003	216.289841
-82.620819	261.580231
-82.860512	222.143372
-88.244919	209.090591
-89.454147	229.945343
-94.881096	219.268311
-94.917038	10964.588867
-94.918587	462.001892
-94.993851	322.640625
-102.743492	237.246567
-106.645241	249.806686
-106.876747	269.230896
-109.907501	269.221008
-112.186974	237.601974
-112.985817	2100.576172
-113.004906	236.479034
-115.000427	1164.228882
-115.333664	267.86319
-116.995949	5871.84668
-117.046104	1942.958862
-117.763412	227.911606
-122.933907	268.506836
-125.587662	259.168152
-126.956421	319.40094
-133.029556	431.949585
-133.420456	231.658493
-133.435806	278.857513
-136.894592	413.464294
-138.90712	4373.975098
-138.965378	330.018127
-141.046158	365.30246
-142.99292	855.966187
-142.995346	1030.517456
-146.785355	272.870209
-154.053802	3683.994141
-154.951416	443.910065
-154.992584	1055.799194
-155.061676	147161.03125
-163.001526	2383.76001
-170.366013	283.286346
-182.987579	1709.164062
-183.007996	5187.443359
-183.056702	285898.9375
-183.121933	448.362885
-190.211334	244.807159
-202.308212	327.976257
-END IONS
-    """
-)
+        load_from_mgf('does-not-exist.mgf')
diff --git a/tests/importing/test_load_from_mzml.py b/tests/importing/test_load_from_mzml.py
index a00b23b6..90ea07fe 100644
--- a/tests/importing/test_load_from_mzml.py
+++ b/tests/importing/test_load_from_mzml.py
@@ -1,16 +1,12 @@
 import os
-from pathlib import Path
-import pytest
 from matchms.importing import load_from_mzml
 
 
-@pytest.mark.parametrize("mzml_file", [
-    (os.path.join(os.path.dirname(__file__), "..", "testdata", "testdata.mzml")),
-    (Path(os.path.join(os.path.dirname(__file__), "..", "testdata", "testdata.mzml")))
-])
-def test_load_from_mzml(mzml_file):
+def test_load_from_mzml():
     """Test parsing of mzml file to spectrum objects"""
 
+    module_root = os.path.join(os.path.dirname(__file__), "..")
+    mzml_file = os.path.join(module_root, "testdata", "testdata.mzml")
     spectra = list(load_from_mzml(mzml_file))
 
     assert len(spectra) == 10, "Expected 10 spectra."
diff --git a/tests/importing/test_load_from_mzxml.py b/tests/importing/test_load_from_mzxml.py
index b2510a77..0aae385e 100644
--- a/tests/importing/test_load_from_mzxml.py
+++ b/tests/importing/test_load_from_mzxml.py
@@ -1,16 +1,12 @@
 import os
-from pathlib import Path
-import pytest
 from matchms.importing import load_from_mzxml
 
 
-@pytest.mark.parametrize("mzxml_file", [
-    (os.path.join(os.path.dirname(__file__), "..", "testdata", "testdata.mzXML")),
-    (Path(os.path.join(os.path.dirname(__file__), "..", "testdata", "testdata.mzXML")))
-])
-def test_load_from_mzxml(mzxml_file):
+def test_load_from_mzxml():
     """Test parsing of mzxml file to spectrum objects"""
 
+    module_root = os.path.join(os.path.dirname(__file__), "..")
+    mzxml_file = os.path.join(module_root, "testdata", "testdata.mzXML")
     spectrum = next(load_from_mzxml(mzxml_file))
 
     assert len(list(load_from_mzxml(mzxml_file))) == 1, "Expected single spectrum"
diff --git a/tests/importing/test_load_from_usi.py b/tests/importing/test_load_from_usi.py
index cc25da2a..c2e6e270 100644
--- a/tests/importing/test_load_from_usi.py
+++ b/tests/importing/test_load_from_usi.py
@@ -8,10 +8,8 @@ from ..builder_Spectrum import SpectrumBuilder
 def test_normal(mock_get):
     mock_get.return_value = Mock(ok=True)
     mock_get.return_value.json.return_value = {"peaks": [[1., 2.], [3., 4.]]}
-    mock_get.return_value.headers.get = Mock(return_value="application/json")
-
     spec = load_from_usi("something")
-    expected_metadata = {"usi": "something", "server": "https://metabolomics-usi.gnps2.org", "precursor_mz": None}
+    expected_metadata = {"usi": "something", "server": "https://metabolomics-usi.ucsd.edu", "precursor_mz": None}
     expected = SpectrumBuilder().with_mz(np.array([1., 3.])).with_intensities(
         np.array([2., 4.])).with_metadata(expected_metadata,
                                           metadata_harmonization=True).build()
@@ -23,8 +21,6 @@ def test_404(mock_get):
     mock_get.return_value = Mock(ok=True)
     mock_get.return_value.status_code = 404
     mock_get.return_value.json.return_value = None
-    mock_get.return_value.headers.get = Mock(return_value="application/json")
-
     spec = load_from_usi("something")
     expected = None
     assert spec == expected
@@ -34,20 +30,6 @@ def test_404(mock_get):
 def test_no_peaks(mock_get):
     mock_get.return_value = Mock(ok=True)
     mock_get.return_value.json.return_value = {"peaks": []}
-    mock_get.return_value.headers.get = Mock(return_value="application/json")
-
     spec = load_from_usi("something")
     expected = None
     assert spec == expected
-
-
-def test_api_call():
-    usi = "mzspec:MASSBANK::accession:SM858102" # taken from load_from_usi docstring
-
-    spec = load_from_usi(usi)
-    
-    assert spec is not None
-    assert hasattr(spec, "peaks")
-    assert len(spec.peaks.mz) > 0
-    assert "usi" in spec.metadata
-    assert spec.metadata["usi"] == usi
diff --git a/tests/test_reference_spectra.py b/tests/test_reference_spectra.py
new file mode 100644
index 00000000..4eee8380
--- /dev/null
+++ b/tests/test_reference_spectra.py
@@ -0,0 +1,46 @@
+"""Simple test submodule to verify that all reference spectra can be instantiated."""
+
+from matchms.reference_spectra import (
+    aspirin,
+    cocaine,
+    glucose,
+    hydroxy_cholesterol,
+    phenylalanine,
+    salicin,
+)
+
+
+def test_aspirin():
+    """Test if aspirin reference spectrum can be instantiated."""
+    aspirin_spectrum = aspirin()
+    assert aspirin_spectrum is not None
+
+
+def test_cocaine():
+    """Test if cocaine reference spectrum can be instantiated."""
+    cocaine_spectrum = cocaine()
+    assert cocaine_spectrum is not None
+
+
+def test_glucose():
+    """Test if glucose reference spectrum can be instantiated."""
+    glucose_spectrum = glucose()
+    assert glucose_spectrum is not None
+
+
+def test_hydroxy_cholesterol():
+    """Test if hydroxy-cholesterol reference spectrum can be instantiated."""
+    hydroxy_cholesterol_spectrum = hydroxy_cholesterol()
+    assert hydroxy_cholesterol_spectrum is not None
+
+
+def test_phenylalanine():
+    """Test if phenylalanine reference spectrum can be instantiated."""
+    phenylalanine_spectrum = phenylalanine()
+    assert phenylalanine_spectrum is not None
+
+
+def test_salicin():
+    """Test if salicin reference spectrum can be instantiated."""
+    salicin_spectrum = salicin()
+    assert salicin_spectrum is not None