diff --git a/buildManylinux.sh b/buildManylinux.sh
new file mode 100755
index 0000000..ee43f65
--- /dev/null
+++ b/buildManylinux.sh
@@ -0,0 +1,142 @@
+#!/bin/bash
+#  Kompiluje bibliotekę i buduje paczki dystrybucyjne zawierające
+# Morfeusza i słowniki SGJP i Polimorf
+#
+# Założenia:
+# • kod źródłowy Morfeusza jest w MORFEUSZ_SRC
+# • słowniki są już skompilowane w katalogu DICT_DIR
+# • kompilacja odbędzie się w katalogu BUILD_DIR (który zostanie skasowany i utworzony)
+# • wyniki zostaną umieszczone w TARGET_DIR
+
+#set -ex -o pipefail
+set -x
+
+if [ "$#" -ne 4 ]; then
+    echo "Expected arguments: ‹DICT_NAME› ‹DICT_VERSION› ‹BUILD_ENV› ‹64/32›"
+    exit 1
+fi
+
+export DICT_NAME="$1"
+export DICT_VERSION="$2"
+
+export MORFEUSZ_SRC=`pwd`/Morfeusz
+export DICT_DIR=`pwd`/dicts
+export ANALYZER_DICTIONARY_CPP=$DICT_DIR/$DICT_NAME-a.cpp
+export GENERATOR_DICTIONARY_CPP=$DICT_DIR/$DICT_NAME-s.cpp
+
+# Wersja środowiska kompilacyjnego (znaczy pod którym Ubuntu budujemy: 14.04, 16.04, 18.04, 19.04 …):
+# Staje się debianowym numerem subwersji: morfeusz…_1.9.27-18.04_amd64.deb
+export BUILD_ENV=$3
+
+export BITS=$4
+
+export BUILD_ROOT=`pwd`/build/$1
+export TARGET_ROOT=`pwd`/target
+
+
+
+function build {
+    set -e -o pipefail
+    os=$1
+    arch=$2
+    embedded=$3
+    python_ver=$4
+    shift 4
+    targets=$@
+    
+#    toolchain=$MORFEUSZ_SRC/toolchains/Toolchain-$os-$arch.cmake
+    toolchain=$MORFEUSZ_SRC/toolchains/Toolchain-Linux-native.cmake
+    if [ "$os" = "Linux" ]; then
+	buildDir=$BUILD_ROOT/$os-$BUILD_ENV-$arch-$embedded
+	targetDir=$TARGET_ROOT/$os/$BUILD_ENV/$arch
+    else
+	buildDir=$BUILD_ROOT/$os-$arch-$embedded
+	targetDir=$TARGET_ROOT/$os/$arch
+    fi
+#    rm -rf $buildDir || true
+    mkdir -p $buildDir
+
+    
+#    echo "Will use $toolchain toolchain"
+
+    # rm -rf $buildDir
+    #~ rm -rf $targetDir
+    mkdir -p $buildDir
+    rm -f $buildDir/CMakeCache.txt
+    mkdir -p $targetDir
+    cd $buildDir
+    
+    if [ "$embedded" = true ]
+    then
+        if [ "$os" == "Linux" ]
+        then
+            CPACK_GENERATOR=TGZ
+        fi
+        CMAKE_ARGS="-D CMAKE_TOOLCHAIN_FILE=$toolchain \
+            -D TARGET_DIR=$targetDir \
+            -D ANALYZER_DICTIONARY_CPP=$ANALYZER_DICTIONARY_CPP \
+            -D GENERATOR_DICTIONARY_CPP=$GENERATOR_DICTIONARY_CPP \
+            -D DEFAULT_DICT_NAME=$DICT_NAME \
+            -D SKIP_DICTIONARY_BUILDING=1 \
+            -D EMBEDDED_DEFAULT_DICT=1 \
+            -D DICT_VERSION=$DICT_VERSION \
+	    -D BUILT_ON=$BUILD_ENV "
+        if [ "$CPACK_GENERATOR" != "" ]
+        then
+            CMAKE_ARGS="$CMAKE_ARGS -D CPACK_GENERATOR=$CPACK_GENERATOR"
+        fi
+    else
+        # "setting default ACL to prevent control-file-has-bad-permissions lintian error"
+        setfacl -R -d -m o::rx -m g::rx -m u::rwx .
+        
+        CMAKE_ARGS="-D CMAKE_TOOLCHAIN_FILE=$toolchain \
+            -D TARGET_DIR=$targetDir \
+            -D DEFAULT_DICT_DIR=$DICT_DIR \
+            -D DEFAULT_DICT_NAME=$DICT_NAME \
+            -D SKIP_DICTIONARY_BUILDING=1 \
+            -D CPACK_GENERATOR=DEB \
+            -D DICT_VERSION=$DICT_VERSION \
+	    -D BUILT_ON=$BUILD_ENV "
+    fi
+    CMAKE_ARGS="$CMAKE_ARGS -D PY=$python_ver"
+    cmake $CMAKE_ARGS $MORFEUSZ_SRC 2>&1
+    echo "building for $os-$arch ($BUILD_ENV)" >&2
+#    make
+    make $targets
+}
+export -f build
+
+function log {
+    os=$1
+    arch=$2
+    stdbuf -oL sed -e $"s/^/$os-$BUILD_ENV-$arch:\t/" | tee -a "log/$os-$BUILD_ENV-$arch.out"
+}
+export -f log
+
+##??? rm -rf log $BUILD_ROOT
+mkdir -p log 
+
+
+build Linux $BITS true 3.0 package package-java gui-tgz package-python3 package-builder 2>&1 | log Linux-tgz3 $BITS
+
+# if [ -x /usr/bin/python2 ]
+# then
+#      build Linux $BITS true 2.7 package-python2 2>&1 | log Linux-tgz2 $BITS;
+# fi
+
+# # Kompilujemy dodatkowe wheele w środowiskach wirutalnych:
+# (
+#     cd $BUILD_ROOT/Linux-$BUILD_ENV-$BITS-true
+#     if [ -d ~/env/ ]; then
+# 	for pyenv in ~/env/* ; do
+# 	    source $pyenv/bin/activate
+# 	    make package-python3-whl
+# 	    python --version
+# 	    deactivate
+# 	done
+#     fi
+# ) | log Linux-whl $BITS
+
+# Pakiety debianowe bez wkompilowanego słownika:
+#build Linux $BITS false 0 lib-deb bin-deb dev-deb dictionary-deb java-deb gui-deb 2>&1 | log Linux-deb $BITS
+
diff --git a/buildUbuntu.sh b/buildUbuntu.sh
new file mode 100755
index 0000000..a6305a8
--- /dev/null
+++ b/buildUbuntu.sh
@@ -0,0 +1,141 @@
+#!/bin/bash
+#  Kompiluje bibliotekę i buduje paczki dystrybucyjne zawierające
+# Morfeusza i słowniki SGJP i Polimorf
+#
+# Założenia:
+# • kod źródłowy Morfeusza jest w MORFEUSZ_SRC
+# • słowniki są już skompilowane w katalogu DICT_DIR
+# • kompilacja odbędzie się w katalogu BUILD_DIR (który zostanie skasowany i utworzony)
+# • wyniki zostaną umieszczone w TARGET_DIR
+
+#set -ex -o pipefail
+set -x
+
+if [ "$#" -ne 4 ]; then
+    echo "Expected arguments: ‹DICT_NAME› ‹DICT_VERSION› ‹BUILD_ENV› ‹64/32›"
+    exit 1
+fi
+
+export DICT_NAME="$1"
+export DICT_VERSION="$2"
+
+export MORFEUSZ_SRC=`pwd`/Morfeusz
+export DICT_DIR=`pwd`/dicts
+export ANALYZER_DICTIONARY_CPP=$DICT_DIR/$DICT_NAME-a.cpp
+export GENERATOR_DICTIONARY_CPP=$DICT_DIR/$DICT_NAME-s.cpp
+
+# Wersja środowiska kompilacyjnego (znaczy pod którym Ubuntu budujemy: 14.04, 16.04, 18.04, 19.04 …):
+# Staje się debianowym numerem subwersji: morfeusz…_1.9.27-18.04_amd64.deb
+export BUILD_ENV=$3
+
+export BITS=$4
+
+export BUILD_ROOT=`pwd`/build/$1
+export TARGET_ROOT=`pwd`/target
+
+
+
+function build {
+    set -e -o pipefail
+    os=$1
+    arch=$2
+    embedded=$3
+    python_ver=$4
+    shift 4
+    targets=$@
+    
+#    toolchain=$MORFEUSZ_SRC/toolchains/Toolchain-$os-$arch.cmake
+    toolchain=$MORFEUSZ_SRC/toolchains/Toolchain-Linux-native.cmake
+    if [ "$os" = "Linux" ]; then
+	buildDir=$BUILD_ROOT/$os-$BUILD_ENV-$arch-$embedded
+	targetDir=$TARGET_ROOT/$os/$BUILD_ENV/$arch
+    else
+	buildDir=$BUILD_ROOT/$os-$arch-$embedded
+	targetDir=$TARGET_ROOT/$os/$arch
+    fi
+#    rm -rf $buildDir || true
+    mkdir -p $buildDir
+
+    
+#    echo "Will use $toolchain toolchain"
+
+    # rm -rf $buildDir
+    #~ rm -rf $targetDir
+    mkdir -p $buildDir
+    rm -f $buildDir/CMakeCache.txt
+    mkdir -p $targetDir
+    cd $buildDir
+    
+    if [ "$embedded" = true ]
+    then
+        if [ "$os" == "Linux" ]
+        then
+            CPACK_GENERATOR=TGZ
+        fi
+        CMAKE_ARGS="-D CMAKE_TOOLCHAIN_FILE=$toolchain \
+            -D TARGET_DIR=$targetDir \
+            -D ANALYZER_DICTIONARY_CPP=$ANALYZER_DICTIONARY_CPP \
+            -D GENERATOR_DICTIONARY_CPP=$GENERATOR_DICTIONARY_CPP \
+            -D DEFAULT_DICT_NAME=$DICT_NAME \
+            -D SKIP_DICTIONARY_BUILDING=1 \
+            -D EMBEDDED_DEFAULT_DICT=1 \
+            -D DICT_VERSION=$DICT_VERSION \
+	    -D BUILT_ON=$BUILD_ENV "
+        if [ "$CPACK_GENERATOR" != "" ]
+        then
+            CMAKE_ARGS="$CMAKE_ARGS -D CPACK_GENERATOR=$CPACK_GENERATOR"
+        fi
+    else
+        # "setting default ACL to prevent control-file-has-bad-permissions lintian error"
+        setfacl -R -d -m o::rx -m g::rx -m u::rwx .
+        
+        CMAKE_ARGS="-D CMAKE_TOOLCHAIN_FILE=$toolchain \
+            -D TARGET_DIR=$targetDir \
+            -D DEFAULT_DICT_DIR=$DICT_DIR \
+            -D DEFAULT_DICT_NAME=$DICT_NAME \
+            -D SKIP_DICTIONARY_BUILDING=1 \
+            -D CPACK_GENERATOR=DEB \
+            -D DICT_VERSION=$DICT_VERSION \
+	    -D BUILT_ON=$BUILD_ENV "
+    fi
+    CMAKE_ARGS="$CMAKE_ARGS -D PY=$python_ver"
+    cmake $CMAKE_ARGS $MORFEUSZ_SRC 2>&1
+    echo "building for $os-$arch ($BUILD_ENV)" >&2
+#    make
+    make $targets
+}
+export -f build
+
+function log {
+    os=$1
+    arch=$2
+    stdbuf -oL sed -e $"s/^/$os-$BUILD_ENV-$arch:\t/" | tee -a "log/$os-$BUILD_ENV-$arch.out"
+}
+export -f log
+
+##??? rm -rf log $BUILD_ROOT
+mkdir -p log 
+
+# Pakiety z wkompilowanym słownikiem i niewrażliwe na kwestię słownika:
+# build Linux $BITS true 3.0 package package-java gui-tgz package-python3 package-builder 2>&1 | log Linux-tgz3 $BITS
+# if [ -x /usr/bin/python2 ]
+# then
+#      build Linux $BITS true 2.7 package-python2 2>&1 | log Linux-tgz2 $BITS;
+# fi
+
+# # Kompilujemy dodatkowe wheele w środowiskach wirutalnych:
+# (
+#     cd $BUILD_ROOT/Linux-$BUILD_ENV-$BITS-true
+#     if [ -d ~/env/ ]; then
+# 	for pyenv in ~/env/* ; do
+# 	    source $pyenv/bin/activate
+# 	    make package-python3-whl
+# 	    python --version
+# 	    deactivate
+# 	done
+#     fi
+# ) | log Linux-whl $BITS
+
+# Pakiety debianowe bez wkompilowanego słownika:
+build Linux $BITS false 3.0 lib-deb bin-deb dev-deb dictionary-deb java-deb gui-deb package-python3-deb 2>&1 | log Ubuntu $BITS
+
diff --git a/fsabuilder/CMakeLists.txt b/fsabuilder/CMakeLists.txt
index accd842..a71a27e 100644
--- a/fsabuilder/CMakeLists.txt
+++ b/fsabuilder/CMakeLists.txt
@@ -29,15 +29,11 @@ add_custom_target (package-builder-egg
     DEPENDS builder-setup
 )
 add_custom_target (package-builder-whl
-    COMMAND python3 ${SETUP_PY} bdist_wheel -d "${TARGET_DIR}"
-    DEPENDS builder-setup
-)
-add_custom_target (package-builder-sdist
-    COMMAND python3 ${SETUP_PY} sdist -d "${TARGET_DIR}"
+    COMMAND python3 -m build --outdir "${TARGET_DIR}"
     DEPENDS builder-setup
 )
 
