diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1735d5bf687c4ed56a0a05c17214877389fb107d..e7aa023eead2a3518860c2af9e7f81421764a4b8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,7 +19,7 @@ PEP8:
   stage: linting
   script:
   - pip install flake8
-  - flake8 --count .
+  - flake8 --count --max-line-length=88 .
 
 Pylint:
   stage: linting
@@ -27,6 +27,19 @@ Pylint:
   - pip install pylint
   - find . -type f -name '*.py' | xargs pylint -rn --rcfile='plotid/.pylintrc'  # Find all python files and check the code with pylint
 
+Autoformatting:
+  stage: linting
+  script:
+  - pip install black
+  - black --check --verbose --diff --color .
+
+Typechecker:
+  stage: linting
+  script:
+  - pip install mypy
+  - mypy --ignore-missing-imports --strict plotid tests examples
+  allow_failure: true
+
 test:
   stage: testing
   tags:
@@ -53,7 +66,7 @@ sast:
   before_script:
       - echo "No before script pls"
   variables:
-    SAST_EXCLUDED_PATHS: spec, test, tmp
+    SAST_EXCLUDED_PATHS: spec, tests, tmp
   stage: security
   tags:
   - docker
diff --git a/README.md b/README.md
index 899d1357177c8d4157a7027ba764f0babe6967fb..e7c6c38a86a58c0a85b2521c55126b1a8c2fc868 100644
--- a/README.md
+++ b/README.md
@@ -59,24 +59,26 @@ Optional parameters can be used to customize the tag process.
 - *prefix* : str, optional
         Will be added as prefix to the ID.
 - *id_method* : str, optional
-        id_method for creating the ID. Create an ID by Unix time is referenced as 'time', create a random ID with id_method='random'. The default is 'time'.
+        id_method for creating the ID. Create an ID by Unix time is referenced as "time", create a random ID with id_method="random". The default is "time".
 - *location* : string, optional
-        Location for ID to be displayed on the plot. Default is 'east'.
+        Location for ID to be displayed on the plot. Default is "east".
 - *qrcode* : boolean, optional
         Experimental support for encoding the ID in a QR Code.
+- *id_on_plot* : boolean, optional
+        Print ID on the plot. Default: True.
 
 Example:  
 ```python
 FIG1 = plt.figure()  
 FIG2 = plt.figure()   
 FIGS_AS_LIST = [FIG1, FIG2]  
-FIGS_AND_IDS = tagplot(FIGS_AS_LIST, 'matplotlib', prefix='XY23_', id_method='random', location='west')
+FIGS_AND_IDS = tagplot(FIGS_AS_LIST, "matplotlib", prefix="XY23_", id_method="random", location="west")
 ```
 
 
 ### publish()
 Save plot, data and measuring script. It is possible to export multiple figures at once.
-`publish(figs_and_ids, src_datapath, dst_path, plot_name)`  
+`publish(figs_and_ids, src_datapath, dst_path)`  
   
 - *figs_and_ids* must be a PlotIDTransfer object. Therefore, it can be directly passed from tagplot() to publish().  
 - *src_datapath* specifies the path to (raw) data that should be published. It can be a string or a list of strings that specifies all files and directories which will be published.  
@@ -88,15 +90,17 @@ Optional parameters can be used to customize the publish process.
         Method how the data should be stored. Available options:  
   - *centralized*: The raw data will copied only once. All other plots will reference this data via sym link.
   - *individual*: The complete raw data will be copied to a folder for every plot, respectively.
+- *plot_names* : str or list of str, optional
+       Name for the exported plot.  If not provided, the corresponding IDs will be used.
 Example:
