diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 94dffe1a3e0f0de5dec1ce01e6962d660612c462..3972355ace1c155bbb294de979a55b749cbc0c27 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -63,7 +63,6 @@ test:
 
 pages:
   stage: docs
-  when: manual
   script:
   - pip install -U sphinx sphinx-autoapi sphinx_rtd_theme # sphinx_panels
   - cd docs
@@ -72,7 +71,9 @@ pages:
   artifacts:
     paths:
     - public
-
+  rules:
+   - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
+   - when: manual
 
 # Commenting out all other stages and jobs
 #run:
diff --git a/examples/example_image1.png b/examples/example_image1.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe0d91339e7e24fbdf4a01aeee61634c28643026
Binary files /dev/null and b/examples/example_image1.png differ
diff --git a/examples/example_image2.png b/examples/example_image2.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca9bf477a3e9ab3720bdff6b39887425145749ec
Binary files /dev/null and b/examples/example_image2.png differ
diff --git a/examples/image_example.py b/examples/image_example.py
new file mode 100644
index 0000000000000000000000000000000000000000..29f173d7c7174459f0d8ec95be3fdcd893caead6
--- /dev/null
+++ b/examples/image_example.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+"""
+Example workflow for integrating plotID with jpg or png images.
+
+With tagplot() an ID can be generated and printed on the plot. To export the
+plot along with the corresponding research data and the plot generating
+script use the function publish().
+"""
+
+# %% Import modules
+from plotid.tagplot import tagplot
+from plotid.publish import publish
+
+# %% Set optional Project ID, which will be placed in front of the generated ID
+PROJECT_ID = "MR05_"
+
+# %% Read example images
+IMG1 = 'example_image1.png'
+IMG2 = 'example_image2.png'
+
+# %% TagPlot
+
+# If multiple images should be tagged, they must be provided as list.
+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')
+# Required arguments: tagplot(images as list, desired plot engine)
+
+
+# %% Publish
+
+# 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')
+# Required arguments: publish(output of tagplot(), list of files,
+# path to destination folder, name(s) for the resulting images)
diff --git a/plotid/example.py b/examples/matplotlib_example.py
similarity index 54%
rename from plotid/example.py
rename to examples/matplotlib_example.py
index 7e41ff8141faee4152dfb48dd15f945518da4fa6..302b7a4edbd7f868b984b6d9e32e774cf5b2d7d3 100644
--- a/plotid/example.py
+++ b/examples/matplotlib_example.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 """
-Example workflow for integrating plotID.
+Example workflow for integrating plotID with matplotlib figures.
 
 With tagplot() an ID can be generated and printed on the plot. To export the
 plot along with the corresponding research data and the plot generating
@@ -14,7 +14,7 @@ from plotid.tagplot import tagplot
 from plotid.publish import publish
 
 # %% Set Project ID
-PROJECT_ID = "MR04_"
+PROJECT_ID = "MR05_"
 
 # %% Create sample data
 x = np.linspace(0, 10, 100)
@@ -24,37 +24,28 @@ y_2 = np.sin(x) + 2
 # %% Create sample figures
 
 # 1. figure
-IMG1 = 'image1.png'
 FIG1 = plt.figure()
 plt.plot(x, y, color='black')
 plt.plot(x, y_2, color='yellow')
-plt.savefig(IMG1)
 
 # 2. figure
-IMG2 = 'image2.png'
 FIG2 = plt.figure()
 plt.plot(x, y, color='blue')
 plt.plot(x, y_2, color='red')
-plt.savefig(IMG2)
 
-# %% TagPlot
+# %% tagplot
 
 # If multiple figures should be tagged, figures must be provided as list.
 FIGS_AS_LIST = [FIG1, FIG2]
-IMGS_AS_LIST = [IMG1, IMG2]
 
 # Example for how to use tagplot with matplotlib figures
-[TAGGED_FIGS, ID] = tagplot(FIGS_AS_LIST, 'matplotlib', prefix=PROJECT_ID,
-                            id_method='time', location='west')
-
-# Example for how to use tagplot with image files
-# [TAGGED_FIGS, ID] = tagplot(IMGS_AS_LIST, 'image', prefix=PROJECT_ID,
-#                            id_method='random', location='west')
+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
-# Arguments: Source directory or files as list, destination directory, figures,
-# plots or images.
 
-publish(['../README.md', '../docs', '../LICENSE'],
-        '/home/chief/Dokumente/fst/plotid_python/data',
-        TAGGED_FIGS, 'Bild')
+publish(FIGS_AND_IDS, ['../README.md', '../docs', '../LICENSE'],
+        './data', 'my_plot')
+# Required arguments: publish(output of tagplot(), list of files,
+# path to destination folder, name(s) for the resulting images)
diff --git a/plotid/create_id.py b/plotid/create_id.py
index 450e2dae6c2608a210849d5120c692986c3a7da4..f28d94ae18e32fd835561a9cdbbc942f7b6660bc 100644
--- a/plotid/create_id.py
+++ b/plotid/create_id.py
@@ -3,28 +3,34 @@
 Create an identifier to print it on a plot.
 
 Functions:
-    create_id(str) -> string
+    create_id(str) -> str
 """
 import time
 import uuid