-set (PACKAGE_DEPENDS "package-builder-whl" "package-builder-sdist")
+set (PACKAGE_DEPENDS "package-builder-whl")
 
 if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
   if (BUILT_ON)
@@ -61,7 +57,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
         COMMAND mkdir -p "${TARGET_DIR}" && cp ${CMAKE_CURRENT_BINARY_DIR}/deb_dist/${MORFEUSZBUILDER}*.deb "${TARGET_DIR}"
         DEPENDS package-builder-deb-build
     )
-    list (APPEND PACKAGE_DEPENDS package-builder-deb)
+#    list (APPEND PACKAGE_DEPENDS package-builder-deb)
 elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
     #~ add_custom_target (package-python-win-installer
         #~ COMMAND python ${SETUP_PY} bdist_wininst -d ${TARGET_DIR} --plat-name "${CMAKE_SYSTEM_NAME}-${ARCHITECTURE}"
diff --git a/morfeusz/wrappers/python3/CMakeLists.txt b/morfeusz/wrappers/python3/CMakeLists.txt
index 825ee6a..60a0133 100644
--- a/morfeusz/wrappers/python3/CMakeLists.txt
+++ b/morfeusz/wrappers/python3/CMakeLists.txt
@@ -2,15 +2,10 @@
 # SWIG
 #set(CMAKE_SWIG_OUTDIR swig)
 #~ FIND_PACKAGE (SWIG REQUIRED)
