diff --git a/src/imports/service/plugins.qmltypes b/src/imports/service/plugins.qmltypes
index d151597..fd1479c 100644
--- a/src/imports/service/plugins.qmltypes
+++ b/src/imports/service/plugins.qmltypes
@@ -270,6 +270,7 @@ Module {
         exportMetaObjectRevisions: [0]
         Property { name: "terminalMode"; type: "QtService::Service::TerminalMode"; isReadonly: true }
         Property { name: "command"; type: "QStringList"; isReadonly: true }
+        Property { name: "command2"; type: "QStringList"; isReadonly: true }
         Property { name: "autoDelete"; type: "bool" }
         Signal { name: "terminalDisconnected" }
         Signal {
diff --git a/src/python/python.pro b/src/python/python.pro
new file mode 100644
index 0000000..ac67f73
--- /dev/null
+++ b/src/python/python.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+
+SUBDIRS += \
+    service
diff --git a/src/python/service/config.py b/src/python/service/config.py
new file mode 100755
index 0000000..edc2d80
--- /dev/null
+++ b/src/python/service/config.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+import sys
+import importlib
+
+def main(command: str):
+	if command == "suffix":
+		print(importlib.machinery.EXTENSION_SUFFIXES[0])
+	else:
+		sys.exit(1)
+
+if __name__ == '__main__':
+	main(sys.argv[1])
diff --git a/src/python/service/pyside2_config.py b/src/python/service/pyside2_config.py
new file mode 100755
index 0000000..a1ec0c6
--- /dev/null
+++ b/src/python/service/pyside2_config.py
@@ -0,0 +1,372 @@
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+##   * Redistributions of source code must retain the above copyright
+##     notice, this list of conditions and the following disclaimer.
+##   * Redistributions in binary form must reproduce the above copyright
+##     notice, this list of conditions and the following disclaimer in
+##     the documentation and/or other materials provided with the
+##     distribution.
+##   * Neither the name of The Qt Company Ltd nor the names of its
+##     contributors may be used to endorse or promote products derived
+##     from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import os, glob, re, sys
+from distutils import sysconfig
+
+generic_error = (' Did you forget to activate your virtualenv? Or perhaps'
+                 ' you forgot to build / install PySide2 into your currently active Python'
+                 ' environment?')
+pyside2_error = 'Unable to locate PySide2.' + generic_error
+shiboken2_module_error = 'Unable to locate shiboken2-module.' + generic_error
+shiboken2_generator_error = 'Unable to locate shiboken2-generator.' + generic_error
+pyside2_libs_error = 'Unable to locate the PySide2 shared libraries.' + generic_error
+python_link_error = 'Unable to locate the Python library for linking.'
+python_include_error = 'Unable to locate the Python include headers directory.'
+
+options = []
+
+# option, function, error, description
+options.append(("--shiboken2-module-path",
+                lambda: find_shiboken2_module(),
+                shiboken2_module_error,
+                "Print shiboken2 module location"))
+options.append(("--shiboken2-generator-path",
+                lambda: find_shiboken2_generator(),
+                shiboken2_generator_error,
+                "Print shiboken2 generator location"))
+options.append(("--pyside2-path", lambda: find_pyside2(), pyside2_error,
+                "Print PySide2 location"))
+
+options.append(("--python-include-path",
+                lambda: get_python_include_path(),
+                python_include_error,
+                "Print Python include path"))
+options.append(("--shiboken2-generator-include-path",
+                lambda: get_package_include_path(Package.shiboken2_generator),
+                pyside2_error,
+                "Print shiboken2 generator include paths"))
+options.append(("--pyside2-include-path",
+                lambda: get_package_include_path(Package.pyside2),
+                pyside2_error,
+                "Print PySide2 include paths"))
+
+options.append(("--python-link-flags-qmake", lambda: python_link_flags_qmake(), python_link_error,
+                "Print python link flags for qmake"))
+options.append(("--python-link-flags-cmake", lambda: python_link_flags_cmake(), python_link_error,
+                "Print python link flags for cmake"))
+
+options.append(("--shiboken2-module-qmake-lflags",
+                lambda: get_package_qmake_lflags(Package.shiboken2_module), pyside2_error,
+                "Print shiboken2 shared library link flags for qmake"))
+options.append(("--pyside2-qmake-lflags",
+                lambda: get_package_qmake_lflags(Package.pyside2), pyside2_error,
+                "Print PySide2 shared library link flags for qmake"))
+
+options.append(("--shiboken2-module-shared-libraries-qmake",
+                lambda: get_shared_libraries_qmake(Package.shiboken2_module), pyside2_libs_error,
+                "Print paths of shiboken2 shared libraries (.so's, .dylib's, .dll's) for qmake"))
+options.append(("--shiboken2-module-shared-libraries-cmake",
+                lambda: get_shared_libraries_cmake(Package.shiboken2_module), pyside2_libs_error,
+                "Print paths of shiboken2 shared libraries (.so's, .dylib's, .dll's) for cmake"))
+
+options.append(("--pyside2-shared-libraries-qmake",
+                lambda: get_shared_libraries_qmake(Package.pyside2), pyside2_libs_error,
+                "Print paths of PySide2 shared libraries (.so's, .dylib's, .dll's) for qmake"))
+options.append(("--pyside2-shared-libraries-cmake",
+                lambda: get_shared_libraries_cmake(Package.pyside2), pyside2_libs_error,
+                "Print paths of PySide2 shared libraries (.so's, .dylib's, .dll's) for cmake"))
+
+options_usage = ''
+for i, (flag, _, _, description) in enumerate(options):
+    options_usage += '    {:<45} {}'.format(flag, description)
+    if i < len(options) - 1:
+        options_usage += '\n'
+
+usage = """
+Utility to determine include/link options of shiboken2/PySide2 and Python for qmake/CMake projects
+that would like to embed or build custom shiboken2/PySide2 bindings.
+
+Usage: pyside2_config.py [option]
+Options:
+{}
+    -a                                            Print all options and their values
+    --help/-h                                     Print this help
+""".format(options_usage)
+
+option = sys.argv[1] if len(sys.argv) == 2 else '-a'
+if option == '-h' or option == '--help':
+    print(usage)
+    sys.exit(0)
+
+
+class Package(object):
+    shiboken2_module = 1
+    shiboken2_generator = 2
+    pyside2 = 3
+
+
+def clean_path(path):
+    return path if sys.platform != 'win32' else path.replace('\\', '/')
+
+
+def shared_library_suffix():
+    if sys.platform == 'win32':
+        return 'lib'
+    elif sys.platform == 'darwin':
+        return 'dylib'
+    # Linux
+    else:
+        return 'so.*'
+
+
+def import_suffixes():
+    if (sys.version_info >= (3, 4)):
+        import importlib
+        return importlib.machinery.EXTENSION_SUFFIXES
+    else:
+        import imp
+        result = []
+        for t in imp.get_suffixes():
+            result.append(t[0])
+        return result
+
+
+def is_debug():
+    debug_suffix = '_d.pyd' if sys.platform == 'win32' else '_d.so'
+    return any([s.endswith(debug_suffix) for s in import_suffixes()])
+
+
+def shared_library_glob_pattern():
+    glob = '*.' + shared_library_suffix()
+    return glob if sys.platform == 'win32' else 'lib' + glob
+
+
+def filter_shared_libraries(libs_list):
+    def predicate(lib_name):
+        basename = os.path.basename(lib_name)
+        if 'shiboken' in basename or 'pyside2' in basename:
+            return True
+        return False
+    result = [lib for lib in libs_list if predicate(lib)]
+    return result
+
+
+# Return qmake link option for a library file name
+def link_option(lib):
+    # On Linux:
+    # Since we cannot include symlinks with wheel packages
+    # we are using an absolute path for the libpyside and libshiboken
+    # libraries when compiling the project
+    baseName = os.path.basename(lib)
+    link = ' -l'
+    if sys.platform in ['linux', 'linux2']: # Linux: 'libfoo.so' -> '/absolute/path/libfoo.so'
+        link = lib
+    elif sys.platform in ['darwin']: # Darwin: 'libfoo.so' -> '-lfoo'
+        link += os.path.splitext(baseName[3:])[0]
+    else: # Windows: 'libfoo.dll' -> 'libfoo.dll'
+        link += os.path.splitext(baseName)[0]
+    return link
+
+
+# Locate PySide2 via sys.path package path.
+def find_pyside2():
+    return find_package_path("PySide2")
+
+
+def find_shiboken2_module():
+    return find_package_path("shiboken2")
+
+
+def find_shiboken2_generator():
+    return find_package_path("shiboken2_generator")
+
+
+def find_package(which_package):
+    if which_package == Package.shiboken2_module:
+        return find_shiboken2_module()
+    if which_package == Package.shiboken2_generator:
+        return find_shiboken2_generator()
+    if which_package == Package.pyside2:
+        return find_pyside2()
+    return None
+
+
+def find_package_path(dir_name):
+    for p in sys.path:
+        if 'site-' in p:
+            package = os.path.join(p, dir_name)
+            if os.path.exists(package):
+                return clean_path(os.path.realpath(package))
+    return None
+
+
+# Return version as "3.5"
+def python_version():
+    return str(sys.version_info[0]) + '.' + str(sys.version_info[1])
+
+
+def get_python_include_path():
+    return sysconfig.get_python_inc()
+
+
+def python_link_flags_qmake():
+    flags = python_link_data()
+    if sys.platform == 'win32':
+        libdir = flags['libdir']
+        # This will add the "~1" shortcut for directories that
+        # contain white spaces
+        # e.g.: "Program Files" to "Progra~1"
+        for d in libdir.split("\\"):
+            if " " in d:
+                libdir = libdir.replace(d, d.split(" ")[0][:-1]+"~1")
+        return '-L{} -l{}'.format(libdir, flags['lib'])
+    elif sys.platform == 'darwin':
+        return '-L{} -l{}'.format(flags['libdir'], flags['lib'])
+
+    else:
+        # Linux and anything else
+        return '-L{} -l{}'.format(flags['libdir'], flags['lib'])
+
+
+def python_link_flags_cmake():
+    flags = python_link_data()
+    libdir = flags['libdir']
+    lib = re.sub(r'.dll$', '.lib', flags['lib'])
+    return '{};{}'.format(libdir, lib)
+
+
+def python_link_data():
+    # @TODO Fix to work with static builds of Python
+    libdir = sysconfig.get_config_var('LIBDIR')
+    if libdir is None:
+        libdir = os.path.abspath(os.path.join(
+            sysconfig.get_config_var('LIBDEST'), "..", "libs"))
+    version = python_version()
+    version_no_dots = version.replace('.', '')
+
+    flags = {}
+    flags['libdir'] = libdir
+    if sys.platform == 'win32':
+        suffix = '_d' if is_debug() else ''
+        flags['lib'] = 'python{}{}'.format(version_no_dots, suffix)
+
+    elif sys.platform == 'darwin':
+        flags['lib'] = 'python{}'.format(version)
+
+    # Linux and anything else
+    else:
+        if sys.version_info[0] < 3:
+            suffix = '_d' if is_debug() else ''
+            flags['lib'] = 'python{}{}'.format(version, suffix)
+        else:
+            flags['lib'] = 'python{}{}'.format(version, sys.abiflags)
+
+    return flags
+
+
+def get_package_include_path(which_package):
+    package_path = find_package(which_package)
+    if package_path is None:
+        return None
+
+    includes = "{0}/include".format(package_path)
+
+    return includes
+
+
+def get_package_qmake_lflags(which_package):
+    package_path = find_package(which_package)
+    if package_path is None:
+        return None
+
+    link = "-L{}".format(package_path)
+    glob_result = glob.glob(os.path.join(package_path, shared_library_glob_pattern()))
+    for lib in filter_shared_libraries(glob_result):
+        link += ' '
+        link += link_option(lib)
+    return link
+
+
+def get_shared_libraries_data(which_package):
+    package_path = find_package(which_package)
+    if package_path is None:
+        return None
+
+    glob_result = glob.glob(os.path.join(package_path, shared_library_glob_pattern()))
+    filtered_libs = filter_shared_libraries(glob_result)
+    libs = []
+    if sys.platform == 'win32':
+        for lib in filtered_libs:
+            libs.append(os.path.realpath(lib))
+    else:
+        for lib in filtered_libs:
+            libs.append(lib)
+    return libs
+
+
+def get_shared_libraries_qmake(which_package):
+    libs = get_shared_libraries_data(which_package)
+    if libs is None:
+        return None
+
+    if sys.platform == 'win32':
+        if not libs:
+            return ''
+        dlls = ''
+        for lib in libs:
+            dll = os.path.splitext(lib)[0] + '.dll'
+            dlls += dll + ' '
+
+        return dlls
+    else:
+        libs_string = ''
+        for lib in libs:
+            libs_string += lib + ' '
+        return libs_string
+
+
+def get_shared_libraries_cmake(which_package):
+    libs = get_shared_libraries_data(which_package)
+    result = ';'.join(libs)
+    return result
+
+
+print_all = option == "-a"
+for argument, handler, error, _ in options:
+    if option == argument or print_all:
+        handler_result = handler()
+        if handler_result is None:
+            sys.exit(error)
+
+        line = handler_result
+        if print_all:
+            line = "{:<40}: ".format(argument) + line
+        print(line)
\ No newline at end of file
diff --git a/src/python/service/service.pro b/src/python/service/service.pro
new file mode 100644
index 0000000..499d7f2
--- /dev/null
+++ b/src/python/service/service.pro
@@ -0,0 +1,28 @@
+TEMPLATE = lib
+
+load(qt_build_paths)
+
+SHIBOKEN_MODULE_TARGET = QtService
+SHIBOKEN_MODULE_DEPENDS = QtCore QtNetwork
+
+SHIBOKEN_BINDINGS += \
+	typesystem_service.xml
+
+SHIBOKEN_WRAPPERS += \
+	qtservice \
+	qtservice_service \
+	qtservice_servicebackend \
+	qtservice_servicecontrol \
+	qtservice_terminal \
+	qtservice_terminal_awaitable
+
+PYSIDE2_PREFIX = /usr
+
+#SHIBOKEN2_FLAGS += --debug-level=full --no-suppress-warnings
+
+include(shiboken.pri)
+
+message(HEADERS $$HEADERS)
+message(INCLUDEPATH $$INCLUDEPATH)
+message(DEFINES $$DEFINES)
+message(LIBS $$LIBS)
diff --git a/src/python/service/setup.py b/src/python/service/setup.py
new file mode 100644
index 0000000..f26f2d0
--- /dev/null
+++ b/src/python/service/setup.py
@@ -0,0 +1,48 @@
+from distutils.core import setup, Extension
+
+module1 = Extension('PySide2.QtService', language='c++', sources=[
+						'PySide2/QtService/qtservice_module_wrapper.cpp',
+						'PySide2/QtService/qtservice_service_wrapper.cpp',
+						'PySide2/QtService/qtservice_servicebackend_wrapper.cpp',
+						'PySide2/QtService/qtservice_servicecontrol_wrapper.cpp',
+						'PySide2/QtService/qtservice_terminal_awaitable_wrapper.cpp',
+						'PySide2/QtService/qtservice_terminal_wrapper.cpp',
+						'PySide2/QtService/qtservice_wrapper.cpp'
+					], depends=[
+						'PySide2/QtService/pyside2_qtservice_python.h',
+						'PySide2/QtService/qtservice_service_wrapper.h',
+						'PySide2/QtService/qtservice_servicebackend_wrapper.h',
+						'PySide2/QtService/qtservice_servicecontrol_wrapper.h',
+						'PySide2/QtService/qtservice_terminal_awaitable_wrapper.h',
+						'PySide2/QtService/qtservice_terminal_wrapper.h',
+						'PySide2/QtService/qtservice_wrapper.h'
+					], define_macros=[
+						('QT_NO_NARROWING_CONVERSIONS_IN_CONNECT', None),
+						('QT_SERVICE_LIB', None),
+						('QT_NETWORK_LIB', None),
+						('QT_CORE_LIB', None)
+					], include_dirs=[
+						'../../../include',
+						'../../../include/QtService',
+						'/usr/include/shiboken2',
+						'/usr/include/PySide2',
+						'/usr/include/PySide2/QtCore',
+						'/usr/include/PySide2/QtNetwork',
+						'/usr/include/qt',
+						'/usr/include/qt/QtCore',
+						'/usr/include/qt/QtNetwork'
+					], library_dirs=[
+						'/home/sky/Programming/QtLibraries/build-qtservice-System_Qt_5_12_0-Debug/lib'
+						'/usr/lib/python3.7/site-packages/shiboken2',
+						'/usr/lib/python3.7/site-packages/PySide2'
+						'/usr/lib'
+					], libraries=[
+						'Qt5Service',
+						'Qt5Network',
+						'Qt5Core'
+					])
+
+setup(name='PySide2.QtService',
+	  version='1.1.2',
+	  description='This is a demo package',
+	  ext_modules=[module1])
diff --git a/src/python/service/shiboken.pri b/src/python/service/shiboken.pri
new file mode 100644
index 0000000..4ef7422
--- /dev/null
+++ b/src/python/service/shiboken.pri
@@ -0,0 +1,142 @@
+load(qt_build_paths)
+
+defineReplace(pyside2_config) {
+	win32: command = python.exe
+	else: command = python3
+	command += $$system_quote($$PWD/pyside2_config.py) $$1
+	result = $$system($$command)
+	return($$result)
+}
+
+defineReplace(python_config) {
+	win32: command = python.exe
+	command += $$system_quote($$PWD/config.py) $$1
+	result = $$system($$command)
+	return($$result)
+}
+
+isEmpty(PYSIDE2_PREFIX) {
+	QT_TOOL.shiboken2.binary = $$system_path($$pyside2_config(--shiboken2-generator-path)/shiboken2)
+	qtPrepareTool(SHIBOKEN2, shiboken2)
+	isEmpty(SHIBOKEN2_TYPESYSTEM_PATH): SHIBOKEN2_TYPESYSTEM_PATH = $$pyside2_config(--pyside2-path)/typesystems
+
+	INCLUDEPATH += \
+		$$pyside2_config(--shiboken2-generator-include-path) \
+		$$pyside2_config(--pyside2-include-path)
+	for(incpath, $$list($$pyside2_config(--pyside2-include-path))): \
+		for(module, SHIBOKEN_MODULE_DEPENDS): \
+			INCLUDEPATH += $$shell_quote($$incpath/$$module)
+} else {
+	QT_TOOL.shiboken2.binary = $$system_path($$PYSIDE2_PREFIX/bin/shiboken2)
+	qtPrepareTool(SHIBOKEN2, shiboken2)
+	isEmpty(SHIBOKEN2_TYPESYSTEM_PATH): SHIBOKEN2_TYPESYSTEM_PATH = $$PYSIDE2_PREFIX/share/PySide2/typesystems
+
+	INCLUDEPATH += \
+		$$PYSIDE2_PREFIX/include/shiboken2 \
+		$$PYSIDE2_PREFIX/include/PySide2
+	for(module, SHIBOKEN_MODULE_DEPENDS): INCLUDEPATH += $$shell_quote($$PYSIDE2_PREFIX/include/PySide2/$$module)
+}
+
+INCLUDEPATH += $$pyside2_config(--python-include-path)
+
+LIBS += \
+	$$pyside2_config(--shiboken2-module-qmake-lflags) \
+	$$pyside2_config(--pyside2-qmake-lflags) \
+	$$pyside2_config(--python-link-flags-qmake)
+
+isEmpty(SHIBOKEN2_DIR): SHIBOKEN2_DIR = .
+debug_and_release {
+	CONFIG(debug, debug|release): SHIBOKEN2_DIR = $$SHIBOKEN2_DIR/debug
+	CONFIG(release, debug|release): SHIBOKEN2_DIR = $$SHIBOKEN2_DIR/release
+}
+SHIBOKEN2_SRC_DIR = $$SHIBOKEN2_DIR/PySide2/$$SHIBOKEN_MODULE_TARGET
+
+isEmpty(SHIBOKEN2_CORE_FLAGS) {
+	 SHIBOKEN2_CORE_FLAGS = \
+		--generator-set=shiboken \
+		--enable-parent-ctor-heuristic \
+		--enable-return-value-heuristic \
+		--use-isnull-as-nb_nonzero
+		--avoid-protected-hack
+	qt: SHIBOKEN2_CORE_FLAGS += --enable-pyside-extensions
+
+	c++17: SHIBOKEN2_CORE_FLAGS += --language-level=c++17
+	else:c++14: SHIBOKEN2_CORE_FLAGS += --language-level=c++14
+	else:c++11: SHIBOKEN2_CORE_FLAGS += --language-level=c++11
+}
+
+# shiboken command
+{
+	__SHIBOKEN_ARGS = $$SHIBOKEN2_CORE_FLAGS $$SHIBOKEN2_FLAGS
+	__SHIBOKEN_ARGS += $$shell_quote(-I$$[QT_INSTALL_HEADERS])
+	for(module, SHIBOKEN_MODULE_DEPENDS): __SHIBOKEN_ARGS += $$shell_quote(-I$$[QT_INSTALL_HEADERS]/$$module)
+	__SHIBOKEN_ARGS += $$shell_quote(-I$$MODULE_BASE_OUTDIR/include)
+	__SHIBOKEN_ARGS += $$shell_quote(-I$$_PRO_FILE_PWD_)
+	for(incpath, INCLUDEPATH) __SHIBOKEN_ARGS += $$shell_quote(-I$$incpath)
+	qtConfig(framework) {
+		__SHIBOKEN_ARGS += $$shell_quote(-F$$[QT_INSTALL_LIBS])
+		for(lib, LIBS) {
+			prefix = $$str_member($$lib, 0, 1)
+			equals(prefix, "-F"): __SHIBOKEN_ARGS += $$shell_quote($$lib)
+		}
+	}
+	for(tspath, SHIBOKEN2_TYPESYSTEM_PATH): __SHIBOKEN_ARGS += $$shell_quote(-T$$tspath)
+	__SHIBOKEN_ARGS += $$shell_quote(--output-directory=$$SHIBOKEN2_DIR)
+	__SHIBOKEN_ARGS += $$shell_quote($$MODULE_BASE_OUTDIR/include/$$SHIBOKEN_MODULE_TARGET/$$SHIBOKEN_MODULE_TARGET)
+
+	shiboken2_c.name = shiboken ${QMAKE_FILE_IN}.xml
+	shiboken2_c.input = SHIBOKEN_BINDINGS
+	shiboken2_c.variable_out = GENERATED_SOURCES
+	shiboken2_c.commands = $$SHIBOKEN2 $$__SHIBOKEN_ARGS ${QMAKE_FILE_IN}
+	shiboken2_c.output = $$SHIBOKEN2_SRC_DIR/$$lower($$SHIBOKEN_MODULE_TARGET)_module_wrapper.cpp
+	shiboken2_c.depends += $$SHIBOKEN2_EXE
+	shiboken2_c.dependency_type = TYPE_C
+	QMAKE_EXTRA_COMPILERS += shiboken2_c
+
+	shiboken2_h_c.name = shiboken headers ${QMAKE_FILE_IN}
+	shiboken2_h_c.input = SHIBOKEN_WRAPPERS
+	shiboken2_h_c.variable_out = HEADERS
+	shiboken2_h_c.commands = $$escape_expand(\\n) # force creation of rule
+	shiboken2_h_c.output = $$SHIBOKEN2_SRC_DIR/${QMAKE_FILE_BASE}_wrapper.h
+	shiboken2_h_c.CONFIG += explicit_dependencies no_dependencies
+	shiboken2_h_c.depends += $$SHIBOKEN2_SRC_DIR/$$lower($$SHIBOKEN_MODULE_TARGET)_module_wrapper.cpp
+	shiboken2_h_c.dependency_type = TYPE_C
+	QMAKE_EXTRA_COMPILERS += shiboken2_h_c
+
+	shiboken2_cpp_c.name = shiboken sources ${QMAKE_FILE_IN}
+	shiboken2_cpp_c.input = SHIBOKEN_WRAPPERS
+	shiboken2_cpp_c.variable_out = GENERATED_SOURCES
+	shiboken2_cpp_c.commands = $$escape_expand(\\n) # force creation of rule
+	shiboken2_cpp_c.output = $$SHIBOKEN2_SRC_DIR/${QMAKE_FILE_BASE}_wrapper.cpp
+	shiboken2_cpp_c.CONFIG += explicit_dependencies no_dependencies
+	shiboken2_cpp_c.depends += $$SHIBOKEN2_SRC_DIR/$$lower($$SHIBOKEN_MODULE_TARGET)_module_wrapper.cpp
+	shiboken2_cpp_c.dependency_type = TYPE_C
+	QMAKE_EXTRA_COMPILERS += shiboken2_cpp_c
+
+	for(wrapper, SHIBOKEN_WRAPPERS): QMAKE_EXTRA_TARGETS += $$wrapper
+
+	HEADERS += $$shadowed($$SHIBOKEN2_SRC_DIR/pyside2_$$lower($$SHIBOKEN_MODULE_TARGET)_python.h)
+}
+
+load(qt_common)
+
+QT =
+for(qt_mod, $$list($$SHIBOKEN_MODULE_TARGET $$SHIBOKEN_MODULE_DEPENDS)): \
+	QT += $$lower($$str_member($$qt_mod, 2, -1))
+
+CONFIG += unversioned_soname unversioned_libname plugin no_plugin_name_prefix
+qtConfig(debug_and_release): CONFIG += debug_and_release
+qtConfig(build_all): CONFIG += build_all
+
+darwin: QMAKE_CXXFLAGS += -undefined dynamic_lookup
+
+DESTDIR = $$MODULE_BASE_OUTDIR/lib/PySide2
+DLLDESTDIR = $$MODULE_BASE_OUTDIR/bin/PySide2
+
+TARGET = "$${SHIBOKEN_MODULE_TARGET}"
+QMAKE_EXTENSION_SHLIB = $$str_member($$python_config(suffix), 1, -1)
+
+DISTFILES += \
+	$$PWD/pyside2_config.py \
+	$$PWD/setup.py \
+	$$PWD/config.py
diff --git a/src/python/service/typesystem_service.xml b/src/python/service/typesystem_service.xml
new file mode 100644
index 0000000..c7e6b88
--- /dev/null
+++ b/src/python/service/typesystem_service.xml
@@ -0,0 +1,44 @@
+<typesystem package="PySide2.QtService">
+	<load-typesystem name="typesystem_core.xml" generate="no"/>
+	<load-typesystem name="typesystem_network.xml" generate="no"/>
+
+	<namespace-type name="QtService">
+		<object-type name="Service">
+			<enum-type name="CommandResult"/>
+			<enum-type name="TerminalMode"/>
+
+			<!--add-function signature="Service(QStringList)">
+				<inject-code file="glue/qtservice.cpp" snippet="qtserver-service-1"/>
+			</add-function>
+			<add-function signature="Service()">
+				<inject-code file="glue/qtservice.cpp" snippet="qtserver-service-2"/>
+			</add-function-->
+			<modify-function signature="Service(int &amp;,char **,int)" access="private"/>
+		</object-type>
+
+		<object-type name="ServiceBackend">
+			<enum-type name="ServiceCommand"/>
+
+			<modify-function signature="runService(int &amp;,char **,int)" access="private"/>
+		</object-type>
+
+		<object-type name="ServiceControl">
+			<enum-type name="SupportFlag" flags="SupportFlags"/>
+			<enum-type name="ServiceStatus"/>
+
+			<modify-function signature="ServiceControl(QString &amp;&amp;, QObject *)" remove="all" />
+		</object-type>
+
+		<object-type name="Terminal">
+			<object-type name="Awaitable">
+				<enum-type name="SpecialReads"/>
+
+				<modify-function signature="Awaitable(QtService::Terminal *, qint64)">
+					<modify-argument index="2">
+						<replace-default-expression with="QtService::Terminal::Awaitable::ReadSingle"/>
+					</modify-argument>
+				</modify-function>
+			</object-type>
+		</object-type>
+	</namespace-type>
+</typesystem>
diff --git a/src/service/service.h b/src/service/service.h
index f4e10ce..7c60219 100644
--- a/src/service/service.h
+++ b/src/service/service.h
@@ -57,12 +57,6 @@ class Q_SERVICE_EXPORT Service : public QObject
 	using CommandMode Q_DECL_ENUMERATOR_DEPRECATED = CommandResult;//MAJOR compat remove
 	Q_ENUM(CommandResult)
 
-#ifdef Q_CC_MSVC
-#pragma deprecated(CommandMode)
-#pragma deprecated(Synchronous)
-#pragma deprecated(Asynchronous)
-#endif
-
 	//! The modes a terminal can be in
 	enum TerminalMode {
 		ReadOnly, //!< The terminal can only receive data from the service. Useful for machine-to-machine communication
diff --git a/src/src.pro b/src/src.pro
index 032405f..2de8853 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -6,7 +6,10 @@ SUBDIRS += service \
 
 android:!android-embedded: SUBDIRS += java
 
+python_bindings: SUBDIRS += python
+
 plugins.depends += service
 imports.depends += service
+python.depends += service
 
 QMAKE_EXTRA_TARGETS += run-tests