+import qrcode
 
 
 def create_id(id_method):
     """
     Create an Identifier (str).
 
-    Creates an (sometimes unique) identifier based on the selected method
-    if no method is selected method 1 will be the default method
+    Creates an (sometimes unique) identifier based on the selected method.
+
+    Parameters
+    ----------
+    id_method : str
+        id_method for creating the ID. Create an ID by Unix time is referenced
+        as 'time', create a random ID with id_method='random'.
 
     Returns
     -------
-    figure_id
+    figure_id : str
     """
     match id_method:
         case 'time':
             figure_id = time.time()  # UNIX Time
-            figure_id = hex(int(figure_id))  # convert time to hexadecimal
-            time.sleep(0.5)   # break for avoiding duplicate IDs
+            figure_id = hex(int(figure_id))  # convert time to hexadecimal str
+            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
@@ -35,3 +41,24 @@ def create_id(id_method):
                 '"time": Unix time converted to hexadecimal\n'
                 '"random": Random UUID')
     return figure_id
+
+
+def create_qrcode(figure_id):
+    """
+    Create a QR Code from an identifier.
+
+    Parameters
+    ----------
+    figure_id : str
+        Identifier which will be embedded in the qrcode.
+
+    Returns
+    -------
+    QR Code as PilImage.
+    """
+    qrc = qrcode.QRCode(version=1, box_size=10, border=0)
+    qrc.add_data(figure_id)
+    qrc.make(fit=True)
+    img = qrc.make_image(fill_color="black", back_color="white")
+
+    return img
diff --git a/plotid/plotoptions.py b/plotid/plotoptions.py
index 163a1c1bfc622fc48fc18011e1a7e1b8e4062b9a..41e4ba80b9363e85f85636e3d41e4d4eebfb4ad0 100644
--- a/plotid/plotoptions.py
+++ b/plotid/plotoptions.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
-"""Contains the PlotOptions and PublishOptions class."""
+"""Contains the PlotOptions and PlotIDTransfer classes."""
 
 
 class PlotOptions:
@@ -14,25 +14,42 @@ class PlotOptions:
 
     Attributes
     ----------
-    figs : figure object
-        Figure that will be tagged.
-    prefix : str
-        Prefix that is placed before the ID.
-    id_method : str
-        Method that decides which method is used to generate the ID.
+    figs : figure object or list of figures
+        Figures that will be tagged.
+    figure_ids: str or list of str
+        IDs that the figures are tagged with.
     rotation : int
         Rotation angle for the ID.
     position : tuple
         Relative position of the ID on the plot (x,y).
+    **kwargs : dict, optional
+        Extra arguments for additional plot options.
+
+    Other Parameters
+    ----------------
+    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'.
+    qrcode : bool, optional
+        Experimental status. Print qrcode on exported plot. Default: False.
     """
 
-    def __init__(self, figs, prefix, id_method, rotation, position):
+    def __init__(self, figs, rotation, position, **kwargs):
 
         self.figs = figs
-        self.prefix = prefix
-        self.id_method = id_method
+        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)
+
+    def __str__(self):
+        """Representation if an object of this class is printed."""
+        return str(self.__class__) + ": " + str(self.__dict__)
 
     def validate_input(self):
         """
@@ -61,3 +78,29 @@ class PlotOptions:
             self.figs = [self.figs]
 
         return 0
+
+
+class PlotIDTransfer:
+    """
+    Container to transfer objects from tagplot() to publish().
+
+    Methods
+    -------
+    __init__
+    validate_input : Check if input is correct type.
+
+    Attributes
+    ----------
+    figs : figure object or list of figures
+        Tagged figures.
+    figure_ids: str or list of str
+        IDs that the figures are tagged with.
+    """
+
+    def __init__(self, figs, figure_ids):
+        self.figs = figs
+        self.figure_ids = figure_ids
+
+    def __str__(self):
+        """Representation if an object of this class is printed."""
+        return str(self.__class__) + ": " + str(self.__dict__)
diff --git a/plotid/publish.py b/plotid/publish.py
index 79a926bd592b2061d913c2f686d76379a1191db7..8d55b26a2ba838a6fab46d19bb08025277119203 100644
--- a/plotid/publish.py
+++ b/plotid/publish.py
@@ -8,7 +8,8 @@ the plot is based on. Additionally, the script that produced the plot will be
 copied to the destination directory.
 
 Functions:
-    publish(str, str, figure, str, str) -> None
+    publish(PlotIDTransfer object, str or list of str, str or list of str)
+    -> None
 """
 
 import os
@@ -16,6 +17,7 @@ import shutil
 import sys
 import warnings
 from plotid.save_plot import save_plot
+from plotid.plotoptions import PlotIDTransfer
 
 
 class PublishOptions:
@@ -25,36 +27,37 @@ class PublishOptions:
     Methods
     -------
     __init__
-    validate_input: Check if input is correct type.
-
-    Attributes
-    ----------
-    src_datapaths : str or list of str
-        Path(s) to data that should be published.
-    dst_path : str
-        Path to the destination directory.
-    figure : figure object
-        Figure that was tagged and now should be saved as picture.
-    plot_name : str
-        Name for the exported plot.
-    data_storage : str
-        Method how the data should be stored. Available options:
-            centralized : The data files will copied only once. All other plots
-                will reference this data via sym link.
-            individual [default]: The complete data files will be copied to a
-                separate folder for every plot.
+    validate_input
+        Check if input is correct type.
+    export
+        Export the plot and copy specified files to the destiantion folder.
     """
 
-    def __init__(self, src_datapaths, dst_path, figure, plot_names,
-                 data_storage='individual'):
+    def __init__(self, figs_and_ids, src_datapaths, dst_path, plot_names,
+                 **kwargs):
 