-`publish(figs_and_ids, '/home/user/Documents/research_data', '/home/user/Documents/exported_data', 'EnergyOverTime-Plot')`  
+`publish(figs_and_ids, "/home/user/Documents/research_data", "/home/user/Documents/exported_data", plot_names=["EnergyOverTime-Plot", "TimeOverEnergy-Plot")`  
 
 ## Build
 If you want to build plotID yourself, follow these steps:  
 1. Download the source code from [Gitlab](https://git.rwth-aachen.de/plotid/plotid_python):  
 `git clone https://git.rwth-aachen.de/plotid/plotid_python.git`  
 `cd plotid_python`  
-2. *[Optional]* Create a virtual environment (see [Installation](#Installation)).  
+2. *[Optional]* Create a virtual environment (see [Installation](#installation)).  
 3. *[Optional]* Run unittests and coverage:  
 `python3 tests/runner_tests.py`
 4. Build the package
@@ -110,4 +114,4 @@ To install all optional dependencies use `pip install .[test,docs]` or `pip inst
 
 ## Documentation
 If you have more questions about plotID, please have a look at the [documentation](https://plotid.pages.rwth-aachen.de/plotid_python).  
-Also have a look at the [examples](./examples) that are shipped with plotID.
+Also have a look at the [examples](https://git.rwth-aachen.de/plotid/plotid_python/-/tree/main/examples) that are shipped with plotID.
diff --git a/docs/source/about.rst b/docs/source/about.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6e46bf0e75a2e543fdb5bfe86f2211285412b70b
--- /dev/null
+++ b/docs/source/about.rst
@@ -0,0 +1,9 @@
+About plotID
+==================================
+
+plotID is developed at the Institut Fluidsystemtechnik within nfdi4ing at the Technische Universität Darmstadt.
+
+Acknowledgements
+----------------
+
+The authors would like to thank the Federal Government and the Heads of Government of the Länder, as well as the Joint Science Conference (GWK), for their funding and support within the framework of the NFDI4Ing consortium. Funded by the German Research Foundation (DFG) - project number 442146713.
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 09b075d408632deae4561c8e3fb9d6e660000f78..dbd16bdb547bea25b4eb461140b0e4f9f7a82a83 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -14,15 +14,16 @@
 
 import os
 import sys
-sys.path.insert(0, os.path.abspath('../..'))
+
+sys.path.insert(0, os.path.abspath("../.."))
 
 from plotid import __version__, __author__  # noqa: E402
 
 
 # -- Project information -----------------------------------------------------
 
-project = 'plotID'
-copyright = '2022, ' + __author__
+project = "plotID"
+copyright = "2022, " + __author__
 author = __author__
 
 # The full version, including alpha/beta/rc tags
@@ -34,16 +35,14 @@ release = __version__
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
-extensions = [
-    'sphinx.ext.napoleon',
-    'autoapi.extension',
-    "myst_parser"
-]
-autoapi_type = 'python'
-autoapi_dirs = ['../../plotid', '../../tests']
+extensions = ["sphinx.ext.napoleon", "autoapi.extension", "myst_parser"]
+autoapi_type = "python"
+autoapi_dirs = ["../../plotid", "../../tests"]
+# autoapi_keep_files = True
+myst_heading_anchors = 2
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ["_templates"]
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
@@ -56,10 +55,10 @@ exclude_patterns = []
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
 #
-html_theme = 'sphinx_rtd_theme'
-html_logo = '_static/plotID.jpg'
+html_theme = "sphinx_rtd_theme"
+html_logo = "_static/plotID.jpg"
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+html_static_path = ["_static"]
diff --git a/docs/source/dependencies.rst b/docs/source/dependencies.rst
index 0229267378228945a58b3d9b5022f8ee24085de9..b9781f14d74a7fada93f15a8a849627ac448cb19 100644
--- a/docs/source/dependencies.rst
+++ b/docs/source/dependencies.rst
@@ -8,10 +8,11 @@ The plotID package depends on other software for its full funcionality. Since pl
 - `qrcode <https://github.com/lincolnloop/python-qrcode>`_: Creates QR codes from input data. qrcode is used to create the QR code which is printed on the plot in the end.
 - `numpy <https://numpy.org/doc/stable/>`_: Package for scientific computing. Right now it is only used to generate sample data in the examples. Since it is a dependency of matplotlib, it has to be installed anyway.
 
-Optional depedencies that are not necessary to run plotID but more to contribute to the code are the following:
+
+Optional dependencies that are not necessary to run plotID but more to contribute to the code quality are the following:
 
 - `coverage <https://coverage.readthedocs.io/en/6.5.0/#>`_: Program to measure the code coverage. It is used in the development of plotID to monitor the coverage of the code when the unit tests are run.
 - `sphinx <https://www.sphinx-doc.org/en/master/>`_: Program to build documentation. For example, this documentatio is generated with the help of sphinx.
 - `sphinx-autoapi <https://sphinx-autoapi.readthedocs.io/en/latest/>`_: Generates documentation files automatically from documentation inside the code. This has the advantage that code can be documented inside the code but can also be read in the documentation without having two places with the same content.
 - `sphinx-rtd-theme <https://sphinx-rtd-theme.readthedocs.io/en/stable/>`_: Readthedocs theme for nicer documentation style.
-- `myst-parser <https://myst-parser.readthedocs.io/en/latest/>`_: Extenstion for sphinx, e.g. to include markdown files in the documentation. That allows to include plotID's README.md in the documentation without storing it at two different places.
\ No newline at end of file
+- `myst-parser <https://myst-parser.readthedocs.io/en/latest/>`_: Extension for sphinx, e.g. to include markdown files in the documentation. That allows to include plotID's README.md in the documentation without storing it at two different places.
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 85893232c90db4b3ef10b35f488a4eb96446faf9..ec95047993c3f71eca577684b2fc2f0df65add87 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -10,9 +10,11 @@ Welcome to plotID's documentation!
    :maxdepth: 2
    :caption: Contents:
 
-    README <readme_link.rst>
-    Structure and architecture <structure.rst>
+    Overview <readme_link.rst>
+    Installation <installation.rst>
     Dependencies <dependencies.rst>
+    Structure and architecture <structure.rst>
+    About <about.rst>
 
 
 
diff --git a/docs/source/installation.rst b/docs/source/installation.rst
new file mode 100644
index 0000000000000000000000000000000000000000..aac633f952e67956d810ea2e312530c84c664885
--- /dev/null
+++ b/docs/source/installation.rst
@@ -0,0 +1,55 @@
+Installation of plotID
+==================================
+
+For installation instructions, first have a look at the general :doc:`readme_link` or the `README.md <https://git.rwth-aachen.de/plotid/plotid_python/-/blob/main/README.md>`_ file. More detailed information about the installation process can then be found here.
+
+Wrong python version
+--------------------
+To install and run plotID a python version ≥ 3.10 is required. If your linux distribution is shipped with a python version < 3.10, you still can install a newer python version. Intalling python 3.10 on Debian or Ubuntu would look like this
+
+.. code:: bash
+
+    sudo apt install python3.10 python3.10-venv
+
+You can then create a virtual environment "venv" to run plotID inside it
+
+.. code:: bash
+
+    python3.10 -m venv venv
+
+Now activate the venv
+
+.. code:: bash
+
+    source venv/bin/activate
+
+The virtual environment now runs with python 3.10 and plotID can be installed the usual way as described in :doc:`Overview`.
+
+
+Installation on Windows via pip
+-------------------------------
+If you're trying
+
+.. code:: cmd
+
+    pip install .
+
+and following error is thrown
+
+.. code:: cmd
+
+    Fatal error in launcher: Unable to create process using '"...env\Scripts\python.exe"  "..\venv\Scripts\pip.exe" install .': The system cannot find the specified file.
+
+Try to forcefully reinstall pip
+
+.. code:: cmd
+
+    python -m pip install --upgrade --force pip
+
+Or use 
+
+.. code:: cmd
+
+    python -m pip install .
+
+instead.
diff --git a/docs/source/modules.rst b/docs/source/modules.rst
deleted file mode 100644
index dd354c8698ea6d990ff1b421ad0822ef78a8bb65..0000000000000000000000000000000000000000
--- a/docs/source/modules.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-plotid
-======
-
-.. toctree::
-   :maxdepth: 4
-
-   plotid
diff --git a/docs/source/plotid.rst b/docs/source/plotid.rst
deleted file mode 100644
index 005afcdb7f40bef97789edbedf0d42196589d5b4..0000000000000000000000000000000000000000
--- a/docs/source/plotid.rst
+++ /dev/null
@@ -1,85 +0,0 @@
-plotid package
-==============
-
-Submodules
-----------
-
-plotid.create\_id module
-------------------------
-
-.. automodule:: plotid.create_id
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.example module
----------------------
-
-.. automodule:: plotid.example
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.filecompare module
--------------------------
-
-.. automodule:: plotid.filecompare
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.hdf5\_external\_link module
-----------------------------------
-
-.. automodule:: plotid.hdf5_external_link
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.plotoptions module
--------------------------
-
-.. automodule:: plotid.plotoptions
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.publish module
----------------------
-
-.. automodule:: plotid.publish
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.save\_plot module
-------------------------
-
-.. automodule:: plotid.save_plot
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.tagplot module
----------------------
-
-.. automodule:: plotid.tagplot
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-plotid.tagplot\_matplotlib module
----------------------------------
-
-.. automodule:: plotid.tagplot_matplotlib
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: plotid
-   :members:
-   :undoc-members:
-   :show-inheritance:
diff --git a/docs/source/readme_link.md b/docs/source/readme_link.md
new file mode 100644
index 0000000000000000000000000000000000000000..4bae9f3fd2d9f5dc887a61d6b0964f73c429c3d9
--- /dev/null
+++ b/docs/source/readme_link.md
@@ -0,0 +1,4 @@
+```{include} ../../README.md
+:relative-docs: docs/
+:relative-images: 
+```
\ No newline at end of file
diff --git a/docs/source/readme_link.rst b/docs/source/readme_link.rst
deleted file mode 100644
index 5b96f4d2576abcb33c94a270826d2c3ae6a6d0bd..0000000000000000000000000000000000000000
--- a/docs/source/readme_link.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Readme File
------------
-
-.. include:: ../../README.md
-   :parser: myst_parser.sphinx_
\ No newline at end of file
diff --git a/docs/source/structure.rst b/docs/source/structure.rst
index bef1bc936a5ea1273721f18010632d306f7ce504..932f3f41baccbcb2ffca3918e9652f3d4d459da9 100644
--- a/docs/source/structure.rst
+++ b/docs/source/structure.rst
@@ -1,5 +1,5 @@
 Structure and architecture of plotID
-==================================
+====================================
 
 A visualization of the internal structure of plotID is provided here. The structure tries to follow Object Oriented Programming (OOP) principles. First tagplot() is depicted with matplotlib as example plot engine:
 
diff --git a/examples/image_example.py b/examples/image_example.py
index 29f173d7c7174459f0d8ec95be3fdcd893caead6..e4fdb344b759aded33faa13b2f7558bf9f297a9a 100644
--- a/examples/image_example.py
+++ b/examples/image_example.py
@@ -15,8 +15,8 @@ from plotid.publish import publish
 PROJECT_ID = "MR05_"
 
 # %% Read example images
-IMG1 = 'example_image1.png'
-IMG2 = 'example_image2.png'
+IMG1 = "example_image1.png"
+IMG2 = "example_image2.png"
 
 # %% TagPlot
 
@@ -24,8 +24,9 @@ IMG2 = 'example_image2.png'
 IMGS_AS_LIST = [IMG1, IMG2]
 
 # Example for how to use tagplot with image files
-FIGS_AND_IDS = tagplot(IMGS_AS_LIST, 'image', prefix=PROJECT_ID,
-                       id_method='time', location='west')
+FIGS_AND_IDS = tagplot(
+    IMGS_AS_LIST, "image", prefix=PROJECT_ID, id_method="time", location="west"
+)
 # Required arguments: tagplot(images as list, desired plot engine)
 
 
@@ -34,7 +35,6 @@ FIGS_AND_IDS = tagplot(IMGS_AS_LIST, 'image', prefix=PROJECT_ID,
 # Export your tagged images, copy the research data that generated the images,
 # specify the destination folder and give a name for the exported image files.
 
-publish(FIGS_AND_IDS, ['../README.md', '../docs', '../LICENSE'],
-        './data', 'my_image')
+publish(FIGS_AND_IDS, ["../README.md", "../docs", "../LICENSE"], "./data")
 # Required arguments: publish(output of tagplot(), list of files,
-# path to destination folder, name(s) for the resulting images)
+# path to destination folder)
diff --git a/examples/matplotlib_example.py b/examples/matplotlib_example.py
index 0929036eb4308ea0afbf0a8cca93954eda6c6ed0..db348a5ec21a6f1cdd33bdbcb3e91edfa276636f 100644
--- a/examples/matplotlib_example.py
+++ b/examples/matplotlib_example.py
@@ -25,13 +25,13 @@ y_2 = np.sin(x) + 2
 
 # 1. figure
 FIG1 = plt.figure()
-plt.plot(x, y, color='black')
-plt.plot(x, y_2, color='yellow')
+plt.plot(x, y, color="black")
+plt.plot(x, y_2, color="yellow")
 
 # 2. figure
 FIG2 = plt.figure()
-plt.plot(x, y, color='blue')
-plt.plot(x, y_2, color='red')
+plt.plot(x, y, color="blue")
+plt.plot(x, y_2, color="red")
 
 # %% tagplot
 
@@ -39,13 +39,13 @@ plt.plot(x, y_2, color='red')
 FIGS_AS_LIST = [FIG1, FIG2]
 
 # Example for how to use tagplot with matplotlib figures
-FIGS_AND_IDS = tagplot(FIGS_AS_LIST, 'matplotlib', location='west',
-                       id_method='random', prefix=PROJECT_ID)
+FIGS_AND_IDS = tagplot(
+    FIGS_AS_LIST, "matplotlib", location="west", id_method="random", prefix=PROJECT_ID
+)
 # Required arguments: tagplot(images as list, desired plot engine)
 
 # %% Publish
 
-publish(FIGS_AND_IDS, ['../README.md', '../docs', '../LICENSE'],
-        'data', 'my_plot')
+publish(FIGS_AND_IDS, ["../README.md", "../docs", "../LICENSE"], "data")
 # Required arguments: publish(output of tagplot(), list of files,
-# path to destination folder, name(s) for the resulting images)
+# path to destination folder)
diff --git a/plotid/__init__.py b/plotid/__init__.py
index bedc85e6ce852383f2cc7bcd3e8f173c73ce330a..e572fc044d3a808bc423cb488588097f4b1a40ce 100644
--- a/plotid/__init__.py
+++ b/plotid/__init__.py
@@ -10,5 +10,5 @@ research data, the plot is based on. Additionally, the script that created the
 plot will also be copied to the directory.
 """
 
-__version__ = '0.2.2'
-__author__ = 'Institut Fluidsystemtechnik within nfdi4ing at TU Darmstadt'
+__version__ = "0.2.2"
+__author__ = "Institut Fluidsystemtechnik within nfdi4ing at TU Darmstadt"
diff --git a/plotid/create_id.py b/plotid/create_id.py
index f28d94ae18e32fd835561a9cdbbc942f7b6660bc..61c1cc03be360848a3986bd00a6e7862721454ba 100644
--- a/plotid/create_id.py
+++ b/plotid/create_id.py
@@ -27,19 +27,20 @@ def create_id(id_method):
     figure_id : str
     """
     match id_method:
-        case 'time':
+        case "time":
             figure_id = time.time()  # UNIX Time
             figure_id = hex(int(figure_id))  # convert time to hexadecimal str
-            time.sleep(1)   # break for avoiding duplicate IDs
-        case 'random':
+            time.sleep(1)  # break for avoiding duplicate IDs
+        case "random":
             figure_id = str(uuid.uuid4())  # creates a random UUID
-            figure_id = figure_id[0:8]            # only use first 8 numbers
+            figure_id = figure_id[0:8]  # only use first 8 numbers
         case _:
             raise ValueError(
                 f'Your chosen ID method "{id_method}" is not supported.\n'
-                'At the moment these methods are available:\n'
+                "At the moment these methods are available:\n"
                 '"time": Unix time converted to hexadecimal\n'
-                '"random": Random UUID')
+                '"random": Random UUID'
+            )
     return figure_id
 
 
diff --git a/plotid/plotoptions.py b/plotid/plotoptions.py
index f85d2300afbc0b71ffd8d40edf84e47b7db71dc6..eebdcc40541cf2de3500b9108457ba8e7e5a428c 100644
--- a/plotid/plotoptions.py
+++ b/plotid/plotoptions.py
@@ -40,17 +40,20 @@ class PlotOptions:
         The default is 'time'.
     qrcode : bool, optional
         Experimental status. Print qrcode on exported plot. Default: False.
+    id_on_plot: bool, optional
+        Print ID on the plot. Default: True.
     """
 
     def __init__(self, figs, rotation, position, **kwargs):
 
         self.figs = figs
-        self.figure_ids = kwargs.get('figure_ids', [])
+        self.figure_ids = kwargs.get("figure_ids", [])
         self.rotation = rotation
         self.position = position
-        self.prefix = kwargs.get('prefix', '')
-        self.id_method = kwargs.get('id_method', 'time')
-        self.qrcode = kwargs.get('qrcode', False)
+        self.prefix = kwargs.get("prefix", "")
+        self.id_method = kwargs.get("id_method", "time")
+        self.qrcode = kwargs.get("qrcode", False)
+        self.id_on_plot = kwargs.get("id_on_plot", True)
 
     def __str__(self):
         """Representation if an object of this class is printed."""
@@ -76,7 +79,7 @@ class PlotOptions:
             raise TypeError("Prefix is not a string.")
 
         if not isinstance(self.id_method, str):
-            raise TypeError('The chosen id_method is not a string.')
+            raise TypeError("The chosen id_method is not a string.")
 
         # Store figs in a list, even if it is only one.
         if not isinstance(self.figs, list):
@@ -145,14 +148,19 @@ def validate_list(list_var, elt_type=str, is_file=False):
     if isinstance(list_var, list):
         for elt in list_var:
             if not isinstance(elt, elt_type):
-                raise TypeError(f'The list of {list_var} contains an '
-                                f'object which is not of type {elt_type}.')
+                raise TypeError(
+                    f"The list of {list_var} contains an "
+                    f"object which is not of type {elt_type}."
+                )
             if is_file:
                 # Check if directory and files exist
                 if not os.path.exists(elt):
-                    raise FileNotFoundError('The specified directory'
-                                            f'/file {elt} does not exist.')
+                    raise FileNotFoundError(
+                        "The specified directory" f"/file {elt} does not exist."
+                    )
     else:
-        raise TypeError(f'The specified {list_var} are neither a '
-                        f'{elt_type} nor a list of {elt_type}.')
+        raise TypeError(
+            f"The specified {list_var} are neither a "
+            f"{elt_type} nor a list of {elt_type}."
+        )
     return list_var
diff --git a/plotid/publish.py b/plotid/publish.py
index cf5a1d3f829074dcceff13d030cf5663ffa47468..8912a2a4100be4b14a79c680c3cbc084580e6810 100644
--- a/plotid/publish.py
+++ b/plotid/publish.py
@@ -33,19 +33,17 @@ class PublishOptions:
         Export the plot and copy specified files to the destiantion folder.
     """
 
-    def __init__(self, figs_and_ids, src_datapaths, dst_path, plot_names,
-                 **kwargs):
+    def __init__(self, figs_and_ids, src_datapaths, dst_path, **kwargs):
 
         if not isinstance(figs_and_ids, PlotIDTransfer):
-            raise RuntimeError('figs_and_ids is not an instance of '
-                               'PlotIDTransfer.')
+            raise RuntimeError("figs_and_ids is not an instance of PlotIDTransfer.")
         self.figure = figs_and_ids.figs
         self.figure_ids = figs_and_ids.figure_ids
         self.src_datapaths = src_datapaths
         self.dst_path = os.path.abspath(dst_path)
-        self.plot_names = plot_names
-        self.data_storage = kwargs.get('data_storage', 'individual')
+        self.data_storage = kwargs.get("data_storage", "individual")
         self.dst_path_head, self.dst_dirname = os.path.split(self.dst_path)
+        self.plot_names = kwargs.get("plot_names", self.figure_ids)
 
     def __str__(self):
         """Representation if an object of this class is printed."""
@@ -75,23 +73,25 @@ class PublishOptions:
         self.plot_names = validate_list(self.plot_names)
 
         if not os.path.isfile(sys.argv[0]):
-            raise FileNotFoundError('Cannot copy original python script. '
-                                    'Running publish from a shell is not '
-                                    'possible.')
+            raise FileNotFoundError(
+                "Cannot copy original python script. "
+                "Running publish from a shell is not "
+                "possible."
+            )
 
         # Check if self.src_datapaths are strings and existing files.
-        self.src_datapaths = validate_list(self.src_datapaths,
-                                           is_file=True)
+        self.src_datapaths = validate_list(self.src_datapaths, is_file=True)
 
         # Check if destination directory is allowed path
         if not os.path.exists(self.dst_path_head):
-            raise FileNotFoundError('The specified destination directory '
-                                    f'{self.dst_path_head} does not exist.')
+            raise FileNotFoundError(
+                "The specified destination directory "
+                f"{self.dst_path_head} does not exist."
+            )
 
         # Check if data_storage is a string
         if not isinstance(self.data_storage, str):
-            raise TypeError('The specified data_storage method is not a '
-                            'string.')
+            raise TypeError("The specified data_storage method is not a string.")
 
     def export(self):
         """
@@ -112,55 +112,66 @@ class PublishOptions:
         # Export plot figure to picture.
         plot_paths = save_plot(self.figure, self.plot_names)
         match self.data_storage:
-            case 'centralized':
+            case "centralized":
                 self.centralized_data_storage()
-            case 'individual':
+            case "individual":
                 for i, plot in enumerate(plot_paths):
                     try:
                         # Create folder with ID as name
-                        dst_path = os.path.join(self.dst_path,
-                                                self.figure_ids[i])
-                        dst_path_invisible = os.path.join(self.dst_path, '.'
-                                                          + self.figure_ids[i])
+                        dst_path = os.path.join(self.dst_path, self.figure_ids[i])
+                        dst_path_invisible = os.path.join(
+                            self.dst_path, "." + self.figure_ids[i]
+                        )
 
                         # If dir with the same ID already exists ask user
                         # if it should be overwritten.
                         if os.path.isdir(dst_path):
-                            warnings.warn(f'Folder "{dst_path}" already exists'
-                                          ' – plot has already been published.'
-                                          )
-                            overwrite_dir = input('Do you want to overwrite '
-                                                  'the existing folder? '
-                                                  '(yes/no[default])\n')
-                            if overwrite_dir in ('yes', 'y', 'Yes', 'YES'):
+                            warnings.warn(
+                                f'Folder "{dst_path}" already exists'
+                                " – plot has already been published."
+                            )
+                            overwrite_dir = input(
+                                "Do you want to overwrite "
+                                "the existing folder? "
+                                "(yes/no[default])\n"
+                            )
+                            if overwrite_dir in ("yes", "y", "Yes", "YES"):
                                 shutil.rmtree(dst_path)
                             else:
-                                raise RuntimeError('publish has finished '
-                                                   'without an export.\nRerun '
-                                                   'tagplot if you need a new'
-                                                   ' ID or consider '
-                                                   'overwriting.')
+                                raise RuntimeError(
+                                    "publish has finished "
+                                    "without an export.\nRerun "
+                                    "tagplot if you need a new"
+                                    " ID or consider "
+                                    "overwriting."
+                                )
 
                         self.individual_data_storage(dst_path_invisible, plot)
                         # If export was successful, make the directory visible
                         os.rename(dst_path_invisible, dst_path)
                     except FileExistsError as exc:
-                        delete_dir = input('There was an error while '
-                                           'publishing the data. Should the '
-                                           'partially copied data at '
-                                           f'{dst_path_invisible} be'
-                                           ' removed? (yes/no[default])\n')
-                        if delete_dir in ('yes', 'y', 'Yes', 'YES'):
+                        delete_dir = input(
+                            "There was an error while "
+                            "publishing the data. Should the "
+                            "partially copied data at "
+                            f"{dst_path_invisible} be"
+                            " removed? (yes/no[default])\n"
+                        )
+                        if delete_dir in ("yes", "y", "Yes", "YES"):
                             shutil.rmtree(dst_path_invisible)
-                        raise RuntimeError('Publishing was unsuccessful. '
-                                           'Try re-running publish.') from exc
+                        raise RuntimeError(
+                            "Publishing was unsuccessful. Try re-running publish."
+                        ) from exc
             case _:
-                raise ValueError(f'The data storage method {self.data_storage}'
-                                 ' is not available.')
+                raise ValueError(
+                    f"The data storage method {self.data_storage}" " is not available."
+                )
 
-        print(f'Publish was successful.\nYour plot(s), your'
-              f' data and your\nscript {sys.argv[0]}'
-              f'\nwere copied to {self.dst_path}.')
+        print(
+            f"Publish was successful.\nYour plot(s), your"
+            f" data and your\nscript {sys.argv[0]}"
+            f"\nwere copied to {self.dst_path}."
+        )
 
     def centralized_data_storage(self):
         """
@@ -192,13 +203,20 @@ class PublishOptions:
 
         """
         # Copy all files to destination directory
-        print('Copying data has been started. Depending on the size of'
-              ' your data this may take a while...')
+        print(
+            "Copying data has been started. Depending on the size of"
+            " your data this may take a while..."
+        )
         os.makedirs(destination)
         # Copy data to destination folder
         for path in self.src_datapaths:
             try:
-                shutil.copytree(path, destination, dirs_exist_ok=True)
+                _, src_dir_name = os.path.split(path)
+                # Create new dst directory to include the top level directory of
+                # the source files. So that copying A to B results in B/A and not only
+                # the contents of A to B.
+                new_destination = os.path.join(destination, src_dir_name)
+                shutil.copytree(path, new_destination, dirs_exist_ok=True)
             except NotADirectoryError:
                 shutil.copy2(path, destination)
 
@@ -214,11 +232,13 @@ class PublishOptions:
             name_tmp, orig_ext = os.path.splitext(pic_path)
             orig_name, _ = os.path.splitext(name_tmp)
             final_file_path = orig_name + orig_ext
-            os.rename(os.path.join(destination, pic_path),
-                      os.path.join(destination, final_file_path))
+            os.rename(
+                os.path.join(destination, pic_path),
+                os.path.join(destination, final_file_path),
+            )
 
 
-def publish(figs_and_ids, src_datapath, dst_path, plot_name, **kwargs):
+def publish(figs_and_ids, src_datapath, dst_path, **kwargs):
     """
     Save plot, data and measuring script.
 
@@ -230,8 +250,6 @@ def publish(figs_and_ids, src_datapath, dst_path, plot_name, **kwargs):
         Path to data that should be published.
     dst_path : str
         Path to the destination directory.
-     plot_name : str or list of str
-        Name for the exported plot.
     **kwargs : dict, optional
         Extra arguments for additional publish options.
 
@@ -243,13 +261,14 @@ def publish(figs_and_ids, src_datapath, dst_path, plot_name, **kwargs):
                 will reference this data via sym link.
             individual [default]: The complete raw data will be copied to a
                 folder for every plot, respectively.
+    plot_names : str or list of str, optional
+       Name for the exported plot. If not provided, the corresponding IDs will be used.
 
     Returns
     -------
     None.
 
     """
-    publish_container = PublishOptions(figs_and_ids, src_datapath, dst_path,
-                                       plot_name, **kwargs)
+    publish_container = PublishOptions(figs_and_ids, src_datapath, dst_path, **kwargs)
     publish_container.validate_input()
     publish_container.export()
diff --git a/plotid/save_plot.py b/plotid/save_plot.py
index 1fa7063c80fc26974b7ba7dbf17c1393f16f2d44..d587156baad5c5dd6983514fcd659e3a7dce954b 100644
--- a/plotid/save_plot.py
+++ b/plotid/save_plot.py
@@ -12,7 +12,7 @@ import matplotlib
 import matplotlib.pyplot as plt
 
 
-def save_plot(figures, plot_names, extension='png'):
+def save_plot(figures, plot_names, extension="png"):
     """
     Export plot(s).
 
@@ -35,34 +35,36 @@ def save_plot(figures, plot_names, extension='png'):
         figures = [figures]
     # PIL has different classes for different file formats. Therefore, the
     # type is checked to contain 'PIL' and 'ImageFile'.
-    if all(x in str(type(figures)) for x in ['PIL', 'ImageFile']):
+    if all(x in str(type(figures)) for x in ["PIL", "ImageFile"]):
         figures = [figures]
     if not isinstance(figures, list):
-        raise TypeError('Figures are not given as list.')
+        raise TypeError("Figures are not given as list.")
     if isinstance(plot_names, str):
         plot_names = [plot_names]
 
     if len(plot_names) < len(figures):
-        warnings.warn('There are more figures than plot names. The first name'
-                      ' will be taken for all plots with an appended number.')
+        warnings.warn(
+            "There are more figures than plot names. The first name"
+            " will be taken for all plots with an appended number."
+        )
         first_name = plot_names[0]
         plot_names = [None] * len(figures)
         for i, _ in enumerate(plot_names):
-            plot_names[i] = first_name + f'{i+1}'
+            plot_names[i] = first_name + f"{i+1}"
     elif len(plot_names) > len(figures):
-        raise IndexError('There are more plot names than figures.')
+        raise IndexError("There are more plot names than figures.")
 
     plot_path = []
 
     for i, fig in enumerate(figures):
         if isinstance(fig, matplotlib.figure.Figure):
             plt.figure(fig)
-            plot_path.append(plot_names[i] + '.tmp.' + extension)
+            plot_path.append(plot_names[i] + ".tmp." + extension)
             plt.savefig(plot_path[i])
-        elif all(x in str(type(fig)) for x in ['PIL', 'ImageFile']):
-            plot_path.append(plot_names[i] + '.tmp.' + extension)
+        elif all(x in str(type(fig)) for x in ["PIL", "ImageFile"]):
+            plot_path.append(plot_names[i] + ".tmp." + extension)
             fig.save(plot_path[i])
         else:
-            raise TypeError(f'Figure number {i} is not a valid figure object.')
+            raise TypeError(f"Figure number {i} is not a valid figure object.")
 
     return plot_path
diff --git a/plotid/tagplot.py b/plotid/tagplot.py
index b0f365ed8f0d493add69b06ea1ac5b2df0f04701..da83b3ec1756727ffc14642ff0a464cf08d85f9e 100644
--- a/plotid/tagplot.py
+++ b/plotid/tagplot.py
@@ -16,7 +16,7 @@ from plotid.tagplot_matplotlib import tagplot_matplotlib
 from plotid.tagplot_image import tagplot_image
 
 
-def tagplot(figs, engine, location='east', **kwargs):
+def tagplot(figs, engine, location="east", **kwargs):
     """
     Tag your figure/plot with an ID.
 
@@ -65,28 +65,30 @@ def tagplot(figs, engine, location='east', **kwargs):
         raise TypeError("Location is not a string.")
 
     match location:
-        case 'north':
+        case "north":
             rotation = 0
             position = (0.35, 0.975)
-        case 'east':
+        case "east":
             rotation = 90
             position = (0.975, 0.35)
-        case 'south':
+        case "south":
             rotation = 0
             position = (0.35, 0.015)
-        case 'west':
+        case "west":
             rotation = 90
             position = (0.025, 0.35)
-        case 'southeast':
+        case "southeast":
             rotation = 0
             position = (0.75, 0.015)
-        case 'custom':
+        case "custom":
             # TODO: Get rotation and position from user input & check if valid
             pass
         case _:
-            warnings.warn(f'Location "{location}" is not a defined '
-                          'location, TagPlot uses location "east" '
-                          'instead.')
+            warnings.warn(
+                f'Location "{location}" is not a defined '
+                'location, TagPlot uses location "east" '
+                "instead."
+            )
             rotation = 90
             position = (0.975, 0.35)
 
@@ -94,10 +96,9 @@ def tagplot(figs, engine, location='east', **kwargs):
     option_container.validate_input()
 
     match engine:
-        case 'matplotlib' | 'pyplot':
+        case "matplotlib" | "pyplot":
             return tagplot_matplotlib(option_container)
-        case 'image' | 'fallback':
+        case "image" | "fallback":
             return tagplot_image(option_container)
         case _:
-            raise ValueError(
-                f'The plot engine "{engine}" is not supported.')
+            raise ValueError(f'The plot engine "{engine}" is not supported.')
diff --git a/plotid/tagplot_image.py b/plotid/tagplot_image.py
index 5569097ea41f97fd6cd74e6cbe7edd92f04a5990..ccb65a24a92aa86e12b3105777bfa3abd22ead6a 100644
--- a/plotid/tagplot_image.py
+++ b/plotid/tagplot_image.py
@@ -28,15 +28,16 @@ def tagplot_image(plotid_object):
     """
     # Check if plotid_object is a valid instance of PlotOptions
     if not isinstance(plotid_object, PlotOptions):
-        raise TypeError('The given options container is not an instance'
-                        'of PlotOptions.')
+        raise TypeError(
+            "The given options container is not an instance" "of PlotOptions."
+        )
 
     # Check if figs is a list of files
     for img in plotid_object.figs:
         if not isinstance(img, str):
-            raise TypeError('Name of the image is not a string.')
+            raise TypeError("Name of the image is not a string.")
         if not os.path.isfile(img):
-            raise TypeError('File does not exist.')
+            raise TypeError("File does not exist.")
             # Check if figs is a valid file is done by pillow internally
 
     color = (128, 128, 128)  # grey
@@ -47,18 +48,24 @@ def tagplot_image(plotid_object):
         plotid_object.figure_ids.append(img_id)
         img = Image.open(img)
 
-        img_txt = Image.new('L', font.getsize(img_id))
-        draw_txt = ImageDraw.Draw(img_txt)
-        draw_txt.text((0, 0), img_id, font=font, fill=255)
-        txt = img_txt.rotate(plotid_object.rotation, expand=1)
-        img.paste(ImageOps.colorize(txt, (0, 0, 0), color),
-                  (int(img.width*plotid_object.position[0]),
-                   int(img.height*(1-plotid_object.position[1]))), txt)
+        if plotid_object.id_on_plot:
+            img_txt = Image.new("L", font.getsize(img_id))
+            draw_txt = ImageDraw.Draw(img_txt)
+            draw_txt.text((0, 0), img_id, font=font, fill=255)
+            txt = img_txt.rotate(plotid_object.rotation, expand=1)
+            img.paste(
+                ImageOps.colorize(txt, (0, 0, 0), color),
+                (
+                    int(img.width * plotid_object.position[0]),
+                    int(img.height * (1 - plotid_object.position[1])),
+                ),
+                txt,
+            )
 
         if plotid_object.qrcode:
             qrcode = create_qrcode(img_id)
             qrcode.thumbnail((100, 100), Image.ANTIALIAS)
-            img.paste(qrcode, box=(img.width-100, img.height-100))
+            img.paste(qrcode, box=(img.width - 100, img.height - 100))
         plotid_object.figs[i] = img
 
     figs_and_ids = PlotIDTransfer(plotid_object.figs, plotid_object.figure_ids)
diff --git a/plotid/tagplot_matplotlib.py b/plotid/tagplot_matplotlib.py
index d9fe383d5d5d0e6d5aedb8bd03f94d86746739ae..1130756b8441379eb63c4088bce9dee62b432680 100644
--- a/plotid/tagplot_matplotlib.py
+++ b/plotid/tagplot_matplotlib.py
@@ -30,33 +30,41 @@ def tagplot_matplotlib(plotid_object):
     """
     # Check if plotid_object is a valid instance of PlotOptions
     if not isinstance(plotid_object, PlotOptions):
-        raise TypeError('The given options container is not an instance'
-                        'of PlotOptions.')
+        raise TypeError(
+            "The given options container is not an instance" "of PlotOptions."
+        )
 
     # Check if figs is a list of valid figures
     for figure in plotid_object.figs:
         if not isinstance(figure, matplotlib.figure.Figure):
-            raise TypeError('Figure is not a valid matplotlib-figure.')
+            raise TypeError("Figure is not a valid matplotlib-figure.")
 
-    fontsize = 'small'
-    color = 'grey'
+    fontsize = "small"
+    color = "grey"
 
     # Loop to create and position the IDs
     for fig in plotid_object.figs:
         fig_id = create_id(plotid_object.id_method)
         fig_id = plotid_object.prefix + fig_id
         plotid_object.figure_ids.append(fig_id)
-
         plt.figure(fig)
-        plt.figtext(x=plotid_object.position[0], y=plotid_object.position[1],
-                    s=fig_id, ha='left', wrap=True,
-                    rotation=plotid_object.rotation,
-                    fontsize=fontsize, color=color)
+
+        if plotid_object.id_on_plot:
+            plt.figtext(
+                x=plotid_object.position[0],
+                y=plotid_object.position[1],
+                s=fig_id,
+                ha="left",
+                wrap=True,
+                rotation=plotid_object.rotation,
+                fontsize=fontsize,
+                color=color,
+            )
 
         if plotid_object.qrcode:
             qrcode = create_qrcode(fig_id)
             qrcode.thumbnail((100, 100), Image.ANTIALIAS)
-            fig.figimage(qrcode, fig.bbox.xmax - 100, 0, cmap='bone')
+            fig.figimage(qrcode, fig.bbox.xmax - 100, 0, cmap="bone")
             fig.tight_layout()
 
     figs_and_ids = PlotIDTransfer(plotid_object.figs, plotid_object.figure_ids)
diff --git a/tests/runner_tests.py b/tests/runner_tests.py
index ce944d6f7379a4a71b7921a6afb358728dc63e1c..81eb90753ceb2cc08c0e0a70b9717e2774eb9da1 100644
--- a/tests/runner_tests.py
+++ b/tests/runner_tests.py
@@ -10,14 +10,14 @@ import os
 import unittest
 import coverage
 
-path = os.path.abspath('plotid')
+path = os.path.abspath("plotid")
 sys.path.append(path)
 
 cov = coverage.Coverage()
 cov.start()
 
 loader = unittest.TestLoader()
-tests = loader.discover('.')
+tests = loader.discover(".")
 testRunner = unittest.runner.TextTestRunner(verbosity=2)
 result = testRunner.run(tests)
 
diff --git a/tests/test_create_id.py b/tests/test_create_id.py
index 2f8e4b2b669b49a8f295ba7f60799e89804b02b5..c494a265fc9bd5fb15804ec67aef1f545114d80c 100644
--- a/tests/test_create_id.py
+++ b/tests/test_create_id.py
@@ -17,26 +17,25 @@ class TestCreateID(unittest.TestCase):
 
     def test_existence(self):
         """Test if create_id returns a string."""
-        self.assertIsInstance(cid.create_id('time'), str)
-        self.assertIsInstance(cid.create_id('random'), str)
+        self.assertIsInstance(cid.create_id("time"), str)
+        self.assertIsInstance(cid.create_id("random"), str)
 
     def test_errors(self):
-        """ Test if Errors are raised when id_method is wrong. """
+        """Test if Errors are raised when id_method is wrong."""
         with self.assertRaises(ValueError):
             cid.create_id(3)
         with self.assertRaises(ValueError):
-            cid.create_id('h')
+            cid.create_id("h")
 
     def test_length(self):
-        """ Test if figure_id has the correct length. """
-        self.assertEqual(len(cid.create_id('time')), 10)
-        self.assertEqual(len(cid.create_id('random')), 8)
+        """Test if figure_id has the correct length."""
+        self.assertEqual(len(cid.create_id("time")), 10)
+        self.assertEqual(len(cid.create_id("random")), 8)
 
     def test_qrcode(self):
         """Test if qrcode returns a image."""
-        self.assertIsInstance(create_qrcode('test_ID'),
-                              qrcode.image.pil.PilImage)
+        self.assertIsInstance(create_qrcode("test_ID"), qrcode.image.pil.PilImage)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main()
diff --git a/tests/test_plotoptions.py b/tests/test_plotoptions.py
index 87b4f306f5781172f54f209397e3a463185d968b..bd992c139cdfd34258728bf97246ce02392f8371 100644
--- a/tests/test_plotoptions.py
+++ b/tests/test_plotoptions.py
@@ -20,42 +20,52 @@ class TestTagplot(unittest.TestCase):
         """
         Test if input validation runs successful.
         """
-        PlotOptions('FIG', ROTATION, POSITION, prefix='xyz',
-                    id_method='random').validate_input()
+        PlotOptions(
+            "FIG", ROTATION, POSITION, prefix="xyz", id_method="random"
+        ).validate_input()
 
     def test_prefix(self):
-        """ Test if Error is raised if prefix is not a string. """
+        """Test if Error is raised if prefix is not a string."""
         with self.assertRaises(TypeError):
-            PlotOptions(['FIG'], ROTATION, POSITION, prefix=3).validate_input()
+            PlotOptions(["FIG"], ROTATION, POSITION, prefix=3).validate_input()
 
     def test_data_storage(self):
-        """ Test if Error is raised if id_method is not a string. """
+        """Test if Error is raised if id_method is not a string."""
         with self.assertRaises(TypeError):
-            PlotOptions(['FIG'], ROTATION, POSITION,
-                        id_method=4).validate_input()
+            PlotOptions(["FIG"], ROTATION, POSITION, id_method=4).validate_input()
 
     def test_str_plotoptions(self):
         """
         Test if the string representation of a PlotOptions object is correct.
         """
-        plot_obj = PlotOptions('FIG', ROTATION, POSITION, prefix='xyz',
-                               id_method='random')
-        self.assertEqual(str(plot_obj),
-                         "<class 'plotid.plotoptions.PlotOptions'>: {'figs': "
-                         "'FIG', 'figure_ids': [], 'rotation': 270, 'position'"
-                         ": (100, 200), 'prefix': 'xyz', 'id_method': "
-                         "'random', 'qrcode': False}")
+        plot_obj = PlotOptions(
+            "FIG",
+            ROTATION,
+            POSITION,
+            prefix="xyz",
+            id_method="random",
+            id_on_plot=False,
+        )
+        self.assertEqual(
+            str(plot_obj),
+            "<class 'plotid.plotoptions.PlotOptions'>: {'figs': "
+            "'FIG', 'figure_ids': [], 'rotation': 270, 'position'"
+            ": (100, 200), 'prefix': 'xyz', 'id_method': "
+            "'random', 'qrcode': False, 'id_on_plot': False}",
+        )
 
     def test_str_plotidtransfer(self):
         """
         Test if the string representation of a PlotIDTransfer object is
         correct.
         """
-        transfer_obj = PlotIDTransfer('FIG', [])
-        self.assertEqual(str(transfer_obj),
-                         "<class 'plotid.plotoptions.PlotIDTransfer'>: "
-                         "{'figs': 'FIG', 'figure_ids': []}")
+        transfer_obj = PlotIDTransfer("FIG", [])
+        self.assertEqual(
+            str(transfer_obj),
+            "<class 'plotid.plotoptions.PlotIDTransfer'>: "
+            "{'figs': 'FIG', 'figure_ids': []}",
+        )
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main()
diff --git a/tests/test_publish.py b/tests/test_publish.py
index 7d2ff4954d4fe6cd21e6756c9c1fc57b72bf181f..f279f7f0b9232689dc9599d277c94c6fc7c7ea04 100644
--- a/tests/test_publish.py
+++ b/tests/test_publish.py
@@ -16,18 +16,18 @@ from plotid.publish import publish, PublishOptions
 from plotid.plotoptions import PlotIDTransfer
 
 
-SRC_DIR = 'test_src_folder'
-SRC_FILES = ['test_file1.txt', 'test_file2.jpg', 'test_file3.exe']
-PIC_NAME = 'test_picture'
-DST_DIR = 'test_dst_folder'
-DST_PARENT_DIR = 'test_parent'
+SRC_DIR = "test_src_folder"
+SRC_FILES = ["test_file1.txt", "test_file2.jpg", "test_file3.exe"]
+PIC_NAME = "test_picture"
+DST_DIR = "test_dst_folder"
+DST_PARENT_DIR = "test_parent"
 DST_PATH = os.path.join(DST_PARENT_DIR, DST_DIR)
 FIG = plt.figure(figsize=[6.4, 4.8], dpi=100)
 FIG2 = plt.figure(figsize=[6.4, 4.8], dpi=100)
 FIGS_AS_LIST = [FIG, FIG2]
-IDS_AS_LIST = ['MR05_0x63203c6f', 'MR05_0x63203c70']
+IDS_AS_LIST = ["MR05_0x63203c6f", "MR05_0x63203c70"]
 FIGS_AND_IDS = PlotIDTransfer(FIGS_AS_LIST, IDS_AS_LIST)
-PIC_NAME_LIST = [PIC_NAME, 'second_picture']
+PIC_NAME_LIST = [PIC_NAME, "second_picture"]
 
 
 class TestPublish(unittest.TestCase):
@@ -36,39 +36,66 @@ class TestPublish(unittest.TestCase):
     """
 
     def setUp(self):
-        """ Generate source and destination directory and source files. """
+        """Generate source and destination directory and source files."""
         os.makedirs(SRC_DIR, exist_ok=True)
         os.makedirs(DST_PARENT_DIR, exist_ok=True)
         for file in SRC_FILES:
-            open(file, 'w', encoding='utf-8').close()
+            open(file, "w", encoding="utf-8").close()
 
     # Skip test if tests are run from command line.
-    @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
-                     'from a Python script. Therefore, the script cannot be '
-                     'copied.')
+    @unittest.skipIf(
+        not os.path.isfile(sys.argv[0]),
+        "Publish is not called "
+        "from a Python script. Therefore, the script cannot be "
+        "copied.",
+    )
     def test_publish(self):
         """
         Test publish and check if an exported picture file exists.
         The destination path is given with trailing slash.
         """
-        publish(PlotIDTransfer(FIG, 'testID'), SRC_DIR, DST_PATH + '/',
-                PIC_NAME, data_storage='individual')
-        assert os.path.isfile(os.path.join(DST_PATH, 'testID',
-                                           PIC_NAME + '.png'))
+        publish(
+            PlotIDTransfer(FIG, "testID"),
+            SRC_DIR,
+            DST_PATH + "/",
+            plot_names=PIC_NAME,
+            data_storage="individual",
+        )
+        assert os.path.isfile(os.path.join(DST_PATH, "testID", PIC_NAME + ".png"))
 
     # Skip test if tests are run from command line.
-    @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
-                     'from a Python script. Therefore, the script cannot be '
-                     'copied.')
-    def test_publish_multiple_figs(self):
+    @unittest.skipIf(
+        not os.path.isfile(sys.argv[0]),
+        "Publish is not called "
+        "from a Python script. Therefore, the script cannot be "
+        "copied.",
+    )
+    def test_publish_multiple_figs_custom_name(self):
         """
         Test publish with multiple figures and check if all exported picture
-        files exist.
+        files exist with the provided strings as their names.
         """
-        publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME_LIST)
+        publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, plot_names=PIC_NAME_LIST)
         for i, name in enumerate(PIC_NAME_LIST):
-            assert os.path.isfile(os.path.join(DST_PATH, IDS_AS_LIST[i],
-                                               name + '.png'))
+            assert os.path.isfile(os.path.join(DST_PATH, IDS_AS_LIST[i], name + ".png"))
+
+    # Skip test if tests are run from command line.
+    @unittest.skipIf(
+        not os.path.isfile(sys.argv[0]),
+        "Publish is not called "
+        "from a Python script. Therefore, the script cannot be "
+        "copied.",
+    )
+    def test_publish_multiple_figs_standard_name(self):
+        """
+        Test publish with multiple figures and check if all exported picture
+        files exist with the IDs as their names.
+        """
+        publish(FIGS_AND_IDS, SRC_DIR, DST_PATH)
+        for identifier in IDS_AS_LIST:
+            assert os.path.isfile(
+                os.path.join(DST_PATH, identifier, identifier + ".png")
+            )
 
     def test_figs_and_ids(self):
         """
@@ -76,14 +103,14 @@ class TestPublish(unittest.TestCase):
         PlotIDTransfer object.
         """
         with self.assertRaises(RuntimeError):
-            publish('FIGS_AND_IDS', SRC_DIR, DST_PATH, PIC_NAME_LIST)
+            publish("FIGS_AND_IDS", SRC_DIR, DST_PATH)
 
     def test_wrong_ids(self):
-        """ Test if Error is raised if IDs are of wrong type. """
+        """Test if Error is raised if IDs are of wrong type."""
         with self.assertRaises(TypeError):
-            publish(PlotIDTransfer(FIG, 3), SRC_DIR, DST_PATH, PIC_NAME)
+            publish(PlotIDTransfer(FIG, 3), SRC_DIR, DST_PATH)
         with self.assertRaises(TypeError):
-            publish(PlotIDTransfer(FIG, ['i', 4]), SRC_DIR, DST_PATH, PIC_NAME)
+            publish(PlotIDTransfer(FIG, ["i", 4]), SRC_DIR, DST_PATH)
 
     def test_publish_multiple_src_files(self):
         """
@@ -92,8 +119,13 @@ class TestPublish(unittest.TestCase):
         """
         files_and_dir = list(SRC_FILES)
         files_and_dir.append(SRC_DIR)
-        publish(FIGS_AND_IDS, files_and_dir, DST_PATH, PIC_NAME_LIST,
-                data_storage='individual')
+        publish(
+            FIGS_AND_IDS,
+            files_and_dir,
+            DST_PATH,
+            plot_names=PIC_NAME_LIST,
+            data_storage="individual",
+        )
         for identifier in IDS_AS_LIST:
             for file in SRC_FILES:
                 path = os.path.join(DST_PATH, identifier)
@@ -101,16 +133,16 @@ class TestPublish(unittest.TestCase):
                 assert os.path.isfile(os.path.join(path, file))
 
     def test_src_directory(self):
-        """ Test if Error is raised when source directory does not exist."""
+        """Test if Error is raised when source directory does not exist."""
         with self.assertRaises(FileNotFoundError):
-            publish(FIGS_AND_IDS, 'not_existing_folder', DST_PATH, PIC_NAME)
+            publish(FIGS_AND_IDS, "not_existing_folder", DST_PATH)
 
     def test_src_directory_type(self):
-        """ Test if Error is raised when source directory is not a string."""
+        """Test if Error is raised when source directory is not a string."""
         with self.assertRaises(TypeError):
-            publish(FIGS_AND_IDS, [SRC_DIR, 4], DST_PATH, PIC_NAME)
+            publish(FIGS_AND_IDS, [SRC_DIR, 4], DST_PATH)
         with self.assertRaises(TypeError):
-            publish(FIGS_AND_IDS, 4, DST_PATH, PIC_NAME)
+            publish(FIGS_AND_IDS, 4, DST_PATH)
 
     def test_dst_directory(self):
         """
@@ -118,8 +150,7 @@ class TestPublish(unittest.TestCase):
         destination dir does not exist.
         """
         with self.assertRaises(FileNotFoundError):
-            publish(FIGS_AND_IDS, SRC_DIR, 'not_existing_folder/data',
-                    PIC_NAME)
+            publish(FIGS_AND_IDS, SRC_DIR, "not_existing_folder/data")
 
     def test_script_exists(self):
         """
@@ -137,30 +168,44 @@ class TestPublish(unittest.TestCase):
             python = "python"
 
         with self.assertRaises(CalledProcessError):
-            run([python, "-c",
-                 "import matplotlib.pyplot as plt\n"
-                 "from plotid.publish import publish\n"
-                 "from plotid.plotoptions import PlotIDTransfer\n"
-                 "publish(PlotIDTransfer(plt.figure(), 'testID2'),"
-                 " 'test_src_folder', 'test_parent/test_dst_folder',"
-                 " 'test_picture')"],
-                capture_output=True, check=True)
-        process = run([python, "-c",
-                       "import matplotlib.pyplot as plt\n"
-                       "from plotid.publish import publish\n"
-                       "from plotid.plotoptions import PlotIDTransfer\n"
-                       "publish(PlotIDTransfer(plt.figure(), 'testID2'), "
-                       "'test_src_folder', 'test_parent/test_dst_folder', "
-                       "'test_picture')"],
-                      capture_output=True)
-        assert ("FileNotFoundError: Cannot copy original python script. "
-                "Running publish from a shell"
-                " is not possible.") in process.stderr.decode()
+            run(
+                [
+                    python,
+                    "-c",
+                    "import matplotlib.pyplot as plt\n"
+                    "from plotid.publish import publish\n"
+                    "from plotid.plotoptions import PlotIDTransfer\n"
+                    "publish(PlotIDTransfer(plt.figure(), 'testID2'),"
+                    " 'test_src_folder', 'test_parent/test_dst_folder')",
+                ],
+                capture_output=True,
+                check=True,
+            )
+        process = run(
+            [
+                python,
+                "-c",
+                "import matplotlib.pyplot as plt\n"
+                "from plotid.publish import publish\n"
+                "from plotid.plotoptions import PlotIDTransfer\n"
+                "publish(PlotIDTransfer(plt.figure(), 'testID2'), "
+                "'test_src_folder', 'test_parent/test_dst_folder')",
+            ],
+            capture_output=True,
+        )
+        assert (
+            "FileNotFoundError: Cannot copy original python script. "
+            "Running publish from a shell"
+            " is not possible."
+        ) in process.stderr.decode()
 
     # Skip test if tests are run from command line.
-    @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
-                     'from a Python script. Therefore, the script cannot be '
-                     'copied.')
+    @unittest.skipIf(
+        not os.path.isfile(sys.argv[0]),
+        "Publish is not called "
+        "from a Python script. Therefore, the script cannot be "
+        "copied.",
+    )
     def test_dst_already_exists_yes(self):
         """
         Test if publish succeeds if the user wants to overwrite an existing
@@ -169,14 +214,16 @@ class TestPublish(unittest.TestCase):
         os.mkdir(DST_PATH)
         os.mkdir(os.path.join(DST_PATH, IDS_AS_LIST[0]))
         # Mock user input as 'yes'
-        with patch('builtins.input', return_value='yes'):
-            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME,
-                    data_storage='individual')
+        with patch("builtins.input", return_value="yes"):
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, data_storage="individual")
 
     # Skip test if tests are run from command line.
