diff --git a/test/test_asyncio.py b/test/test_asyncio.py
new file mode 100644
index 0000000..4794bfe
--- /dev/null
+++ b/test/test_asyncio.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+#
+# This file is part of pySerial - Cross platform serial port support for Python
+# (C) 2016 Chris Liechti <cliechti@gmx.net>
+#
+# SPDX-License-Identifier:    BSD-3-Clause
+"""\
+Test asyncio related functionality.
+"""
+
+import unittest
+import serial
+
+# on which port should the tests be performed:
+PORT = '/dev/ttyUSB0'
+
+try:
+    import asyncio
+    import serial.aio
+except (ImportError, SyntaxError):
+    # not compatible with python 2.x
+    pass
+else:
+
+    class Test_asyncio(unittest.TestCase):
+        """Test asyncio related functionality"""
+
+        def setUp(self):
+            self.loop = asyncio.get_event_loop()
+            # create a closed serial port
+
+        def tearDown(self):
+            self.loop.close()
+
+        def test_asyncio(self):
+            TEXT = b'hello world\n'
+            received = []
+            actions = []
+
+            class Output(asyncio.Protocol):
+                def connection_made(self, transport):
+                    self.transport = transport
+                    actions.append('open')
+                    transport.serial.rts = False
+                    transport.write(TEXT)
+
+                def data_received(self, data):
+                    #~ print('data received', repr(data))
+                    received.append(data)
+                    if b'\n' in data:
+                        self.transport.close()
+
+                def connection_lost(self, exc):
+                    actions.append('close')
+                    asyncio.get_event_loop().stop()
+
+                def pause_writing(self):
+                    actions.append('pause')
+                    print(self.transport.get_write_buffer_size())
+
+                def resume_writing(self):
+                    actions.append('resume')
+                    print(self.transport.get_write_buffer_size())
+
+            coro = serial.aio.create_serial_connection(self.loop, Output, PORT, baudrate=115200)
+            self.loop.run_until_complete(coro)
+            self.loop.run_forever()
+            self.assertEqual(b''.join(received), TEXT)
+            self.assertEqual(actions, ['open', 'close'])
+
+
+if __name__ == '__main__':
+    import sys
+    sys.stdout.write(__doc__)
+    if len(sys.argv) > 1:
+        PORT = sys.argv[1]
+    sys.stdout.write("Testing port: %r\n" % PORT)
+    sys.argv[1:] = ['-v']
+    # When this module is executed from the command-line, it runs all its tests
+    unittest.main()