+        if not isinstance(figs_and_ids, 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 = dst_path
-        self.figure = figure
         self.plot_names = plot_names
-        self.data_storage = data_storage
+        self.data_storage = kwargs.get('data_storage', 'individual')
         self.dst_path_head, self.dst_dirname = os.path.split(self.dst_path)
 
+        # If the second string after os.path.split is empty,
+        # a trailing slash was given.
+        # To get the dir name correctly, split the first string again.
+        if not self.dst_dirname:
+            self.dst_path_head, self.dst_dirname = os.path.split(
+                self.dst_path_head)
+
+    def __str__(self):
+        """Representation if an object of this class is printed."""
+        return str(self.__class__) + ": " + str(self.__dict__)
+
     def validate_input(self):
         """
         Validate if input for PublishOptions is correct type.
@@ -72,6 +75,18 @@ class PublishOptions:
         None.
 
         """
+        # Check if IDs are str
+        if isinstance(self.figure_ids, str):
+            self.figure_ids = [self.figure_ids]
+        if isinstance(self.figure_ids, list):
+            for identifier in self.figure_ids:
+                if not isinstance(identifier, str):
+                    raise TypeError('The list of figure_ids contains an object'
+                                    ' which is not a string.')
+        else:
+            raise TypeError('The specified figure_ids are neither a string nor'
+                            ' a list of strings.')
+
         if not os.path.isfile(sys.argv[0]):
             raise FileNotFoundError('Cannot copy original python script. '
                                     'Running publish from a shell is not '
@@ -115,7 +130,7 @@ class PublishOptions:
 
     def export(self):
         """
-        Export the plot and copy specified files to the destiantion folder.
+        Export the plot and copy specified files to the destination folder.
 
         Raises
         ------
@@ -131,50 +146,57 @@ class PublishOptions:
         """
         # Export plot figure to picture.
         plot_paths = save_plot(self.figure, self.plot_names)
-
-        # If dst dir already exists ask user if it should be overwritten.
-        if os.path.isdir(self.dst_path):
-            warnings.warn(f'Folder "{self.dst_dirname}" 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'):
-                shutil.rmtree(self.dst_path)
-            else:
-                raise RuntimeError('publish has finished without an export.\n'
-                                   'Rerun TagPlot if you need a new ID or '
-                                   'consider overwriting.')
-
-        # Create invisible folder
-        dst_path_invisible = os.path.join(self.dst_path_head,
-                                          '.' + self.dst_dirname)
-
+        print(plot_paths)
         match self.data_storage:
             case 'centralized':
                 self.centralized_data_storage()
             case 'individual':
-                try:
-                    self.individual_data_storage(dst_path_invisible,
-                                                 plot_paths)
-                except Exception as exc:
-                    delete_dir = input('There was an error while publishing'
-                                       ' the data. Should the partially copied'
-                                       f' data at {dst_path_invisible} be'
-                                       ' removed? (yes/no[default])\n')
-                    if delete_dir in ('yes', 'y'):
-                        shutil.rmtree(dst_path_invisible)
-                    raise RuntimeError('Publishing was unsuccessful. '
-                                       'Try re-running publish.') from exc
+                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])
+
+                        # 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'):
+                                shutil.rmtree(dst_path)
+                            else:
+                                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'):
+                            shutil.rmtree(dst_path_invisible)
+                        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.')
 
-        # If export was successful, make the directory visible
-        os.rename(dst_path_invisible, self.dst_path)
-        print(f'Publish was successful.\nYour plot(s) {plot_paths},\nyour'
-              f' data {self.src_datapaths}\nand your script {sys.argv[0]}\n'
-              f'were copied to {self.dst_path}\nin {self.data_storage} mode.')
+        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):
         """
@@ -189,13 +211,13 @@ class PublishOptions:
         """
         # Does nothing, not implemented yet
 
-    def individual_data_storage(self, destination, pic_paths):
+    def individual_data_storage(self, destination, pic_path):
         """
         Store all the data in an individual directory.
 
         Parameters
         ----------
-        destination : string
+        destination : str
             Directory where the data should be stored.
         pic_paths : list
             Paths to the picture file that will be stored in destination.
@@ -218,29 +240,40 @@ class PublishOptions:
 
         # Copy script that calls this function to folder
         shutil.copy2(sys.argv[0], destination)
-        # Copy plot files to folder
-        for path in pic_paths:
-            if os.path.isfile(path):
-                shutil.copy2(path, destination)
-                os.remove(path)
 
+        if os.path.isfile(pic_path):
+            # Copy plot file to folder
+            shutil.copy2(pic_path, destination)
+            # Remove by plotID exported .tmp plot
+            os.remove(pic_path)
+            # Remove .tmp. from file name in destinaion
+            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))
 
-def publish(src_datapath, dst_path, figure, plot_name,
-            data_storage='individual'):
+
+def publish(figs_and_ids, src_datapath, dst_path, plot_name, **kwargs):
     """
     Save plot, data and measuring script.
 
     Parameters
     ----------
-    src_datapath : str
+    figs_and_ids : PlotIDTransfer object
+        Contains figures tagged by tagplot() and their corresponding IDs.
+    src_datapath : str or list of str
         Path to data that should be published.
     dst_path : str
         Path to the destination directory.
-    figure : figure object
-        Figure that was tagged and now should be saved as picture.
-    plot_name : str
+     plot_name : str or list of str
         Name for the exported plot.