-    @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
-                     'from a Python script. Therefore, the script cannot be '
-                     'copied.')
+    @unittest.skipIf(
+        not os.path.isfile(sys.argv[0]),
+        "Publish is not called "
+        "from a Python script. Therefore, the script cannot be "
+        "copied.",
+    )
     def test_dst_already_exists_no(self):
         """
         Test if publish exits with error if the user does not want to overwrite
@@ -186,14 +233,17 @@ class TestPublish(unittest.TestCase):
         os.mkdir(os.path.join(DST_PATH, IDS_AS_LIST[0]))
         os.mkdir(os.path.join(DST_PATH, IDS_AS_LIST[1]))
         # Mock user input as 'no'
-        with patch('builtins.input', return_value='no'):
+        with patch("builtins.input", return_value="no"):
             with self.assertRaises(RuntimeError):
-                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME)
+                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH)
 
     # Skip test if tests are run from command line.
-    @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
-                     'from a Python script. Therefore, the script cannot be '
-                     'copied.')
+    @unittest.skipIf(
+        not os.path.isfile(sys.argv[0]),
+        "Publish is not called "
+        "from a Python script. Therefore, the script cannot be "
+        "copied.",
+    )
     def test_dst_already_exists_empty(self):
         """
         Test if publish exits with error if the user does not want to overwrite
