diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/comsdk/communication.py b/comsdk/communication.py
index 1967125a3cb85d7d08748378d8d60bf0a859803e..eda1265bd4c976cfdb3217cb82d796e27124d91a 100644
--- a/comsdk/communication.py
+++ b/comsdk/communication.py
@@ -11,7 +11,7 @@ import logging
 
 import paramiko
 
-import comsdk.comaux as aux
+import comsdk.misc as aux
 
 
 class Host(object):
diff --git a/comsdk/distributed_storage.py b/comsdk/distributed_storage.py
index e02253049f61bc4451ea426923691febd28aa5da..3a9434ed2b9f1bfbca11465ae441fa0e6da1c2ea 100644
--- a/comsdk/distributed_storage.py
+++ b/comsdk/distributed_storage.py
@@ -1,4 +1,4 @@
-from comsdk.comaux import find_dir_by_named_regexp
+from comsdk.misc import find_dir_by_named_regexp
 from functools import partial
 import os
 
diff --git a/comsdk/edge.py b/comsdk/edge.py
index bd49ed5393100a0d1838de655f238fce446404fb..6ef91316a0f328c548bc0a9a01b4ba5f63c9bef0 100644
--- a/comsdk/edge.py
+++ b/comsdk/edge.py
@@ -7,7 +7,7 @@ import json
 
 from mako.template import Template
 
-import comsdk.comaux as aux
+import comsdk.misc as aux
 from comsdk.communication import CommunicationError
 from comsdk.graph import Func, State
 
diff --git a/comsdk/graph.py b/comsdk/graph.py
index 0cd79801c3e4b13f75ec986e2b8c91443f857571..d644bf444152adb930ca586f041522499dd191b5 100644
--- a/comsdk/graph.py
+++ b/comsdk/graph.py
@@ -4,7 +4,7 @@ from enum import Enum, auto
 from functools import partial
 import importlib as imp
 
-import comsdk.comaux as aux
+import comsdk.misc as aux
 
 ImplicitParallelizationInfo = collections.namedtuple('ImplicitParallelizationInfo', ['array_keys_mapping', 'branches_number', 'branch_i'])
 
diff --git a/comsdk/comaux.py b/comsdk/misc.py
similarity index 100%
rename from comsdk/comaux.py
rename to comsdk/misc.py
diff --git a/comsdk/research.py b/comsdk/research.py
index bc2e84075d56d864385a27640bcf8997d028f763..38a5114561fe8cb8db3175850cdedbc19523cae8 100644
--- a/comsdk/research.py
+++ b/comsdk/research.py
@@ -2,7 +2,7 @@ import pickle
 from datetime import date
 from typing import Sequence, Mapping, TypedDict
 