-if (NOT PYTHON_INCLUDE_DIRS)
-  set(Python_ADDITIONAL_VERSIONS 3.4)
-  FIND_PACKAGE (PythonLibs ${PY} REQUIRED)
-endif ()
 #~ INCLUDE (${SWIG_USE_FILE})
 
 set (PY3MORFEUSZ_VERSION "${Morfeusz_LIB_VERSION}")
 # SWIG Java
-INCLUDE_DIRECTORIES (${PYTHON_INCLUDE_PATH})
 INCLUDE_DIRECTORIES (../..)
 
 
@@ -26,57 +21,47 @@ add_custom_target (generate_python3_wrapper ALL
   )
 
 set (SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
-set (SETUP_PY_TMP    "${CMAKE_CURRENT_BINARY_DIR}/setupTmp.py")
 set (SETUP_PY    "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
 set (DEPS        "${SWIG_PYTHON_OUTFILE_CXX}" "${SWIG_PYTHON_OUTFILE_PY}")
 set (OUTPUT      "${CMAKE_CURRENT_BINARY_DIR}/build")
 
 configure_file (${SETUP_PY_IN} ${SETUP_PY})
+file(COPY pyproject.toml setup.cfg DESTINATION .)
 
-set (EGG_NAME "morfeusz2-${PY3MORFEUSZ_VERSION}-py${PY}")
-file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${EGG_NAME}")
-file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/EGG-INFO" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/${EGG_NAME}/")
+# set (EGG_NAME "morfeusz2-${PY3MORFEUSZ_VERSION}-py${PY}")
+# file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${EGG_NAME}")
+# file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/EGG-INFO" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/${EGG_NAME}/")
 
 add_custom_target (generate_python3_setup_file
   DEPENDS ${SETUP_PY})
 
-add_custom_command (OUTPUT ${OUTPUT}
-  COMMAND python3
-  ARGS ${SETUP_PY} build
-  DEPENDS generate_python3_wrapper generate_python3_setup_file libmorfeusz)
+# add_custom_command (OUTPUT ${OUTPUT}
+#   COMMAND python3
+#   ARGS ${SETUP_PY} build
+#   DEPENDS generate_python3_wrapper generate_python3_setup_file libmorfeusz)
 
-add_custom_target (build_python3_wrapper
-  DEPENDS ${OUTPUT})
+# add_custom_target (build_python3_wrapper
+#   DEPENDS ${OUTPUT})
 
 add_custom_target (py3morfeusz
-  DEPENDS generate_python3_wrapper generate_python3_setup_file libmorfeusz build_python3_wrapper)
+  DEPENDS generate_python3_wrapper generate_python3_setup_file libmorfeusz)
 
 if (UNIX)