@@ -203,15 +253,17 @@ class TestPublish(unittest.TestCase):
         os.mkdir(os.path.join(DST_PATH, IDS_AS_LIST[0]))
         os.mkdir(os.path.join(DST_PATH, IDS_AS_LIST[1]))
         # Mock user input as empty (no should be default).
-        with patch('builtins.input', return_value=''):
+        with patch("builtins.input", return_value=""):
             with self.assertRaises(RuntimeError):
-                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME,
-                        data_storage='individual')
+                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, data_storage="individual")
 
     # Skip test if tests are run from command line.
-    @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
-                     'from a Python script. Therefore, the script cannot be '
-                     'copied.')
+    @unittest.skipIf(
+        not os.path.isfile(sys.argv[0]),
+        "Publish is not called "
+        "from a Python script. Therefore, the script cannot be "
+        "copied.",
+    )
     def test_dst_invisible_already_exists(self):
         """
         Test if after a crash of publish the partially copied data is
@@ -219,37 +271,37 @@ class TestPublish(unittest.TestCase):
         To mock this, the invisible directory already exists.
         """
         os.mkdir(DST_PATH)
-        invisible_path1 = os.path.join(DST_PATH, '.' + IDS_AS_LIST[0])
+        invisible_path1 = os.path.join(DST_PATH, "." + IDS_AS_LIST[0])
         os.mkdir(invisible_path1)
         # Mock user input as 'yes' for deleting the partial copied data
-        with patch('builtins.input', side_effect=['yes', 'yes']):
+        with patch("builtins.input", side_effect=["yes", "yes"]):
             with self.assertRaises(RuntimeError):
-                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME)
+                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, plot_names=PIC_NAME)
         assert not os.path.isdir(invisible_path1)
-        os.remove('test_picture1.tmp.png')
-        os.remove('test_picture2.tmp.png')
+        os.remove("test_picture1.tmp.png")
+        os.remove("test_picture2.tmp.png")
 
     def test_plot_names(self):
-        """ Test if Error is raised if plot_name is not a string. """
+        """Test if Error is raised if plot_name is not a string."""
         with self.assertRaises(TypeError):
-            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, 7.6,
-                    data_storage='individual')
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, 7.6, data_storage="individual")
         with self.assertRaises(TypeError):
             publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, ())
         with self.assertRaises(TypeError):
-            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, ['test', 3])
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, ["test", 3])
 
     def test_data_storage(self):
         """
         Test if Error is raised when unsupported storage method was chosen.
         """
         with self.assertRaises(ValueError):
-            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME,
-                    data_storage='none_existing_method')
+            publish(
+                FIGS_AND_IDS, SRC_DIR, DST_PATH, data_storage="none_existing_method"
+            )
         with self.assertRaises(TypeError):
