diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..bb3257de95090401c88389695e18dff861752bc2
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,10 @@
+[build-system]
+requires = [
+    "setuptools>=42",
+    "wheel",
+    "setuptools_scm[toml]>3.4",
+]
+build-backend = "setuptools.build_meta"
+
+[tool.setuptools_scm]
+write_to = "src/zolfa/nd2reader/version.py"
diff --git a/setup.cfg b/setup.cfg
index b2445a8c2c5a057eb9061bf04c27c3dea99ea9b4..291f4e5a8ce985a08e3deab00aaedbedccc13d9a 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,42 @@
 [metadata]
+name = zolfa-nd2reader
+version = attr:zolfa.nd2reader.version
+description = A tool for reading ND2 files produced by NIS Elements
 description-file = README.md
+classifiers = 
+    Development Status :: 5 - Production/Stable
+    Intended Audience :: Science/Research
+    License :: Freely Distributable
+    License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
+    Operating System :: POSIX :: Linux
+    Programming Language :: Python :: 2.7
+    Programming Language :: Python :: 3.4
+    Topic :: Scientific/Engineering
+keywords =
+    nd2
+    nikon
+    microscopy
+    NIS Elements
+author = Ruben Verweij, Lorenzo Zolfanelli
+author_email = dev@zolfa.nl
+url = https://projects.lilik.it/zolfa/zolfa-nd2reader
+
+[options]
+packages = find_namespace:
+package_dir =
+    = src
+python_requires = >=3.6
+install_requires =
+    numpy>=1.14
+    six>=1.4
+    xmltodict>=0.9.2
+    PIMS>=0.5.0
+setup_requires =
+    setuptools_scm
+
+[options.packages.find]
+where = src
+include = zolfa.*
 
 [bdist_wheel]
 universal=1
\ No newline at end of file
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 5b6ebdd4cca15cf3810e29f26b6ffda85e834c59..0000000000000000000000000000000000000000
--- a/setup.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from setuptools import setup
-#from nd2reader import __version__ as VERSION
-
-if __name__ == '__main__':
-    setup(
-        name='nd2reader',
-        packages=['nd2reader'],
-        install_requires=[
-            'numpy>=1.14',
-            'six>=1.4',
-            'xmltodict>=0.9.2',
-            'PIMS>=0.5.0'
-        ],
-        python_requires=">=3.6",
-        version="3.2.3-zolfa-dev0",
-        description='A tool for reading ND2 files produced by NIS Elements',
-        author='Ruben Verweij',
-        author_email='ruben@lighthacking.nl',
-        url='https://github.com/rbnvrw/nd2reader',
-        download_url='https://github.com/rbnvrw/nd2reader/tarball/%s' % "3.2.3-zolfa-dev0",
-        keywords=['nd2', 'nikon', 'microscopy', 'NIS Elements'],
-        classifiers=['Development Status :: 5 - Production/Stable',
-                     'Intended Audience :: Science/Research',
-                     'License :: Freely Distributable',
-                     'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
-                     'Operating System :: POSIX :: Linux',
-                     'Programming Language :: Python :: 2.7',
-                     'Programming Language :: Python :: 3.4',
-                     'Topic :: Scientific/Engineering',
-                     ]
-    )
diff --git a/sphinx/conf.py b/sphinx/conf.py
index 7a27c2811b4f73bf6874abb1e70d8b5a40c4bdee..7914e168fe5dd6274b96ece7fe1d24f18889329b 100644
--- a/sphinx/conf.py
+++ b/sphinx/conf.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 import sphinx_bootstrap_theme
 from recommonmark.parser import CommonMarkParser
-from nd2reader import __version__ as VERSION
+from zolfa.nd2reader.version import __version__ as VERSION
 
 # -- General configuration ------------------------------------------------
 
@@ -36,9 +36,9 @@ source_suffix = ['.rst', '.md']
 master_doc = 'index'
 
 # General information about the project.
-project = 'nd2reader'
+project = 'zolfa-nd2reader'
 copyright = '2017 - 2019, Ruben Verweij'
-author = 'Ruben Verweij'
+author = 'Ruben Verweij, Lorenzo Zolfanelli'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
diff --git a/nd2reader/__init__.py b/src/zolfa/nd2reader/__init__.py
similarity index 73%
rename from nd2reader/__init__.py
rename to src/zolfa/nd2reader/__init__.py
index 353176e72720c3fb9eed4ce5718e470d1ff47ef6..3b424e162f3706568d8be5223edbb2df48670cc9 100644
--- a/nd2reader/__init__.py
+++ b/src/zolfa/nd2reader/__init__.py
@@ -1,6 +1,6 @@
 from os import path
-from nd2reader.reader import ND2Reader
-from nd2reader.legacy import Nd2
+from zolfa.nd2reader.reader import ND2Reader
+from zolfa.nd2reader.legacy import Nd2
 
 try:
     import importlib.metadata as importlib_metadata
