diff --git a/.travis.yml b/.travis.yml
index a1a314d9..a8e2fa86 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,5 +18,5 @@ install:
   - export PYTHONWARNINGS=all
 script:
   - python checkdeps.py
-  - xvfb-run src/bitmessagemain.py -t
+  - python src/bitmessagemain.py -t
   - python -bm tests
diff --git a/requirements.txt b/requirements.txt
index 388d825b..c7c599d5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,7 @@
 coverage
-python_prctl;platform_system=="Linux"
 psutil
 pycrypto
-six
 PyQt5;python_version>="3.7"
+python_prctl;platform_system=="Linux"
+six
+xvfbwrapper;platform_system=="Linux"
diff --git a/src/tests/core.py b/src/tests/core.py
index 92d66bc0..18685e13 100644
--- a/src/tests/core.py
+++ b/src/tests/core.py
@@ -3,6 +3,7 @@ Tests for core and those that do not work outside
 (because of import error for example)
 """
 
+import atexit
 import os
 import pickle  # nosec
 import Queue
@@ -416,8 +417,9 @@ def run():
     suite = loader.loadTestsFromTestCase(TestCore)
     try:
         import bitmessageqt.tests
+        from xvfbwrapper import Xvfb
     except ImportError:
-        pass
+        Xvfb = None
     else:
         qt_tests = loader.loadTestsFromModule(bitmessageqt.tests)
         suite.addTests(qt_tests)
@@ -428,4 +430,8 @@ def run():
 
     sys.excepthook = keep_exc
 
+    if Xvfb:
+        vdisplay = Xvfb(width=1024, height=768)
+        vdisplay.start()
+        atexit.register(vdisplay.stop)
     return unittest.TextTestRunner(verbosity=2).run(suite)