-  add_custom_target (install-python3
-    COMMAND python3 ${SETUP_PY} install --home=${CMAKE_INSTALL_PREFIX}
-    DEPENDS py3morfeusz
-    )
-  add_custom_target (package-python3-egg
-    COMMAND python3 ${SETUP_PY} bdist_egg -d "${TARGET_DIR}" --plat-name "${CMAKE_SYSTEM_NAME}-${ARCHITECTURE}"
-    DEPENDS py3morfeusz
-    )
+  # add_custom_target (install-python3
+  #   COMMAND python3 ${SETUP_PY} install --home=${CMAKE_INSTALL_PREFIX}
+  #   DEPENDS py3morfeusz
+  #   )
   add_custom_target (package-python3-whl
-    COMMAND python3 ${SETUP_PY} bdist_wheel -d "${TARGET_DIR}"
-    #--plat-name "${CMAKE_SYSTEM_NAME}-${ARCHITECTURE}"
-    DEPENDS py3morfeusz
+    COMMAND python3 -m build --outdir "${TARGET_DIR}"
+    DEPENDS generate_python3_wrapper generate_python3_setup_file libmorfeusz
     )
-  configure_file (WHEEL.linux.in WHEEL)
   add_custom_target (package-python3-fatwhl
-    COMMAND python3 setup.py build_py
-    COMMAND python3 setup.py build_ext --rpath [['$${ORIGIN}']] -b fatlib
-    COMMAND python3 setup.py bdist_wheel --skip-build --keep-temp -b fatlib
-    COMMAND cp WHEEL fatlib/morfeusz2-${PY3MORFEUSZ_VERSION}.dist-info/
-    COMMAND cp ../../libmorfeusz2.so fatlib/
-    COMMAND python3 -m wheel pack --build-number ${DICT_VERSION} --dest-dir ${TARGET_DIR} fatlib/
-    COMMAND rm -r fatlib
+    COMMAND python3 -m build
+    COMMAND zip -j dist/morfeusz2-*-abi3-*.whl ../../libmorfeusz2.so
+    COMMAND mv dist/morfeusz2-*-abi3-*.whl ${TARGET_DIR} 
     DEPENDS generate_python3_wrapper generate_python3_setup_file libmorfeusz
     )