-            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME, data_storage=3)
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, data_storage=3)
         with self.assertRaises(TypeError):
-            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME, data_storage=[])
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, data_storage=[])
 
     def test_str(self):
         """
@@ -257,22 +309,23 @@ class TestPublish(unittest.TestCase):
         correct.
         """
         self.maxDiff = None
-        publish_obj = PublishOptions(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME)
+        publish_obj = PublishOptions(FIGS_AND_IDS, SRC_DIR, DST_PATH)
         self.assertIn(
             "<class 'plotid.publish.PublishOptions'>: {'figure': "
             "[<Figure size 640x480 with 0 Axes>, <Figure size"
             " 640x480 with 0 Axes>], 'figure_ids': "
             "['MR05_0x63203c6f', 'MR05_0x63203c70'], "
             "'src_datapaths': 'test_src_folder'",
-            str(publish_obj))
+            str(publish_obj),
+        )
 
     def tearDown(self):
-        """ Delete all files created in setUp. """
+        """Delete all files created in setUp."""
         shutil.rmtree(SRC_DIR)
         shutil.rmtree(DST_PARENT_DIR)
         for file in SRC_FILES:
             os.remove(file)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main()
diff --git a/tests/test_save_plot.py b/tests/test_save_plot.py
index a9f9f059c549f781480a2d51d87d523e68099a32..33e54d83e4eef303cc92566fec18308a85e9910f 100644
--- a/tests/test_save_plot.py
+++ b/tests/test_save_plot.py
@@ -11,9 +11,9 @@ from PIL import Image
 from plotid.save_plot import save_plot
 
 FIGURE = plt.figure()