-    data_storage : str
+    **kwargs : dict, optional
+        Extra arguments for additional publish options.
+
+    Other Parameters
+    ----------------
+    data_storage : str, optional
         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.
@@ -252,7 +285,7 @@ def publish(src_datapath, dst_path, figure, plot_name,
     None.
 
     """
-    publish_container = PublishOptions(src_datapath, dst_path, figure,
-                                       plot_name, data_storage)
+    publish_container = PublishOptions(figs_and_ids, src_datapath, dst_path,
+                                       plot_name, **kwargs)
     publish_container.validate_input()
     publish_container.export()
diff --git a/plotid/save_plot.py b/plotid/save_plot.py
index 8642c4aa2470599b8207ea11b5c659463638609c..5cf6f3b57a44f39e139d10af27d7bdcc4d18ae02 100644
--- a/plotid/save_plot.py
+++ b/plotid/save_plot.py
@@ -4,7 +4,7 @@
 Export a plot figure to a picture file.
 
 Functions:
-    save_plot(figure, string) -> path-like
+    save_plot(figure, str) -> path-like
 """
 
 import warnings
@@ -20,16 +20,15 @@ def save_plot(figures, plot_names, extension='png'):
     ----------
     figure : list of/single figure object
         Figure that was tagged and now should be saved as picture.
-    plot_name : list of strings
+    plot_name : str or list of str
         Names of the files where the plots will be saved to.
     extension : str
         File extension for the plot export.
 
     Returns
     -------
-    plot_path : list
+    plot_path : str or list of str
         Names of the created pictures.
-
     """
     # Check if figs is a valid figure or a list of valid figures
     if isinstance(figures, matplotlib.figure.Figure):
@@ -58,10 +57,10 @@ def save_plot(figures, plot_names, extension='png'):
     for i, fig in enumerate(figures):
         if isinstance(fig, matplotlib.figure.Figure):
             plt.figure(fig)
-            plot_path.append(plot_names[i] + '.' + 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] + '.' + extension)
+            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.')
diff --git a/plotid/tagplot.py b/plotid/tagplot.py
index 596679a5c335558641b63ac2aa0be4156d351a48..41d4ae6db8e0936fe2b2b7584a3b94c519ad8010 100644
--- a/plotid/tagplot.py
+++ b/plotid/tagplot.py
@@ -16,27 +16,32 @@ from plotid.tagplot_matplotlib import tagplot_matplotlib
 from plotid.tagplot_image import tagplot_image
 
 
-def tagplot(figs, engine, prefix='', id_method='time', location='east'):
+def tagplot(figs, engine, location='east', **kwargs):
     """
     Tag your figure/plot with an ID.
 
-    After determining the plot engine, TagPlot calls the corresponding
+    After determining the plot engine, tagplot calls the corresponding
     function which tags the plot.
 
     Parameters
     ----------
     figs : list
         Figures that should be tagged.
-    engine : string
+    engine : str
         Plot engine which should be used to tag the plot.
-    prefix : string
+    location : str, optional
+        Location for ID to be displayed on the plot. Default is 'east'.
+    **kwargs : dict, optional
+        Extra arguments for additional plot options.
+
+    Other Parameters
+    ----------------
+    prefix : str, optional
         Will be added as prefix to the ID.
-    id_method : string, optional
+    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'.
-    location : string, optional
-        Location for ID to be displayed on the plot. Default is 'east'.
 
     Raises
     ------
@@ -75,8 +80,7 @@ def tagplot(figs, engine, prefix='', id_method='time', location='east'):
             position = (0.75, 0.015)
         case 'custom':
             # TODO: Get rotation and position from user input & check if valid
-            rotation = 0
-            position = (0.5, 0.5)
+            pass
         case _:
             warnings.warn(f'Location "{location}" is not a defined '
                           'location, TagPlot uses location "east" '
@@ -84,8 +88,7 @@ def tagplot(figs, engine, prefix='', id_method='time', location='east'):
             rotation = 90
             position = (0.975, 0.35)
 
-    option_container = PlotOptions(figs, prefix, id_method,
-                                   rotation, position)
+    option_container = PlotOptions(figs, rotation, position, **kwargs)
     option_container.validate_input()
 
     match engine:
diff --git a/plotid/tagplot_image.py b/plotid/tagplot_image.py
index 104352c9066ccd4631c7e8117926a4863c1a8ce5..05b4ab13a6f166c5c31f603c5a4f713e59876536 100644
--- a/plotid/tagplot_image.py
+++ b/plotid/tagplot_image.py
@@ -7,8 +7,8 @@ Functions:
 """
 import os
 from PIL import Image, ImageDraw, ImageFont, ImageOps
-from plotid.create_id import create_id
-from plotid.plotoptions import PlotOptions
+from plotid.create_id import create_id, create_qrcode
+from plotid.plotoptions import PlotOptions, PlotIDTransfer
 
 
 def tagplot_image(plotid_object):
@@ -17,7 +17,14 @@ def tagplot_image(plotid_object):
 
     The ID is placed visual on the figure window and returned as string in a
     list together with the figures.
-    TagPlot can tag multiple figures at once.
+
+    Parameters
+    ----------
+    plotid_object : instance of PlotOptions
+
+    Returns
+    -------
+    PlotIDTransfer object
     """
     # Check if plotid_object is a valid instance of PlotOptions
     if not isinstance(plotid_object, PlotOptions):
@@ -32,13 +39,12 @@ def tagplot_image(plotid_object):
             raise TypeError('File does not exist.')
             # Check if figs is a valid file is done by pillow internally
 
-    ids_as_list = []
     color = (128, 128, 128)  # grey
     font = ImageFont.load_default()
 
     for i, img in enumerate(plotid_object.figs):
         img_id = plotid_object.prefix + create_id(plotid_object.id_method)
-        ids_as_list.append(img_id)
+        plotid_object.figure_ids.append(img_id)
         img = Image.open(img)
 
         img_txt = Image.new('L', font.getsize(img_id))
@@ -49,5 +55,11 @@ def tagplot_image(plotid_object):
                   (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))
         plotid_object.figs[i] = img
-    return [plotid_object.figs, ids_as_list]
+
+    figs_and_ids = PlotIDTransfer(plotid_object.figs, plotid_object.figure_ids)
+    return figs_and_ids
diff --git a/plotid/tagplot_matplotlib.py b/plotid/tagplot_matplotlib.py
index 34f06cfe8629238a893ea64b4d7a55ecf8da6c21..eef060cde9d38883e40a129703ecaedc8b482288 100644
--- a/plotid/tagplot_matplotlib.py
+++ b/plotid/tagplot_matplotlib.py
@@ -8,8 +8,9 @@ Functions:
 
 import matplotlib
 import matplotlib.pyplot as plt
-from plotid.create_id import create_id
-from plotid.plotoptions import PlotOptions
+from PIL import Image
+from plotid.create_id import create_id, create_qrcode
+from plotid.plotoptions import PlotOptions, PlotIDTransfer
 
 
 def tagplot_matplotlib(plotid_object):
@@ -18,7 +19,14 @@ def tagplot_matplotlib(plotid_object):
 
     The ID is placed visual on the figure window and returned as string in a
     list together with the figures.
-    TagPlot can tag multiple figures at once.
+
+    Parameters
+    ----------
+    plotid_object : instance of PlotOptions
+
+    Returns
+    -------
+    PlotIDTransfer object
     """
     # Check if plotid_object is a valid instance of PlotOptions
     if not isinstance(plotid_object, PlotOptions):
@@ -32,18 +40,24 @@ def tagplot_matplotlib(plotid_object):
 
     fontsize = 'small'
     color = 'grey'
-    ids_as_list = []
 
     # Loop to create and position the IDs
     for fig in plotid_object.figs:
-        figure_id = create_id(plotid_object.id_method)
-        figure_id = plotid_object.prefix + str(figure_id)
-        ids_as_list.append(figure_id)
+        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=figure_id, ha='left', wrap=True,
+                    s=fig_id, ha='left', wrap=True,
                     rotation=plotid_object.rotation,
                     fontsize=fontsize, color=color)
-        fig.tight_layout()
-    return [plotid_object.figs, ids_as_list]
+
+        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.tight_layout()
+
+    figs_and_ids = PlotIDTransfer(plotid_object.figs, plotid_object.figure_ids)
+    return figs_and_ids
diff --git a/requirements.txt b/requirements.txt
index a70ca0a9a91df50dc4885d797a31f7c128ce6f35..2852cbf877c24388285007a33e824e59bb1120a9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,4 +8,5 @@ packaging==21.3
 Pillow==9.1.0
 pyparsing==3.0.8
 python-dateutil==2.8.2
+qrcode==7.3.1
 six==1.16.0
diff --git a/tests/test_create_id.py b/tests/test_create_id.py
index b47ae91a384be0845f55c758648d8f5e4feaee5e..2f8e4b2b669b49a8f295ba7f60799e89804b02b5 100644
--- a/tests/test_create_id.py
+++ b/tests/test_create_id.py
@@ -5,7 +5,9 @@ Unittests for create_id
 """
 
 import unittest
+import qrcode
 import plotid.create_id as cid
+from plotid.create_id import create_qrcode
 
 
 class TestCreateID(unittest.TestCase):
@@ -30,6 +32,11 @@ class TestCreateID(unittest.TestCase):
         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)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_plotoptions.py b/tests/test_plotoptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..87b4f306f5781172f54f209397e3a463185d968b