-#  set (PACKAGE_DEPENDS package-python3-egg package-python3-whl)
+#  set (PACKAGE_DEPENDS package-python3-whl)
   set (PACKAGE_DEPENDS package-python3-fatwhl)
   
   if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
@@ -100,11 +85,16 @@ if (UNIX)
       COMMAND mkdir -p "${TARGET_DIR}" && cp ${CMAKE_CURRENT_BINARY_DIR}/deb_dist/python3-morfeusz2*.deb "${TARGET_DIR}"
       DEPENDS package-python3-deb-build
       )
-    list (APPEND PACKAGE_DEPENDS package-python3-deb)
+    # list (APPEND PACKAGE_DEPENDS package-python3-deb)
   endif ()
   add_custom_target (package-python3
     DEPENDS ${PACKAGE_DEPENDS})
 elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND CMAKE_CROSSCOMPILING)
+  if (NOT PYTHON_INCLUDE_DIRS)
+    set(Python_ADDITIONAL_VERSIONS 3.4)
+    FIND_PACKAGE (PythonLibs ${PY} REQUIRED)
+  endif ()
+  INCLUDE_DIRECTORIES (${PYTHON_INCLUDE_PATH})
   add_custom_target (package-python3-egg-info
     COMMAND python3 ${SETUP_PY} egg_info
     DEPENDS generate_python3_wrapper generate_python3_setup_file libmorfeusz
diff --git a/morfeusz/wrappers/python3/pyproject.toml b/morfeusz/wrappers/python3/pyproject.toml
new file mode 100644
index 0000000..fe61c1c
--- /dev/null
+++ b/morfeusz/wrappers/python3/pyproject.toml
@@ -0,0 +1,9 @@
+[build-system]
+requires = ["setuptools"]
+build-backend = "setuptools.build_meta"
+
+
+[project]
+name = "morfeusz2"  # as it would appear on PyPI                                                   
+dynamic = ["authors", "license", "readme", "description", "version"]
+
diff --git a/morfeusz/wrappers/python3/setup.cfg b/morfeusz/wrappers/python3/setup.cfg
new file mode 100644
index 0000000..97af180
--- /dev/null
+++ b/morfeusz/wrappers/python3/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+py-limited-api=cp36
+plat-name=manylinux_2_28_x86_64
+
+[build_ext]
+rpath=${ORIGIN}