diff --git a/lib/ansible/plugins/callback/default.py b/lib/ansible/plugins/callback/default.py
index 71a25932e53..1ae2eadd8f3 100644
--- a/lib/ansible/plugins/callback/default.py
+++ b/lib/ansible/plugins/callback/default.py
@@ -147,14 +147,14 @@ class CallbackModule(CallbackBase):
         # (shoulder surfing, logging stdout straight to a file, etc).
         args = ''
         if not task.no_log and C.DISPLAY_ARGS_TO_STDOUT:
-            args = ', '.join(('%s=%s' % a for a in task.args.items()))
-            args = ' %s' % args
+            args = u', '.join(u'%s=%s' % a for a in task.args.items())
+            args = u' %s' % args
 
-        self._display.banner("TASK [%s%s]" % (task.get_name().strip(), args))
+        self._display.banner(u"TASK [%s%s]" % (task.get_name().strip(), args))
         if self._display.verbosity >= 2:
             path = task.get_path()
             if path:
-                self._display.display("task path: %s" % path, color=C.COLOR_DEBUG)
+                self._display.display(u"task path: %s" % path, color=C.COLOR_DEBUG)
 
         self._last_task_banner = task._uuid
 
@@ -167,9 +167,9 @@ class CallbackModule(CallbackBase):
     def v2_playbook_on_play_start(self, play):
         name = play.get_name().strip()
         if not name:
-            msg = "PLAY"
+            msg = u"PLAY"
         else:
-            msg = "PLAY [%s]" % name
+            msg = u"PLAY [%s]" % name
 
         self._play = play
 
diff --git a/lib/ansible/utils/display.py b/lib/ansible/utils/display.py
index acf1aad3ec4..72e48f919a2 100644
--- a/lib/ansible/utils/display.py
+++ b/lib/ansible/utils/display.py
@@ -58,7 +58,11 @@ if C.DEFAULT_LOG_PATH:
     else:
         print("[WARNING]: log file at %s is not writeable and we cannot create it, aborting\n" % path, file=sys.stderr)
 
-
+b_COW_PATHS = (b"/usr/bin/cowsay",
+               b"/usr/games/cowsay",
+               b"/usr/local/bin/cowsay",  # BSD path for cowsay
+               b"/opt/local/bin/cowsay",  # MacPorts path for cowsay
+              )
 class Display:
 
     def __init__(self, verbosity=0):
@@ -71,35 +75,27 @@ class Display:
         self._warns        = {}
         self._errors       = {}
 
-        self.cowsay = None
+        self.b_cowsay = None
         self.noncow = C.ANSIBLE_COW_SELECTION
 
         self.set_cowsay_info()
 
-        if self.cowsay:
+        if self.b_cowsay:
             try:
-                cmd = subprocess.Popen([self.cowsay, "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                cmd = subprocess.Popen([self.b_cowsay, "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                 (out, err) = cmd.communicate()
-                self.cows_available = list(set(C.ANSIBLE_COW_WHITELIST).intersection(out.split()))
+                self.cows_available = [ to_bytes(c) for c in set(C.ANSIBLE_COW_WHITELIST).intersection(out.split())]
             except:
                 # could not execute cowsay for some reason
-                self.cowsay = False
+                self.b_cowsay = False
 
         self._set_column_width()
 
     def set_cowsay_info(self):
-
         if not C.ANSIBLE_NOCOWS:
-            if os.path.exists("/usr/bin/cowsay"):
-                self.cowsay = "/usr/bin/cowsay"
-            elif os.path.exists("/usr/games/cowsay"):
-                self.cowsay = "/usr/games/cowsay"
-            elif os.path.exists("/usr/local/bin/cowsay"):
-                # BSD path for cowsay
-                self.cowsay = "/usr/local/bin/cowsay"
-            elif os.path.exists("/opt/local/bin/cowsay"):
-                # MacPorts path for cowsay
-                self.cowsay = "/opt/local/bin/cowsay"
+            for b_cow_path in b_COW_PATHS:
+                if os.path.exists(b_cow_path):
+                    self.b_cowsay = b_cow_path
 
     def display(self, msg, color=None, stderr=False, screen_only=False, log_only=False):
         """ Display a message to the user
@@ -231,7 +227,7 @@ class Display:
         Prints a header-looking line with stars taking up to 80 columns
         of width (3 columns, minimum)
         '''
-        if self.cowsay:
+        if self.b_cowsay:
             try:
                 self.banner_cowsay(msg)
                 return
@@ -242,25 +238,25 @@ class Display:
         star_len = (79 - len(msg))
         if star_len < 0:
             star_len = 3
-        stars = "*" * star_len
-        self.display("\n%s %s" % (msg, stars), color=color)
+        stars = u"*" * star_len
+        self.display(u"\n%s %s" % (msg, stars), color=color)
 
     def banner_cowsay(self, msg, color=None):
-        if ": [" in msg:
-            msg = msg.replace("[","")
-            if msg.endswith("]"):
+        if u": [" in msg:
+            msg = msg.replace(u"[", u"")
+            if msg.endswith(u"]"):
                 msg = msg[:-1]
-        runcmd = [self.cowsay,"-W", "60"]
+        runcmd = [self.b_cowsay, b"-W", b"60"]
         if self.noncow:
             thecow = self.noncow
-            if thecow == 'random':
+            if thecow == b'random':
                 thecow = random.choice(self.cows_available)
-            runcmd.append('-f')
+            runcmd.append(b'-f')
             runcmd.append(thecow)
-        runcmd.append(msg)
+        runcmd.append(to_bytes(msg))
         cmd = subprocess.Popen(runcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         (out, err) = cmd.communicate()
-        self.display("%s\n" % out, color=color)
+        self.display(u"%s\n" % to_text(out), color=color)
 
     def error(self, msg, wrap_text=True):
         if wrap_text: