diff --git a/warden3/warden_server/warden_server.py b/warden3/warden_server/warden_server.py
index f6932eb08e9aeaece31feeade97f4eb1efcb159a..0afa90a7525b9998a6c4d9b216939978ad537b65 100755
--- a/warden3/warden_server/warden_server.py
+++ b/warden3/warden_server/warden_server.py
@@ -4,6 +4,8 @@
 # Copyright (C) 2011-2015 Cesnet z.s.p.o
 # Use of this source is governed by a 3-clause BSD-style license, see LICENSE file.
 
+from __future__ import print_function
+
 import sys
 import os
 import logging
@@ -1473,7 +1475,7 @@ def build_server(conf, section_order=section_order, section_def=section_def, par
 
 def check_config():
     # If we got so far, server object got set up fine
-    print >>sys.stderr, "Looks clear."
+    print("Looks clear.", file=sys.stderr)
     return 0
 
 
@@ -1483,7 +1485,7 @@ def list_clients(id=None):
     col_width = [max(len(val) for val in col) for col in zip(*(lines+[Client._fields]))]
     divider = ["-" * l for l in col_width]
     for line in [Client._fields, divider] + lines:
-        print " ".join([val.ljust(width) for val, width in zip(line, col_width)])
+        print(" ".join([val.ljust(width) for val, width in zip(line, col_width)]))
     return 0
 
 
@@ -1529,29 +1531,29 @@ def modify_client(**kwargs):
     if kwargs["name"] is not None:
         kwargs["name"] = kwargs["name"].lower()
         if not isValidNSID(kwargs["name"]):
-            print >>sys.stderr, "Invalid client name \"%s\"." % kwargs["name"]
+            print("Invalid client name \"%s\"." % (kwargs["name"]), file=sys.stderr)
             return 254
 
     if kwargs["hostname"] is not None:
         kwargs["hostname"] = kwargs["hostname"].lower()
         if not isValidHostname(kwargs["hostname"]):
-            print >>sys.stderr, "Invalid hostname \"%s\"." % kwargs["hostname"]
+            print("Invalid hostname \"%s\"." % (kwargs["hostname"]), file=sys.stderr)
             return 253
 
     if kwargs["requestor"] is not None and not isValidEmail(kwargs["requestor"]):
-        print >>sys.stderr, "Invalid requestor email \"%s\"." % kwargs["requestor"]
+        print("Invalid requestor email \"%s\"." % (kwargs["requestor"]), file=sys.stderr)
         return 252
 
     if kwargs["id"] is not None and not isValidID(kwargs["id"]):
-        print >>sys.stderr, "Invalid id \"%s\"." % kwargs["id"]
+        print("Invalid id \"%s\"." % (kwargs["id"]), file=sys.stderr)
         return 251
 
     for c in server.handler.db.get_clients():
         if kwargs["name"] is not None and kwargs["name"].lower()==c.name:
-            print >>sys.stderr, "Clash with existing name: %s" % str(c)
+            print("Clash with existing name: %s" % (str(c)), file=sys.stderr)
             return 250
         if kwargs["secret"] is not None and kwargs["secret"]==c.secret:
-            print >>sys.stderr, "Clash with existing secret: %s" % str(c)
+            print("Clash with existing secret: %s" % str(c), file=sys.stderr)
             return 249
 
     newid = server.handler.db.add_modify_client(**kwargs)
@@ -1569,10 +1571,10 @@ def purge(days=30, lastlog=None, events=None):
         lastlog = events = True
     if lastlog:
         count = server.handler.db.purge_lastlog(days)
-        print "Purged %d lastlog entries." % count
+        print("Purged %d lastlog entries." % (count))
     if events:
         count = server.handler.db.purge_events(days)
-        print "Purged %d events." % count
+        print("Purged %d events." % (count))
     return 0
 
 
@@ -1695,6 +1697,6 @@ if __name__=="__main__":
     del subargs["command"]
     del subargs["config"]
     if not server or server is fallback_wsgi:
-        print >>sys.stderr, "Failed initialization, check configured log targets for reasons."
+        print("Failed initialization, check configured log targets for reasons.", file=sys.stderr)
         sys.exit(255)
     sys.exit(command(**subargs))