--- /dev/null
+++ b/tests/test_plotoptions.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Unittests for plotoptions.
+"""
+
+import unittest
+from plotid.plotoptions import PlotOptions, PlotIDTransfer
+
+ROTATION = 270
+POSITION = (100, 200)
+
+
+class TestTagplot(unittest.TestCase):
+    """
+    Class for all unittests of the plotoptions module.
+    """
+
+    def test_validate_input(self):
+        """
+        Test if input validation runs successful.
+        """
+        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. """
+        with self.assertRaises(TypeError):
+            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. """
+        with self.assertRaises(TypeError):
+            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}")
+
+    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': []}")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/test_publish.py b/tests/test_publish.py
index 159f2be0c0ab8f57d7e1055d24035f3c663d1a6c..7a9c5d87f0971d22ea6f83fea010368f068e09eb 100644
--- a/tests/test_publish.py
+++ b/tests/test_publish.py
@@ -12,7 +12,8 @@ import shutil
 from subprocess import run, CalledProcessError
 from unittest.mock import patch
 import matplotlib.pyplot as plt
-from plotid.publish import publish
+from plotid.publish import publish, PublishOptions
+from plotid.plotoptions import PlotIDTransfer
 
 
 SRC_DIR = 'test_src_folder'
@@ -21,10 +22,11 @@ PIC_NAME = 'test_picture'
 DST_DIR = 'test_dst_folder'
 DST_PARENT_DIR = 'test_parent'
 DST_PATH = os.path.join(DST_PARENT_DIR, DST_DIR)
-INVISIBLE_PATH = os.path.join(DST_PARENT_DIR, '.' + DST_DIR)
-FIG = plt.figure()
-FIG2 = plt.figure()
+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']
+FIGS_AND_IDS = PlotIDTransfer(FIGS_AS_LIST, IDS_AS_LIST)
 PIC_NAME_LIST = [PIC_NAME, 'second_picture']
 
 
@@ -46,8 +48,10 @@ class TestPublish(unittest.TestCase):
                      'copied.')
     def test_publish(self):
         """ Test publish and check if an exported picture file exists. """
-        publish(SRC_DIR, DST_PATH, FIG, PIC_NAME, 'individual')
-        assert os.path.isfile(os.path.join(DST_PATH, PIC_NAME + '.png'))
+        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'))
 
     # Skip test if tests are run from command line.
     @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
@@ -58,9 +62,25 @@ class TestPublish(unittest.TestCase):
         Test publish with multiple figures and check if all exported picture
         files exist.
         """
