diff --git a/IPython/zmq/kernelapp.py b/IPython/zmq/kernelapp.py
index 8e21a2b..fdb1b07 100644
--- a/IPython/zmq/kernelapp.py
+++ b/IPython/zmq/kernelapp.py
@@ -192,6 +192,7 @@ class KernelApp(BaseIPythonApplication):
                                 shell_socket=self.shell_socket,
                                 iopub_socket=self.iopub_socket,
                                 stdin_socket=self.stdin_socket,
+                                log=self.log
         )
         self.kernel.record_ports(self.ports)
 
diff --git a/IPython/zmq/pykernel.py b/IPython/zmq/pykernel.py
index f317f4b..fb62629 100755
--- a/IPython/zmq/pykernel.py
+++ b/IPython/zmq/pykernel.py
@@ -60,6 +60,7 @@ class Kernel(HasTraits):
     shell_socket = Instance('zmq.Socket')
     iopub_socket = Instance('zmq.Socket')
     stdin_socket = Instance('zmq.Socket')
+    log = Instance('logging.Logger')
 
     def __init__(self, **kwargs):
         super(Kernel, self).__init__(**kwargs)
@@ -82,11 +83,10 @@ class Kernel(HasTraits):
             ident,msg = self.session.recv(self.shell_socket,0)
             assert ident is not None, "Missing message part."
             omsg = Message(msg)
-            print>>sys.__stdout__
-            print>>sys.__stdout__, omsg
+            self.log.debug(str(omsg))
             handler = self.handlers.get(omsg.msg_type, None)
             if handler is None:
-                print >> sys.__stderr__, "UNKNOWN MESSAGE TYPE:", omsg
+                self.log.error("UNKNOWN MESSAGE TYPE: %s"%omsg)
             else:
                 handler(ident, omsg)
 
@@ -106,8 +106,7 @@ class Kernel(HasTraits):
         try:
             code = parent[u'content'][u'code']
         except:
-            print>>sys.__stderr__, "Got bad msg: "
-            print>>sys.__stderr__, Message(parent)
+            self.log.error("Got bad msg: %s"%Message(parent))
             return
         pyin_msg = self.session.send(self.iopub_socket, u'pyin',{u'code':code}, parent=parent)
 
@@ -150,7 +149,7 @@ class Kernel(HasTraits):
 
         # Send the reply.
         reply_msg = self.session.send(self.shell_socket, u'execute_reply', reply_content, parent, ident=ident)
-        print>>sys.__stdout__, Message(reply_msg)
+        self.log.debug(Message(reply_msg))
         if reply_msg['content']['status'] == u'error':
             self._abort_queue()
 
@@ -159,14 +158,14 @@ class Kernel(HasTraits):
                    'status' : 'ok'}
         completion_msg = self.session.send(self.shell_socket, 'complete_reply',
                                            matches, parent, ident)
-        print >> sys.__stdout__, completion_msg
+        self.log.debug(completion_msg)
 
     def object_info_request(self, ident, parent):
         context = parent['content']['oname'].split('.')
         object_info = self._object_info(context)
         msg = self.session.send(self.shell_socket, 'object_info_reply',
                                 object_info, parent, ident)
-        print >> sys.__stdout__, msg
+        self.log.debug(msg)
 
     def shutdown_request(self, ident, parent):
         content = dict(parent['content'])
@@ -174,7 +173,7 @@ class Kernel(HasTraits):
                                 content, parent, ident)
         msg = self.session.send(self.iopub_socket, 'shutdown_reply',
                                 content, parent, ident)
-        print >> sys.__stdout__, msg
+        self.log.debug(msg)
         time.sleep(0.1)
         sys.exit(0)
 
@@ -184,17 +183,17 @@ class Kernel(HasTraits):
 
     def _abort_queue(self):
         while True:
-            ident,msg = self.session.recv(self.reply_socket, zmq.NOBLOCK)
+            ident,msg = self.session.recv(self.shell_socket, zmq.NOBLOCK)
             if msg is None:
+                # msg=None on EAGAIN
                 break
             else:
-                assert ident is not None, "Unexpected missing message part."
-            print>>sys.__stdout__, "Aborting:"
-            print>>sys.__stdout__, Message(msg)
+                assert ident is not None, "Missing message part."
+            self.log.debug("Aborting: %s"%Message(msg))
             msg_type = msg['msg_type']
             reply_type = msg_type.split('_')[0] + '_reply'
             reply_msg = self.session.send(self.shell_socket, reply_type, {'status':'aborted'}, msg, ident=ident)
-            print>>sys.__stdout__, Message(reply_msg)
+            self.log.debug(Message(reply_msg))
             # We need to wait a bit for requests to come in. This can probably
             # be set shorter for true asynchronous clients.
             time.sleep(0.1)
@@ -213,8 +212,7 @@ class Kernel(HasTraits):
         try:
             value = reply['content']['value']
         except:
-            print>>sys.__stderr__, "Got bad raw_input reply: "
-            print>>sys.__stderr__, Message(parent)
+            self.log.error("Got bad raw_input reply: %s"%Message(parent))
             value = ''
         return value