diff --git a/tox.ini b/tox.ini
index e1222b8..4c1de61 100644
--- a/tox.ini
+++ b/tox.ini
@@ -15,5 +15,6 @@ commands = flake8
 commands = {posargs}
 
 [flake8]
-ignore = E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405
+# W504 skipped since you must choose either W503 or W504 (they conflict)
+ignore = E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504
 exclude = venv,.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
diff --git a/vspc/async_telnet.py b/vspc/async_telnet.py
index deb40db..980318b 100644
--- a/vspc/async_telnet.py
+++ b/vspc/async_telnet.py
@@ -44,6 +44,12 @@ class AsyncTelnet:
         self.sb = 0  # flag for SB and SE sequence.
         self.sbdataq = b''
 
+    @staticmethod
+    def escape(data):
+        """Escape any Telnet IACs with another IAC.
+        """
+        return data.replace(IAC, IAC + IAC)
+
     @asyncio.coroutine
     def process_rawq(self):
         """Transfer from raw queue to cooked queue.
diff --git a/vspc/server.py b/vspc/server.py
index 524e922..39cf053 100755
--- a/vspc/server.py
+++ b/vspc/server.py
@@ -121,7 +121,7 @@ class VspcServer(object):
         secret = os.urandom(4)
         LOG.debug(">> %s VMOTION-GOAHEAD %s %s", peer, data, secret)
         writer.write(IAC + SB + VMWARE_EXT + VMOTION_GOAHEAD +
-                     data + secret + IAC + SE)
+                     async_telnet.AsyncTelnet.escape(data + secret) + IAC + SE)
         yield from writer.drain()
 
     @asyncio.coroutine
@@ -130,7 +130,8 @@ class VspcServer(object):
         peer = socket.getpeername()
         LOG.debug("<< %s VMOTION-PEER %s", peer, data)
         LOG.debug("<< %s VMOTION-PEER-OK %s", peer, data)
-        writer.write(IAC + SB + VMWARE_EXT + VMOTION_PEER_OK + data + IAC + SE)
+        writer.write(IAC + SB + VMWARE_EXT + VMOTION_PEER_OK +
+                     async_telnet.AsyncTelnet.escape(data) + IAC + SE)
         yield from writer.drain()
 
     def handle_vmotion_complete(self, socket, data):