-        publish(SRC_DIR, DST_PATH, FIGS_AS_LIST, PIC_NAME_LIST, 'individual')
-        for name in PIC_NAME_LIST:
-            assert os.path.isfile(os.path.join(DST_PATH, name + '.png'))
+        publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, 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'))
+
+    def test_figs_and_ids(self):
+        """
+        Test if RuntimeError is raised when figs_and_ids is not an
+        PlotIDTransfer object.
+        """
+        with self.assertRaises(RuntimeError):
+            publish('FIGS_AND_IDS', SRC_DIR, DST_PATH, PIC_NAME_LIST)
+
+    def test_wrong_ids(self):
+        """ 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)
+        with self.assertRaises(TypeError):
+            publish(PlotIDTransfer(FIG, ['i', 4]), SRC_DIR, DST_PATH, PIC_NAME)
 
     def test_publish_multiple_src_files(self):
         """
@@ -69,30 +89,30 @@ class TestPublish(unittest.TestCase):
         """
         files_and_dir = list(SRC_FILES)
         files_and_dir.append(SRC_DIR)
-        publish(files_and_dir, DST_PATH, FIGS_AS_LIST, PIC_NAME_LIST,
-                'individual')
-        assert os.path.isdir(DST_PATH)
-        for file in SRC_FILES:
-            assert os.path.isfile(os.path.join(DST_PATH, file))
+        publish(FIGS_AND_IDS, files_and_dir, DST_PATH, PIC_NAME_LIST,
+                data_storage='individual')
+        for identifier in IDS_AS_LIST:
+            for file in SRC_FILES:
+                path = os.path.join(DST_PATH, identifier)
+                assert os.path.isdir(path)
+                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."""
         with self.assertRaises(FileNotFoundError):
-            publish('not_existing_folder', DST_PATH, FIG,
-                    PIC_NAME, 'individual')
+            publish(FIGS_AND_IDS, 'not_existing_folder', DST_PATH, PIC_NAME)
 
     def test_src_directory_type(self):
         """ Test if Error is raised when source directory is not a string."""
         with self.assertRaises(TypeError):
-            publish([SRC_DIR, 4], DST_PATH, FIG, PIC_NAME, 'individual')
+            publish(FIGS_AND_IDS, [SRC_DIR, 4], DST_PATH, PIC_NAME)
         with self.assertRaises(TypeError):
-            publish(4, DST_PATH, FIG, PIC_NAME, 'individual')
+            publish(FIGS_AND_IDS, 4, DST_PATH, PIC_NAME)
 
     def test_dst_directory(self):
         """ Test if Error is raised when destination dir does not exist."""
         with self.assertRaises(FileNotFoundError):
-            publish(SRC_DIR, 'not_existing_folder',
-                    FIG, PIC_NAME, 'individual')
+            publish(FIGS_AND_IDS, SRC_DIR, 'not_existing_folder', PIC_NAME)
 
     def test_script_exists(self):
         """
@@ -113,14 +133,17 @@ class TestPublish(unittest.TestCase):
             run([python, "-c",
                  "import matplotlib.pyplot as plt\n"
                  "from plotid.publish import publish\n"
-                 "publish('test_src_folder', 'test_parent/test_dst_folder',"
-                 " plt.figure(), 'test_picture')"],
+                 "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"
-                       "publish('test_src_folder', "
-                       "'test_parent/test_dst_folder', plt.figure(), "
+                       "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. "
@@ -137,9 +160,11 @@ class TestPublish(unittest.TestCase):
         destination directory.
         """
         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(SRC_DIR, DST_PATH, FIG, PIC_NAME, 'individual')
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME,
+                    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 '
@@ -151,10 +176,12 @@ class TestPublish(unittest.TestCase):
         an existing destination directory by user input 'no'.
         """
         os.mkdir(DST_PATH)
+        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 self.assertRaises(RuntimeError):
-                publish(SRC_DIR, DST_PATH, FIG, PIC_NAME, 'individual')
+                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME)
 
     # Skip test if tests are run from command line.
     @unittest.skipIf(not os.path.isfile(sys.argv[0]), 'Publish is not called '
@@ -166,10 +193,13 @@ class TestPublish(unittest.TestCase):
         an existing destination directory by missing user input.
         """
         os.mkdir(DST_PATH)