diff --git a/nd2reader/artificial.py b/src/zolfa/nd2reader/artificial.py
similarity index 99%
rename from nd2reader/artificial.py
rename to src/zolfa/nd2reader/artificial.py
index 861c613bd871086875f171a7913b1bf7ea49ffaa..05f460944333f7af860444a43cafaecac2a26fe9 100644
--- a/nd2reader/artificial.py
+++ b/src/zolfa/nd2reader/artificial.py
@@ -3,7 +3,7 @@
 import six
 import numpy as np
 import struct
-from nd2reader.common import check_or_make_dir
+from zolfa.nd2reader.common import check_or_make_dir
 from os import path
 
 global_labels = ['image_attributes', 'image_text_info', 'image_metadata',
diff --git a/nd2reader/common.py b/src/zolfa/nd2reader/common.py
similarity index 99%
rename from nd2reader/common.py
rename to src/zolfa/nd2reader/common.py
index df5ddcfe1d06cd5d7c4b7bab968baf9beecf9483..c326bd83635d484b596cac649889e2eb142b187d 100644
--- a/nd2reader/common.py
+++ b/src/zolfa/nd2reader/common.py
@@ -4,7 +4,7 @@ import array
 from datetime import datetime
 import six
 import re
-from nd2reader.exceptions import InvalidVersionError
+from zolfa.nd2reader.exceptions import InvalidVersionError
 
 
 def get_version(fh):
diff --git a/nd2reader/common_raw_metadata.py b/src/zolfa/nd2reader/common_raw_metadata.py
similarity index 98%
rename from nd2reader/common_raw_metadata.py
rename to src/zolfa/nd2reader/common_raw_metadata.py
index 422f52115f04bcdc0cf8d4b2ac8f273913c05fb4..408339fa31ddd19c7fa1fc7265000e47d956cd89 100644
--- a/nd2reader/common_raw_metadata.py
+++ b/src/zolfa/nd2reader/common_raw_metadata.py
@@ -1,7 +1,7 @@
 import six
 import warnings
 
-from nd2reader.common import get_from_dict_if_exists
+from zolfa.nd2reader.common import get_from_dict_if_exists
 
 
 def parse_if_not_none(to_check, callback):
diff --git a/nd2reader/exceptions.py b/src/zolfa/nd2reader/exceptions.py
similarity index 100%
rename from nd2reader/exceptions.py
rename to src/zolfa/nd2reader/exceptions.py
diff --git a/nd2reader/label_map.py b/src/zolfa/nd2reader/label_map.py
similarity index 100%
rename from nd2reader/label_map.py
rename to src/zolfa/nd2reader/label_map.py
diff --git a/nd2reader/legacy.py b/src/zolfa/nd2reader/legacy.py
similarity index 99%
rename from nd2reader/legacy.py
rename to src/zolfa/nd2reader/legacy.py
index 9b010b82ebb9acbaadcaf0023e1386dae58d0d35..e3b3f7613830c946f85566863bd4134e239d36fa 100644
--- a/nd2reader/legacy.py
+++ b/src/zolfa/nd2reader/legacy.py
@@ -4,7 +4,7 @@ Legacy class for backwards compatibility
 
 import warnings
 
-from nd2reader import ND2Reader
+from zolfa.nd2reader import ND2Reader
 
 
 class Nd2(object):
diff --git a/nd2reader/parser.py b/src/zolfa/nd2reader/parser.py
similarity index 98%
rename from nd2reader/parser.py
rename to src/zolfa/nd2reader/parser.py
index bebbcaa0a731d243b253f9566177f50c0140b57e..e3ceea3cb4ed578744160756393f8f04a1b5c73e 100644
--- a/nd2reader/parser.py
+++ b/src/zolfa/nd2reader/parser.py
@@ -7,10 +7,10 @@ import warnings
 from pims.base_frames import Frame
 import numpy as np
 
-from nd2reader.common import get_version, read_chunk
-from nd2reader.label_map import LabelMap
-from nd2reader.raw_metadata import RawMetadata
-from nd2reader import stitched
+from zolfa.nd2reader.common import get_version, read_chunk
+from zolfa.nd2reader.label_map import LabelMap
+from zolfa.nd2reader.raw_metadata import RawMetadata
+from zolfa.nd2reader import stitched
 
 
 class Parser(object):
diff --git a/nd2reader/raw_metadata.py b/src/zolfa/nd2reader/raw_metadata.py
similarity index 98%
rename from nd2reader/raw_metadata.py
rename to src/zolfa/nd2reader/raw_metadata.py
index 3c25d576cfcd9d9c393e3ab2886c9a86ccf918e2..9b2e8e38707a7b6ce0dd1ef1a770f0d30dfd7bad 100644
--- a/nd2reader/raw_metadata.py
+++ b/src/zolfa/nd2reader/raw_metadata.py
@@ -4,8 +4,8 @@ import six
 import numpy as np
 import warnings
 
-from nd2reader.common import read_chunk, read_array, read_metadata, parse_date, get_from_dict_if_exists
-from nd2reader.common_raw_metadata import parse_dimension_text_line, parse_if_not_none, parse_roi_shape, parse_roi_type, get_loops_from_data, determine_sampling_interval
+from zolfa.nd2reader.common import read_chunk, read_array, read_metadata, parse_date, get_from_dict_if_exists
+from zolfa.nd2reader.common_raw_metadata import parse_dimension_text_line, parse_if_not_none, parse_roi_shape, parse_roi_type, get_loops_from_data, determine_sampling_interval
 
 
 class RawMetadata(object):
diff --git a/nd2reader/reader.py b/src/zolfa/nd2reader/reader.py
similarity index 98%
rename from nd2reader/reader.py
rename to src/zolfa/nd2reader/reader.py
index 295bded08427ac578f4bd0197fac6c52bd892464..b9ae8fed66cced93a2001ec00c8678c90ee30516 100644
--- a/nd2reader/reader.py
+++ b/src/zolfa/nd2reader/reader.py
@@ -1,8 +1,8 @@
 from pims import Frame
 from pims.base_frames import FramesSequenceND
 
-from nd2reader.exceptions import EmptyFileError, InvalidFileType
-from nd2reader.parser import Parser
+from zolfa.nd2reader.exceptions import EmptyFileError, InvalidFileType
+from zolfa.nd2reader.parser import Parser
 import numpy as np
 
 
diff --git a/nd2reader/stitched.py b/src/zolfa/nd2reader/stitched.py
similarity index 100%
rename from nd2reader/stitched.py
rename to src/zolfa/nd2reader/stitched.py
diff --git a/src/zolfa/nd2reader/version.py b/src/zolfa/nd2reader/version.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a0e1e598aa875496454d977c110c2fb87edfbf5
--- /dev/null
+++ b/src/zolfa/nd2reader/version.py
@@ -0,0 +1,4 @@
+# file generated by setuptools_scm
+# don't change, don't track in version control
+__version__ = version = '2.0.2.dev268+g026928a.d20230117'
+__version_tuple__ = version_tuple = (2, 0, 2, 'dev268', 'g026928a.d20230117')
diff --git a/test.py b/test.py
index e5a6d6cabd5a1627b37243faffc77ddcbeeea397..b05602cab30656da3822f054436b4e7d58b05ea7 100644
--- a/test.py
+++ b/test.py
@@ -3,4 +3,4 @@ from os import path
 
 file_path = path.abspath(__file__)
 tests_path = path.join(path.abspath(path.dirname(file_path)), "tests")
-nose.main(argv=[path.abspath(__file__), "--with-coverage", "--cover-erase", "--cover-package=nd2reader", tests_path])
+nose.main(argv=[path.abspath(__file__), "--with-coverage", "--cover-erase", "--cover-package=zolfa.nd2reader", tests_path])
diff --git a/tests/test_artificial.py b/tests/test_artificial.py
index e9d2b2935a6d6f7628030e269c602eefabec4335..8595d3d676e9289c7510a3ad18fad1bdebef8db5 100644
--- a/tests/test_artificial.py
+++ b/tests/test_artificial.py
@@ -3,10 +3,10 @@ from os import path
 import six
 import struct
 
-from nd2reader.artificial import ArtificialND2
-from nd2reader.common import get_version, parse_version, parse_date, _add_to_metadata, _parse_unsigned_char, \
+from zolfa.nd2reader.artificial import ArtificialND2
+from zolfa.nd2reader.common import get_version, parse_version, parse_date, _add_to_metadata, _parse_unsigned_char, \
     _parse_unsigned_int, _parse_unsigned_long, _parse_double, check_or_make_dir
-from nd2reader.exceptions import InvalidVersionError
+from zolfa.nd2reader.exceptions import InvalidVersionError
 
 
 class TestArtificial(unittest.TestCase):
diff --git a/tests/test_common.py b/tests/test_common.py
index 8e13aaaf89f06596fd6252e22c0eef4ac7e04873..27c548bb191c92ac44bfa6d0a69237fdd66c648c 100644
--- a/tests/test_common.py
+++ b/tests/test_common.py
@@ -5,11 +5,11 @@ import array
 import six
 import struct
 
-from nd2reader.artificial import ArtificialND2
-from nd2reader.common import get_version, parse_version, parse_date, _add_to_metadata, _parse_unsigned_char, \
+from zolfa.nd2reader.artificial import ArtificialND2
+from zolfa.nd2reader.common import get_version, parse_version, parse_date, _add_to_metadata, _parse_unsigned_char, \
     _parse_unsigned_int, _parse_unsigned_long, _parse_double, check_or_make_dir, _parse_string, _parse_char_array, \
     get_from_dict_if_exists, read_chunk
-from nd2reader.exceptions import InvalidVersionError
+from zolfa.nd2reader.exceptions import InvalidVersionError
 
 
 class TestCommon(unittest.TestCase):
diff --git a/tests/test_label_map.py b/tests/test_label_map.py
index 1f58fd671424083d7ba9abfc35ce6379ce07db93..612c853b5f0cb4a04fb7a11654856000c39af619 100644
--- a/tests/test_label_map.py
+++ b/tests/test_label_map.py
@@ -1,6 +1,6 @@
 import unittest
-from nd2reader.label_map import LabelMap
-from nd2reader.artificial import ArtificialND2
+from zolfa.nd2reader.label_map import LabelMap
+from zolfa.nd2reader.artificial import ArtificialND2
 
 
 class TestLabelMap(unittest.TestCase):
diff --git a/tests/test_legacy.py b/tests/test_legacy.py
index 4c938cd0cc35fc44fd47aefec474b6e22b3d6a18..6d16e26946fc4c11e0f0a5fe4d2eb7ad9308f54d 100644
--- a/tests/test_legacy.py
+++ b/tests/test_legacy.py
@@ -1,9 +1,9 @@
 import unittest
 import warnings
 
-from nd2reader.legacy import Nd2
-from nd2reader.reader import ND2Reader
-from nd2reader.artificial import ArtificialND2
+from zolfa.nd2reader.legacy import Nd2
+from zolfa.nd2reader.reader import ND2Reader
+from zolfa.nd2reader.artificial import ArtificialND2
 
 
 class TestLegacy(unittest.TestCase):
diff --git a/tests/test_parser.py b/tests/test_parser.py
index c0b4ddfa02ba5e8000bd63c6fd351c92fa508bd5..90af415a2de88b0204eec9664f2537f70de266ec 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -1,8 +1,8 @@
 import unittest
 from os import path
-from nd2reader.artificial import ArtificialND2
-from nd2reader.common import check_or_make_dir
-from nd2reader.parser import Parser
+from zolfa.nd2reader.artificial import ArtificialND2
+from zolfa.nd2reader.common import check_or_make_dir
+from zolfa.nd2reader.parser import Parser
 import urllib.request
 
 
diff --git a/tests/test_raw_metadata.py b/tests/test_raw_metadata.py
index c21e0fe2e04aafbae3c05d6eaf9f46ef28244b72..8f560921a3cf1e0a7957a2711964c1f521dd1f30 100644
--- a/tests/test_raw_metadata.py
+++ b/tests/test_raw_metadata.py
@@ -1,10 +1,10 @@
 import unittest
 import six
 
-from nd2reader.artificial import ArtificialND2
-from nd2reader.label_map import LabelMap
-from nd2reader.raw_metadata import RawMetadata
-from nd2reader.common_raw_metadata import parse_roi_shape, parse_roi_type, parse_dimension_text_line
+from zolfa.nd2reader.artificial import ArtificialND2
+from zolfa.nd2reader.label_map import LabelMap
+from zolfa.nd2reader.raw_metadata import RawMetadata
+from zolfa.nd2reader.common_raw_metadata import parse_roi_shape, parse_roi_type, parse_dimension_text_line
 
 
 class TestRawMetadata(unittest.TestCase):
diff --git a/tests/test_reader.py b/tests/test_reader.py
index c28399d23e76b67f7657d7833beedd859e1149a2..d01032d08d1c961e2ca69b330c16ef39e4f28860 100644
--- a/tests/test_reader.py
+++ b/tests/test_reader.py
@@ -3,10 +3,10 @@ import numpy as np
 import struct
 
 from pims import Frame
-from nd2reader.artificial import ArtificialND2
-from nd2reader.exceptions import EmptyFileError, InvalidFileType
-from nd2reader.reader import ND2Reader
-from nd2reader.parser import Parser
+from zolfa.nd2reader.artificial import ArtificialND2
+from zolfa.nd2reader.exceptions import EmptyFileError, InvalidFileType
+from zolfa.nd2reader.reader import ND2Reader
+from zolfa.nd2reader.parser import Parser
 
 
 class TestReader(unittest.TestCase):
diff --git a/tests/test_version.py b/tests/test_version.py
index fedfeeb0a2f43acc9e6d0cae1bb38920a0cb6114..62224424192fe2b3c56514cd16138125be966477 100644
--- a/tests/test_version.py
+++ b/tests/test_version.py
@@ -1,5 +1,5 @@
 import unittest
-from nd2reader import __version__ as VERSION
+from zolfa.nd2reader import __version__ as VERSION
 
 
 class TestVersion(unittest.TestCase):