diff --git a/setup.py b/setup.py
index 7a3bcf6a..570a4224 100644
--- a/setup.py
+++ b/setup.py
@@ -4,6 +4,7 @@ import os
 import platform
 import shutil
 import sys
+import unittest
 
 from setuptools import setup, Extension
 from setuptools.command.install import install
@@ -45,6 +46,11 @@ class InstallCmd(install):
         return install.run(self)
 
 
+def unittest_discover():
+    """Explicit test suite creation"""
+    return unittest.TestLoader().discover('pybitmessage.tests')
+
+
 if __name__ == "__main__":
     here = os.path.abspath(os.path.dirname(__file__))
     with open(os.path.join(here, 'README.md')) as f:
@@ -116,6 +122,7 @@ if __name__ == "__main__":
         #keywords='',
         install_requires=installRequires,
         tests_require=requirements,
+        test_suite='setup.unittest_discover',
         extras_require=EXTRAS_REQUIRE,
         classifiers=[
             "License :: OSI Approved :: MIT License"
diff --git a/src/tests/apinotify_handler.py b/src/tests/apinotify_handler.py
index 4574d46a..d3993f4d 100755
--- a/src/tests/apinotify_handler.py
+++ b/src/tests/apinotify_handler.py
@@ -7,7 +7,7 @@ when pybitmessage started in test mode.
 import sys
 import tempfile
 
-from test_process import put_signal_file
+from common import put_signal_file
 
 
 if __name__ == '__main__':
diff --git a/src/tests/common.py b/src/tests/common.py
index 2f130e25..e87765a4 100644
--- a/src/tests/common.py
+++ b/src/tests/common.py
@@ -1,4 +1,7 @@
 import os
+import sys
+import time
+import unittest
 
 
 _files = (
@@ -17,3 +20,15 @@ def cleanup(home=None, files=_files):
             os.remove(os.path.join(home, pfile))
         except OSError:
             pass
+
+
+def skip_python3():
+    """Raise unittest.SkipTest() if detected python3"""
+    if sys.hexversion >= 0x3000000:
+        raise unittest.SkipTest('Module is not ported to python3')
+
+
+def put_signal_file(path, filename):
+    """Creates file, presence of which is a signal about some event."""
+    with open(os.path.join(path, filename), 'wb') as outfile:
+        outfile.write(b'%i' % time.time())
diff --git a/src/tests/test_api.py b/src/tests/test_api.py
index e3756f54..43c97233 100644
--- a/src/tests/test_api.py
+++ b/src/tests/test_api.py
@@ -5,9 +5,13 @@ Tests using API.
 import base64
 import json
 import time
-import xmlrpclib  # nosec
 
-from test_process import TestProcessProto, TestProcessShutdown
+try:  # nosec
+    from xmlrpclib import ServerProxy, ProtocolError
+except ImportError:
+    from xmlrpc.client import ServerProxy, ProtocolError
+
+from .test_process import TestProcessProto, TestProcessShutdown
 
 
 class TestAPIProto(TestProcessProto):
@@ -19,7 +23,7 @@ class TestAPIProto(TestProcessProto):
         """Setup XMLRPC proxy for pybitmessage API"""
         super(TestAPIProto, cls).setUpClass()
         cls.addresses = []
-        cls.api = xmlrpclib.ServerProxy(
+        cls.api = ServerProxy(
             "http://username:password@127.0.0.1:8442/")
         for _ in range(5):
             if cls._get_readline('.api_started'):
@@ -65,8 +69,8 @@ class TestAPI(TestAPIProto):
 
     def test_user_password(self):
         """Trying to connect with wrong username/password"""
-        api_wrong = xmlrpclib.ServerProxy("http://test:wrong@127.0.0.1:8442/")
-        with self.assertRaises(xmlrpclib.ProtocolError):
+        api_wrong = ServerProxy("http://test:wrong@127.0.0.1:8442/")
+        with self.assertRaises(ProtocolError):
             api_wrong.clientStatus()
 
     def test_connection(self):
diff --git a/src/tests/test_config.py b/src/tests/test_config.py
index fcf8c498..a3b90a4c 100644
--- a/src/tests/test_config.py
+++ b/src/tests/test_config.py
@@ -6,8 +6,8 @@ import os
 import unittest
 import tempfile
 
+from .test_process import TestProcessProto
 from pybitmessage.bmconfigparser import BMConfigParser
-from test_process import TestProcessProto
 
 
 class TestConfig(unittest.TestCase):
diff --git a/src/tests/test_crypto.py b/src/tests/test_crypto.py
index b53105cb..c17bac29 100644
--- a/src/tests/test_crypto.py
+++ b/src/tests/test_crypto.py
@@ -6,8 +6,10 @@ import hashlib
 import unittest
 from abc import ABCMeta, abstractmethod
 from binascii import hexlify, unhexlify
+
 from pybitmessage.pyelliptic import arithmetic
 
+
 try:
     from Crypto.Hash import RIPEMD
 except ImportError:
diff --git a/src/tests/test_logger.py b/src/tests/test_logger.py
index a24667fd..da0f9341 100644
--- a/src/tests/test_logger.py
+++ b/src/tests/test_logger.py
@@ -5,7 +5,7 @@ Testing the logger configuration
 import os
 import tempfile
 
-from test_process import TestProcessProto
+from .test_process import TestProcessProto
 
 
 class TestLogger(TestProcessProto):
diff --git a/src/tests/test_networkgroup.py b/src/tests/test_networkgroup.py
index 76cfb033..79163402 100644
--- a/src/tests/test_networkgroup.py
+++ b/src/tests/test_networkgroup.py
@@ -3,6 +3,10 @@ Test for network group
 """
 import unittest
 
+from .common import skip_python3
+
+skip_python3()
+
 
 class TestNetworkGroup(unittest.TestCase):
     """
diff --git a/src/tests/test_openclpow.py b/src/tests/test_openclpow.py
index 63551ee2..6cfb5bd2 100644
--- a/src/tests/test_openclpow.py
+++ b/src/tests/test_openclpow.py
@@ -3,9 +3,12 @@ Tests for openclpow module
 """
 import hashlib
 import unittest
-
 from struct import pack, unpack
 
+from .common import skip_python3
+
+skip_python3()  # noqa:E402
+
 from pybitmessage import openclpow
 
 
diff --git a/src/tests/test_process.py b/src/tests/test_process.py
index 5e08ddd0..0888c21d 100644
--- a/src/tests/test_process.py
+++ b/src/tests/test_process.py
@@ -12,13 +12,10 @@ import unittest
 
 import psutil
 
-from common import cleanup
+from .common import cleanup, put_signal_file, skip_python3
 
 
-def put_signal_file(path, filename):
-    """Creates file, presence of which is a signal about some event."""
-    with open(os.path.join(path, filename), 'wb') as outfile:
-        outfile.write(b'%i' % time.time())
+skip_python3()
 
 
 class TestProcessProto(unittest.TestCase):
diff --git a/src/tests/test_protocol.py b/src/tests/test_protocol.py
index 84d87a0f..a3c73a73 100644
--- a/src/tests/test_protocol.py
+++ b/src/tests/test_protocol.py
@@ -4,6 +4,10 @@ Tests for common protocol functions
 
 import unittest
 
+from .common import skip_python3
+
+skip_python3()
+
 
 class TestProtocol(unittest.TestCase):
     """Main protocol test case"""