+        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 self.assertRaises(RuntimeError):
-                publish(SRC_DIR, DST_PATH, FIG, PIC_NAME, 'individual')
+                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME,
+                        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 '
@@ -181,32 +211,56 @@ class TestPublish(unittest.TestCase):
         removed.
         To mock this, the invisible directory already exists.
         """
-        os.mkdir(INVISIBLE_PATH)
-        # Mock user input as 'yes'
-        with patch('builtins.input', return_value='yes'):
+        os.mkdir(DST_PATH)
+        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 self.assertRaises(RuntimeError):
-                publish(SRC_DIR, DST_PATH, FIG, PIC_NAME, 'individual')
-        assert not os.path.isdir(INVISIBLE_PATH)
+                publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME)
+        assert not os.path.isdir(invisible_path1)
+        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. """
         with self.assertRaises(TypeError):
-            publish(SRC_DIR, DST_PATH, FIG, 7.6, 'individual')
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, 7.6,
+                    data_storage='individual')
         with self.assertRaises(TypeError):
-            publish(SRC_DIR, DST_PATH, FIG, (), 'individual')
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, ())
         with self.assertRaises(TypeError):
-            publish(SRC_DIR, DST_PATH, FIG, ['test', 3], 'individual')
+            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(SRC_DIR, DST_PATH, FIG, PIC_NAME, 'none_existing_method')
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME,
+                    data_storage='none_existing_method')
         with self.assertRaises(TypeError):
-            publish(SRC_DIR, DST_PATH, FIG, PIC_NAME, 3)
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME, data_storage=3)
         with self.assertRaises(TypeError):
-            publish(SRC_DIR, DST_PATH, FIG, PIC_NAME, [])
+            publish(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME, data_storage=[])
+
+    def test_str(self):
+        """
+        Test if the string representation of a PublishOptions object is
+        correct.
+        """
+        self.maxDiff = None
+        publish_obj = PublishOptions(FIGS_AND_IDS, SRC_DIR, DST_PATH, PIC_NAME)
+        self.assertEqual(str(publish_obj),
+                         "<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', 'dst_path': "
+                         "'test_parent/test_dst_folder', 'plot_names': "
+                         "'test_picture', 'data_storage': 'individual', "
+                         "'dst_path_head': 'test_parent', 'dst_dirname': "
+                         "'test_dst_folder'}")
 
     def tearDown(self):
         """ Delete all files created in setUp. """
diff --git a/tests/test_save_plot.py b/tests/test_save_plot.py
index 0541724117cc28f0483a827fbc1e1fd5e5333cd5..a9f9f059c549f781480a2d51d87d523e68099a32 100644
--- a/tests/test_save_plot.py
+++ b/tests/test_save_plot.py
@@ -32,7 +32,7 @@ class TestSavePlot(unittest.TestCase):
         """
         plot_paths = save_plot(FIGURE, [PLOT_NAME], extension='jpg')
         self.assertIsInstance(plot_paths, list)
-        os.remove(PLOT_NAME + '.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 + '.png')
+        os.remove(PLOT_NAME + '.tmp.png')
 
     def test_save_plot_image_jpg(self):
         """
@@ -53,8 +53,8 @@ class TestSavePlot(unittest.TestCase):
         imgs_as_list = [img2, img2]
         plot_paths = save_plot(imgs_as_list, [PLOT_NAME], extension='jpg')
         self.assertIsInstance(plot_paths, list)
-        os.remove(PLOT_NAME + '1.jpg')
-        os.remove(PLOT_NAME + '2.jpg')
+        os.remove(PLOT_NAME + '1.tmp.jpg')
+        os.remove(PLOT_NAME + '2.tmp.jpg')
 
     def test_more_figs_than_names(self):
         """
@@ -64,8 +64,8 @@ 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}.png')
-            os.remove(PLOT_NAME + f'{i}.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. """
@@ -84,6 +84,7 @@ class TestSavePlot(unittest.TestCase):
         """
         with self.assertRaises(TypeError):
             save_plot([FIGURE, 'figure', FIGURE], 'PLOT_NAME', extension='jpg')
+        os.remove('PLOT_NAME1.tmp.jpg')
 
     def tearDown(self):
         os.remove(IMG1)
diff --git a/tests/test_tagplot.py b/tests/test_tagplot.py
index ddbdd163f6c8546fe5b49e76371d8c4c3e9543e7..0eb60acf3929ad122f205ed0414e76832171fede 100644
--- a/tests/test_tagplot.py
+++ b/tests/test_tagplot.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 """
-Unittests for tagplot
+Unittests for tagplot.
 """
 
 import os
@@ -35,44 +35,44 @@ class TestTagplot(unittest.TestCase):
         """
         Test if tagplot runs successful.
         """
-        tagplot(FIGS_AS_LIST, PLOT_ENGINE, PROJECT_ID, METHOD)
-        tagplot(IMGS_AS_LIST, 'image', PROJECT_ID, METHOD, location='north')
+        tagplot(FIGS_AS_LIST, PLOT_ENGINE, prefix=PROJECT_ID, id_method=METHOD)
+        tagplot(IMGS_AS_LIST, 'image', location='north')
 
     def test_prefix(self):
         """ Test if Error is raised if prefix is not a string. """
         with self.assertRaises(TypeError):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, 3, METHOD, location='southeast')
+            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, PROJECT_ID, METHOD, location='north')
+            tagplot(FIGS_AS_LIST, 1, location='north')
         with self.assertRaises(ValueError):
-            tagplot(FIGS_AS_LIST, 'xyz', PROJECT_ID, METHOD, 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, PROJECT_ID, id_method=(0, 1),
+            tagplot(FIGS_AS_LIST, PLOT_ENGINE, id_method=(0, 1),
                     location='west')
         with self.assertRaises(TypeError):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, PROJECT_ID, id_method=1)
+            tagplot(FIGS_AS_LIST, PLOT_ENGINE, id_method=1)
         with self.assertRaises(TypeError):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, PROJECT_ID, id_method=[0, 1])
+            tagplot(FIGS_AS_LIST, PLOT_ENGINE, id_method=[0, 1])
 
     def test_location(self):
         """
         Test if Errors are raised if the provided location is not supported.
         """
         with self.assertRaises(TypeError):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, PROJECT_ID, METHOD, location=1)
+            tagplot(FIGS_AS_LIST, PLOT_ENGINE, location=1)
         with self.assertWarns(Warning):
-            tagplot(FIGS_AS_LIST, PLOT_ENGINE, PROJECT_ID, METHOD,
-                    location='up')
+            tagplot(FIGS_AS_LIST, PLOT_ENGINE, location='up')
 
     def tearDown(self):
         os.remove(IMG1)
diff --git a/tests/test_tagplot_image.py b/tests/test_tagplot_image.py
index f899abca9b030682e26905ebcf327c2b2eb3622b..2c236c57bccd97748def00665fcf509d10a343b8 100644
--- a/tests/test_tagplot_image.py
+++ b/tests/test_tagplot_image.py
@@ -39,36 +39,37 @@ class TestTagplotImage(unittest.TestCase):
         Test of returned objects. Check if they are png and jpg files,
         respectively.
         """