-from comsdk.comaux import *
+from comsdk.misc import *
 from comsdk.communication import BaseCommunication, LocalCommunication, SshCommunication, Host
 from comsdk.distributed_storage import *
 from comsdk.edge import Func, Edge, dummy_predicate
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e8cf30ba62a8d3b010d5ef9b9ea38b4cd46a158c
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,5 @@
+[build-system]
+# These are the assumed default build requirements from pip:
+# https://pip.pypa.io/en/stable/reference/pip/#pep-517-and-518-support
+requires = ["setuptools>=43.0.0", "wheel"]
+build-backend = "setuptools.build_meta"
\ No newline at end of file
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d8e9a6f800bdac2b7501a292345c6d1de0f50003
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,4 @@
+[metadata]
+# This includes the license file(s) in the wheel.
+# https://wheel.readthedocs.io/en/stable/user_guide.html#including-license-files-in-the-generated-wheel-file
+license_files = LICENSE
\ No newline at end of file
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..d9722dc56842c81b102fd951716cc7aefc7bb229
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,141 @@
+"""A setuptools based setup module.
+See:
+https://packaging.python.org/guides/distributing-packages-using-setuptools/
+https://github.com/pypa/sampleproject
+"""
+
+# Always prefer setuptools over distutils
+from setuptools import setup, find_packages
+import pathlib
+
+here = pathlib.Path(__file__).parent.resolve()
+
+# Get the long description from the README file
+long_description = (here / "README.md").read_text(encoding="utf-8")
+
+# Arguments marked as "Required" below must be included for upload to PyPI.
+# Fields marked as "Optional" may be commented out.
+
+setup(
+    # This is the name of your project. The first time you publish this
+    # package, this name will be registered for you. It will determine how
+    # users can install this project, e.g.:
+    #
+    # $ pip install sampleproject
+    #
+    # And where it will live on PyPI: https://pypi.org/project/sampleproject/
+    #
+    # There are some restrictions on what makes a valid project name
+    # specification here:
+    # https://packaging.python.org/specifications/core-metadata/#name
+    name="comsdk",  # Required
+    # Versions should comply with PEP 440:
+    # https://www.python.org/dev/peps/pep-0440/
+    version="0.1.0",  # Required
+    # This is a one-line description or tagline of what your project does. This
+    # corresponds to the "Summary" metadata field:
+    # https://packaging.python.org/specifications/core-metadata/#summary
+    description="Tools for computational research relying on distributed computing and member interaction",  # Optional
+    long_description=long_description,  # Optional
+    long_description_content_type="text/markdown",  # Optional (see note above)
+    url="https://sa2systems.ru:88/com/pycomsdk",  # Optional
+    author="Anton Pershin",  # Optional
+    author_email="tony.pershin@gmail.com",  # Optional
+    # Classifiers help users find your project by categorizing it.
+    #
+    # For a list of valid classifiers, see https://pypi.org/classifiers/
+    classifiers=[  # Optional
+        # How mature is this project? Common values are
+        #   3 - Alpha
+        #   4 - Beta
+        #   5 - Production/Stable
+        "Development Status :: 3 - Alpha",
+        "Intended Audience :: Science/Research",
+        "Topic :: Software Development",
+        # Pick your license as you wish
+        "License :: OSI Approved :: MIT License",
+        # Specify the Python versions you support here. In particular, ensure
+        # that you indicate you support Python 3. These classifiers are *not*
+        # checked by 'pip install'. See instead 'python_requires' below.
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.9",
+        "Programming Language :: Python :: 3.10",
+        "Programming Language :: Python :: 3 :: Only",
+    ],
+    # This field adds keywords for your project which will appear on the
+    # project page. What does your project relate to?
+    #
+    # Note that this is a list of additional keywords, separated
+    # by commas, to be used to assist searching for the distribution in a
+    # larger catalog.
+    keywords="graph-based software engineering, distributed computing, SciOps",  # Optional
+    # When your source code is in a subdirectory under the project root, e.g.
+    # `src/`, it is necessary to specify the `package_dir` argument.
+    #package_dir={"": "src"},  # Optional
+    # You can just specify package directories manually here if your project is
+    # simple. Or you can use find_packages().
+    #
+    # Alternatively, if you just want to distribute a single Python file, use
+    # the `py_modules` argument instead as follows, which will expect a file
+    # called `my_module.py` to exist:
+    #
+    #   py_modules=["my_module"],
+    #
+    #packages=find_packages(where="src"),  # Required
+    packages=find_packages(),  # Required
+    # Specify which Python versions you support. In contrast to the
+    # 'Programming Language' classifiers above, 'pip install' will check this
+    # and refuse to install the project if the version does not match. See
+    # https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires
+    python_requires=">=3.9.5, <4",
+    # This field lists other packages that your project depends on to run.
+    # Any package you put here will be installed by pip when your project is
+    # installed, so they must be valid existing projects.
+    #
+    # For an analysis of "install_requires" vs pip's requirements files see:
+    # https://packaging.python.org/discussions/install-requires-vs-requirements/
+    # Here is how to keep both install_requires and requirements.txt 
+    # without duplication: https://stackoverflow.com/questions/14399534/reference-requirements-txt-for-the-install-requires-kwarg-in-setuptools-setup-py/16624700
+    install_requires=[
+        "numpy",
+        "jsons",
+        "mako",
+        "paramiko",
+    ],  # Optional
+    # If there are data files included in your packages that need to be
+    # installed, specify them here.
+    #package_data={  # Optional
+    #    "sample": ["package_data.dat"],
+    #},
+    # Although 'package_data' is the preferred approach, in some case you may
+    # need to place data files outside of your packages. See:
+    # http://docs.python.org/distutils/setupscript.html#installing-additional-files
+    #
+    # In this case, 'data_file' will be installed into '<sys.prefix>/my_data'
+    #data_files=[("my_data", ["data/data_file"])],  # Optional
+    # To provide executable scripts, use entry points in preference to the
+    # "scripts" keyword. Entry points provide cross-platform support and allow
+    # `pip` to create the appropriate form of executable for the target
+    # platform.
+    #
+    # For example, the following would provide a command called `sample` which
+    # executes the function `main` from this package when invoked:
+    #entry_points={  # Optional
+    #    "console_scripts": [
+    #        "sample=sample:main",
+    #    ],
+    #},
+    # List additional URLs that are relevant to your project as a dict.
+    #
+    # This field corresponds to the "Project-URL" metadata fields:
+    # https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use
+    #
+    # Examples listed include a pattern for specifying where the package tracks
+    # issues, where the source is hosted, where to say thanks to the package
+    # maintainers, and where to support the project financially. The key is
+    # what's used to render the link text on PyPI.
+    project_urls={  # Optional
+        "Bug Reports": "https://sa2systems.ru:88/com/pycomsdk/issues",
+        "Source": "https://sa2systems.ru:88/com/pycomsdk",
+    },
+)
\ No newline at end of file