-PLOT_NAME = 'PLOT_NAME'
-IMG1 = 'image1.png'
-IMG2 = 'image2.jpg'
+PLOT_NAME = "PLOT_NAME"
+IMG1 = "image1.png"
+IMG2 = "image2.jpg"
 
 
 class TestSavePlot(unittest.TestCase):
@@ -30,9 +30,9 @@ class TestSavePlot(unittest.TestCase):
         Test if save_plot succeeds with valid arguments
         using the matplotlib engine.
         """
-        plot_paths = save_plot(FIGURE, [PLOT_NAME], extension='jpg')
+        plot_paths = save_plot(FIGURE, [PLOT_NAME], extension="jpg")
         self.assertIsInstance(plot_paths, list)
-        os.remove(PLOT_NAME + '.tmp.jpg')
+        os.remove(PLOT_NAME + ".tmp.jpg")
 
     def test_save_plot_image_png(self):
         """
@@ -42,7 +42,7 @@ class TestSavePlot(unittest.TestCase):
         img1 = Image.open(IMG1)
         plot_paths = save_plot(img1, [PLOT_NAME])
         self.assertIsInstance(plot_paths, list)
-        os.remove(PLOT_NAME + '.tmp.png')
+        os.remove(PLOT_NAME + ".tmp.png")
 
     def test_save_plot_image_jpg(self):
         """
@@ -51,10 +51,10 @@ class TestSavePlot(unittest.TestCase):
         """
         img2 = Image.open(IMG2)
         imgs_as_list = [img2, img2]
-        plot_paths = save_plot(imgs_as_list, [PLOT_NAME], extension='jpg')
+        plot_paths = save_plot(imgs_as_list, [PLOT_NAME], extension="jpg")
         self.assertIsInstance(plot_paths, list)
-        os.remove(PLOT_NAME + '1.tmp.jpg')
-        os.remove(PLOT_NAME + '2.tmp.jpg')
+        os.remove(PLOT_NAME + "1.tmp.jpg")
+        os.remove(PLOT_NAME + "2.tmp.jpg")
 
     def test_more_figs_than_names(self):
         """
@@ -64,18 +64,18 @@ class TestSavePlot(unittest.TestCase):
         with self.assertWarns(Warning):
             save_plot([FIGURE, FIGURE, FIGURE], [PLOT_NAME])
         for i in (1, 2, 3):
-            assert os.path.isfile(PLOT_NAME + f'{i}.tmp.png')
-            os.remove(PLOT_NAME + f'{i}.tmp.png')
+            assert os.path.isfile(PLOT_NAME + f"{i}.tmp.png")
+            os.remove(PLOT_NAME + f"{i}.tmp.png")
 
     def test_more_names_than_figs(self):
-        """ Test if  Error is raised if more names than figures are given. """
+        """Test if  Error is raised if more names than figures are given."""
         with self.assertRaises(IndexError):
             save_plot([FIGURE, FIGURE], [PLOT_NAME, PLOT_NAME, PLOT_NAME])
 
     def test_wrong_fig_type(self):
-        """ Test if Error is raised when not a figure object is given. """
+        """Test if Error is raised when not a figure object is given."""
         with self.assertRaises(TypeError):
-            save_plot('figure', 'PLOT_NAME', extension='jpg')
+            save_plot("figure", "PLOT_NAME", extension="jpg")
 
     def test_wrong_fig_in_list(self):
         """