-        options = PlotOptions(IMGS_AS_LIST, PROJECT_ID, METHOD,
-                              ROTATION, POSITION)
+        options = PlotOptions(IMGS_AS_LIST, ROTATION, POSITION,
+                              prefix=PROJECT_ID, id_method=METHOD, qrcode=True)
         options.validate_input()
-        [figs, _] = tagplot_image(options)
-        self.assertIsInstance(figs[0], PngImagePlugin.PngImageFile)
-        self.assertIsInstance(figs[1], JpegImagePlugin.JpegImageFile)
+        figs_and_ids = tagplot_image(options)
+        self.assertIsInstance(figs_and_ids.figs[0],
+                              PngImagePlugin.PngImageFile)
+        self.assertIsInstance(figs_and_ids.figs[1],
+                              JpegImagePlugin.JpegImageFile)
 
     def test_single_image(self):
         """
         Test of returned objects. Check if png files are returned,
         if a single matplot figure is given (not as a list).
         """
-        options = PlotOptions(IMG1, PROJECT_ID, METHOD, ROTATION,
-                              POSITION)
+        options = PlotOptions(IMG1, ROTATION, POSITION)
         options.validate_input()
-        [figs, _] = tagplot_image(options)
-        self.assertIsInstance(figs[0], PngImagePlugin.PngImageFile)
+        figs_and_ids = tagplot_image(options)
+        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, PROJECT_ID, METHOD, ROTATION,
-                              POSITION)
+        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', PROJECT_ID, METHOD, ROTATION,
-                              POSITION)
+        options = PlotOptions('xyz', ROTATION, POSITION)
         options.validate_input()
         with self.assertRaises(TypeError):
             tagplot_image(options)
diff --git a/tests/test_tagplot_matplotlib.py b/tests/test_tagplot_matplotlib.py
index 604bc79d4f88b076b04b1c71c1d7972baa2ea3e4..87cc22bfbce4422105aabdb9f1286f5e55e608a5 100644
--- a/tests/test_tagplot_matplotlib.py
+++ b/tests/test_tagplot_matplotlib.py
@@ -29,28 +29,26 @@ class TestTagplotMatplotlib(unittest.TestCase):
 
     def test_mplfigures(self):
         """ Test of returned objects. Check if they are matplotlib figures. """
-        options = PlotOptions(FIGS_AS_LIST, PROJECT_ID, METHOD,
-                              ROTATION, POSITION)
+        options = PlotOptions(FIGS_AS_LIST, ROTATION, POSITION,
+                              prefix=PROJECT_ID, id_method=METHOD, qrcode=True)
         options.validate_input()
-        [figs, _] = tagplot_matplotlib(options)
-        self.assertIsInstance(figs[0], Figure)
-        self.assertIsInstance(figs[1], Figure)
+        figs_and_ids = tagplot_matplotlib(options)
+        self.assertIsInstance(figs_and_ids.figs[0], Figure)
+        self.assertIsInstance(figs_and_ids.figs[1], Figure)
 
     def test_single_mplfigure(self):
         """
         Test of returned objects. Check if matplotlib figures are returned,
         if a single matplot figure is given (not as a list).
         """
-        options = PlotOptions(FIG1, PROJECT_ID, METHOD, ROTATION,
-                              POSITION)
+        options = PlotOptions(FIG1, ROTATION, POSITION)
         options.validate_input()
-        [figs, _] = tagplot_matplotlib(options)
-        self.assertIsInstance(figs[0], Figure)
+        figs_and_ids = tagplot_matplotlib(options)
+        self.assertIsInstance(figs_and_ids.figs[0], Figure)
 
     def test_mplerror(self):
         """ Test if Error is raised if wrong type of figures is given. """
-        options = PlotOptions(3, PROJECT_ID, METHOD, ROTATION,
-                              POSITION)
+        options = PlotOptions(3, ROTATION, POSITION)
         options.validate_input()
         with self.assertRaises(TypeError):
             tagplot_matplotlib(options)