diff --git a/IPython/core/builtin_trap.py b/IPython/core/builtin_trap.py
index 38a8097..c89bb64 100755
--- a/IPython/core/builtin_trap.py
+++ b/IPython/core/builtin_trap.py
@@ -32,6 +32,9 @@ from IPython.utils.traitlets import Instance
 class __BuiltinUndefined(object): pass
 BuiltinUndefined = __BuiltinUndefined()
 
+class __HideBuiltin(object): pass
+HideBuiltin = __HideBuiltin()
+
 
 class BuiltinTrap(Configurable):
 
@@ -44,9 +47,10 @@ class BuiltinTrap(Configurable):
         # Only turn off the trap when the outermost call to __exit__ is made.
         self._nested_level = 0
         self.shell = shell
-        # builtins we always add
-        self.auto_builtins = {'exit': Quitter(self.shell, 'exit'),
-                              'quit': Quitter(self.shell, 'quit'),
+        # builtins we always add - if set to HideBuiltin, they will just
+        # be removed instead of being replaced by something else
+        self.auto_builtins = {'exit': HideBuiltin,
+                              'quit': HideBuiltin,
                               'get_ipython': self.shell.get_ipython,
                               }
         # Recursive reload function
@@ -78,7 +82,10 @@ class BuiltinTrap(Configurable):
         bdict = __builtin__.__dict__
         orig = bdict.get(key, BuiltinUndefined)
         self._orig_builtins[key] = orig
-        bdict[key] = value
+        if value is HideBuiltin:
+            del bdict[key]
+        else:
+            bdict[key] = value
 
     def remove_builtin(self, key):
         """Remove an added builtin and re-set the original."""
diff --git a/IPython/frontend/qt/console/ipythonqt.py b/IPython/frontend/qt/console/ipythonqt.py
index b759fd9..a243fbc 100644
--- a/IPython/frontend/qt/console/ipythonqt.py
+++ b/IPython/frontend/qt/console/ipythonqt.py
@@ -58,12 +58,16 @@ class MainWindow(QtGui.QMainWindow):
     #---------------------------------------------------------------------------
     
     def closeEvent(self, event):
-        """ Reimplemented to prompt the user and close the kernel cleanly.
+        """ Reimplemented to prompt the user and close the kernel cleanly, or 
+        close without prompt only if the exit magic is used.
         """
-        keepkernel = self._frontend._keep_kernel_on_exit
+        keepkernel = None #Use the prompt by default
+        if hasattr(self._frontend,'_keep_kernel_on_exit'): #set by exit magic
+            keepkernel = self._frontend._keep_kernel_on_exit
+        
         kernel_manager = self._frontend.kernel_manager
         
-        if keepkernel is None:
+        if keepkernel is None: #show prompt
             if kernel_manager and kernel_manager.channels_running:
                 title = self.window().windowTitle()
                 cancel = QtGui.QMessageBox.Cancel
@@ -106,13 +110,13 @@ class MainWindow(QtGui.QMainWindow):
                         event.accept()
                     else:
                         event.ignore()
-        elif keepkernel: #close console but leave kernel running
+        elif keepkernel: #close console but leave kernel running (no prompt)
             if kernel_manager and kernel_manager.channels_running:
                 if not self._existing:
                     # I have the kernel: don't quit, just close the window
                     self._app.setQuitOnLastWindowClosed(False)
                 event.accept()
-        else: #close console and kernel
+        else: #close console and kernel (no prompt)
             if kernel_manager and kernel_manager.channels_running:
                 kernel_manager.shutdown_kernel()
                 event.accept()
diff --git a/IPython/zmq/zmqshell.py b/IPython/zmq/zmqshell.py
index 1805622..b418ec3 100644
--- a/IPython/zmq/zmqshell.py
+++ b/IPython/zmq/zmqshell.py
@@ -78,7 +78,7 @@ class ZMQInteractiveShell(InteractiveShell):
     """A subclass of InteractiveShell for ZMQ."""
 
     displayhook_class = Type(ZMQDisplayHook)
-    keepkernel = None
+    keepkernel_on_exit = None
 
     def init_environment(self):
         """Configure the user's environment.
@@ -112,7 +112,7 @@ class ZMQInteractiveShell(InteractiveShell):
         payload = dict(
             source='IPython.zmq.zmqshell.ZMQInteractiveShell.ask_exit',
             exit=True,
-            keepkernel=self.keepkernel,
+            keepkernel=self.keepkernel_on_exit,
             )
         self.payload_manager.write_payload(payload)
 
@@ -571,7 +571,7 @@ class ZMQInteractiveShell(InteractiveShell):
         running. Otherwise, it will shutdown without prompting.
         """
         opts,args = self.parse_options(parameter_s,'k')
-        self.shell.keepkernel = opts.has_key('k')
+        self.shell.keepkernel_on_exit = opts.has_key('k')
         self.shell.ask_exit()
 
     # Add aliases as magics so all common forms work: exit, quit, Exit, Quit.