@@ -83,13 +83,13 @@ class TestSavePlot(unittest.TestCase):
         valid figures.
         """
         with self.assertRaises(TypeError):
-            save_plot([FIGURE, 'figure', FIGURE], 'PLOT_NAME', extension='jpg')
-        os.remove('PLOT_NAME1.tmp.jpg')
+            save_plot([FIGURE, "figure", FIGURE], "PLOT_NAME", extension="jpg")
+        os.remove("PLOT_NAME1.tmp.jpg")
 
     def tearDown(self):
         os.remove(IMG1)
         os.remove(IMG2)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main()
diff --git a/tests/test_tagplot.py b/tests/test_tagplot.py
index 0eb60acf3929ad122f205ed0414e76832171fede..3bcccc344b54fadef4234e0a91fbcbb4ab539eaf 100644
--- a/tests/test_tagplot.py
+++ b/tests/test_tagplot.py
@@ -13,13 +13,13 @@ from plotid.tagplot import tagplot
 FIG1 = plt.figure()
 FIG2 = plt.figure()
 FIGS_AS_LIST = [FIG1, FIG2]
-IMG1 = 'image1.png'
-IMG2 = 'image2.jpg'
+IMG1 = "image1.png"
+IMG2 = "image2.jpg"
 IMGS_AS_LIST = [IMG1, IMG2]
 
 PROJECT_ID = "MR01"
 PLOT_ENGINE = "matplotlib"
-METHOD = 'time'
+METHOD = "time"
 
 
 class TestTagplot(unittest.TestCase):
@@ -36,30 +36,34 @@ class TestTagplot(unittest.TestCase):
         Test if tagplot runs successful.
         """
         tagplot(FIGS_AS_LIST, PLOT_ENGINE, prefix=PROJECT_ID, id_method=METHOD)
-        tagplot(IMGS_AS_LIST, 'image', location='north')
+        tagplot(IMGS_AS_LIST, "image", location="north")
 
     def test_prefix(self):
-        """ Test if Error is raised if prefix is not a string. """
+        """Test if Error is raised if prefix is not a string."""
         with self.assertRaises(TypeError):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, location='southeast',
-                    prefix=3, id_method=METHOD)
+            tagplot(
+                FIGS_AS_LIST,
+                PLOT_ENGINE,
+                location="southeast",
+                prefix=3,
+                id_method=METHOD,
+            )
 
     def test_plotengine(self):
         """
         Test if Errors are raised if the provided plot engine is not supported.
         """
         with self.assertRaises(ValueError):
-            tagplot(FIGS_AS_LIST, 1, location='north')
+            tagplot(FIGS_AS_LIST, 1, location="north")
         with self.assertRaises(ValueError):
-            tagplot(FIGS_AS_LIST, 'xyz', location='south')
+            tagplot(FIGS_AS_LIST, "xyz", location="south")
 
     def test_idmethod(self):
         """
         Test if Errors are raised if the id_method is not an string.
         """
         with self.assertRaises(TypeError):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, id_method=(0, 1),
-                    location='west')
+            tagplot(FIGS_AS_LIST, PLOT_ENGINE, id_method=(0, 1), location="west")
         with self.assertRaises(TypeError):
             tagplot(FIGS_AS_LIST, PLOT_ENGINE, id_method=1)
         with self.assertRaises(TypeError):
@@ -72,12 +76,12 @@ class TestTagplot(unittest.TestCase):
         with self.assertRaises(TypeError):
             tagplot(FIGS_AS_LIST, PLOT_ENGINE, location=1)
         with self.assertWarns(Warning):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, location='up')
+            tagplot(FIGS_AS_LIST, PLOT_ENGINE, location="up")
 
     def tearDown(self):
         os.remove(IMG1)
         os.remove(IMG2)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main()
diff --git a/tests/test_tagplot_image.py b/tests/test_tagplot_image.py
index 2c236c57bccd97748def00665fcf509d10a343b8..a14b4b9ea545812b04fce5900a8039423db302dd 100644
--- a/tests/test_tagplot_image.py
+++ b/tests/test_tagplot_image.py
@@ -13,14 +13,14 @@ from plotid.plotoptions import PlotOptions
 
 
 FIG1 = plt.figure()
-IMG1 = 'image1.png'
+IMG1 = "image1.png"
 FIG2 = plt.figure()
-IMG2 = 'image2.jpg'
+IMG2 = "image2.jpg"
 IMGS_AS_LIST = [IMG1, IMG2]
 
 # Constants for tests
 PROJECT_ID = "MR01"
-METHOD = 'time'
+METHOD = "time"
 ROTATION = 90
 POSITION = (0.975, 0.35)
 
@@ -39,14 +39,18 @@ class TestTagplotImage(unittest.TestCase):
         Test of returned objects. Check if they are png and jpg files,
         respectively.
         """
-        options = PlotOptions(IMGS_AS_LIST, ROTATION, POSITION,
-                              prefix=PROJECT_ID, id_method=METHOD, qrcode=True)
+        options = PlotOptions(
+            IMGS_AS_LIST,
+            ROTATION,
+            POSITION,
+            prefix=PROJECT_ID,
+            id_method=METHOD,
+            qrcode=True,
+        )
         options.validate_input()
         figs_and_ids = tagplot_image(options)
-        self.assertIsInstance(figs_and_ids.figs[0],
-                              PngImagePlugin.PngImageFile)
-        self.assertIsInstance(figs_and_ids.figs[1],
-                              JpegImagePlugin.JpegImageFile)
+        self.assertIsInstance(figs_and_ids.figs[0], PngImagePlugin.PngImageFile)
+        self.assertIsInstance(figs_and_ids.figs[1], JpegImagePlugin.JpegImageFile)
 
     def test_single_image(self):
         """
@@ -56,20 +60,20 @@ class TestTagplotImage(unittest.TestCase):
         options = PlotOptions(IMG1, ROTATION, POSITION)
         options.validate_input()
         figs_and_ids = tagplot_image(options)
-        self.assertIsInstance(figs_and_ids.figs[0],
-                              PngImagePlugin.PngImageFile)
+        self.assertIsInstance(figs_and_ids.figs[0], PngImagePlugin.PngImageFile)
 
     def test_image_not_str(self):
-        """ Test if Error is raised if wrong type of image is given. """
-        options = PlotOptions(3, ROTATION, POSITION,
-                              prefix=PROJECT_ID, id_method=METHOD)
+        """Test if Error is raised if wrong type of image is given."""
+        options = PlotOptions(
+            3, ROTATION, POSITION, prefix=PROJECT_ID, id_method=METHOD
+        )
         options.validate_input()
         with self.assertRaises(TypeError):
             tagplot_image(options)
 
     def test_image_not_file(self):
-        """ Test if Error is raised if the image file does not exist. """
-        options = PlotOptions('xyz', ROTATION, POSITION)
+        """Test if Error is raised if the image file does not exist."""
+        options = PlotOptions("xyz", ROTATION, POSITION)
         options.validate_input()
         with self.assertRaises(TypeError):
             tagplot_image(options)
@@ -79,12 +83,12 @@ class TestTagplotImage(unittest.TestCase):
         Test if Error is raised if not an instance of PlotOptions is passed.
         """
         with self.assertRaises(TypeError):
-            tagplot_image('wrong_object')
+            tagplot_image("wrong_object")
 
     def tearDown(self):
         os.remove(IMG1)
         os.remove(IMG2)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main()
diff --git a/tests/test_tagplot_matplotlib.py b/tests/test_tagplot_matplotlib.py
index 87cc22bfbce4422105aabdb9f1286f5e55e608a5..3bda534dfec8e16646b5ee06dfb30586a75c77ac 100644
--- a/tests/test_tagplot_matplotlib.py
+++ b/tests/test_tagplot_matplotlib.py
@@ -17,7 +17,7 @@ FIGS_AS_LIST = [FIG1, FIG2]
 
 # Constants for tests
 PROJECT_ID = "MR01"
-METHOD = 'time'
+METHOD = "time"
 ROTATION = 90
 POSITION = (0.975, 0.35)
 
@@ -28,9 +28,15 @@ class TestTagplotMatplotlib(unittest.TestCase):
     """
 
     def test_mplfigures(self):
-        """ Test of returned objects. Check if they are matplotlib figures. """
-        options = PlotOptions(FIGS_AS_LIST, ROTATION, POSITION,
-                              prefix=PROJECT_ID, id_method=METHOD, qrcode=True)
+        """Test of returned objects. Check if they are matplotlib figures."""
+        options = PlotOptions(
+            FIGS_AS_LIST,
+            ROTATION,
+            POSITION,
+            prefix=PROJECT_ID,
+            id_method=METHOD,
+            qrcode=True,
+        )
         options.validate_input()
         figs_and_ids = tagplot_matplotlib(options)
         self.assertIsInstance(figs_and_ids.figs[0], Figure)
@@ -47,7 +53,7 @@ class TestTagplotMatplotlib(unittest.TestCase):
         self.assertIsInstance(figs_and_ids.figs[0], Figure)
 
     def test_mplerror(self):
-        """ Test if Error is raised if wrong type of figures is given. """
+        """Test if Error is raised if wrong type of figures is given."""
         options = PlotOptions(3, ROTATION, POSITION)
         options.validate_input()
         with self.assertRaises(TypeError):
@@ -58,8 +64,8 @@ class TestTagplotMatplotlib(unittest.TestCase):
         Test if Error is raised if not an instance of PlotOptions is passed.
         """
         with self.assertRaises(TypeError):
-            tagplot_matplotlib('wrong_object')
+            tagplot_matplotlib("wrong_object")
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main()