diff -rup eggbasket.old/eggbasket/controllers/errorcatcher.py eggbasket/eggbasket/controllers/errorcatcher.py
--- eggbasket.old/eggbasket/controllers/errorcatcher.py	2010-05-17 12:40:16.000000000 +0800
+++ eggbasket/eggbasket/controllers/errorcatcher.py	2010-05-17 12:38:19.000000000 +0800
@@ -114,10 +114,17 @@ class ErrorCatcher(controllers.RootContr
         self.smtp_password = config.get('mail.password')
         self.no_email_on = config.get('error_catcher.no_email_on',
             (401, 403, 404))
+        self.redirect_404_to_pypi = config.get('error_catcher.redirect_404_to_pypi',
+                                               True)
+        self.pypi_base = config.get('error_catcher.pypi_base', 'http://pypi.python.org/simple')
 
     def cp_on_http_error(self, status, message):
         """Handle HTTP errors by sending an error page and email."""
         try:
+            if self.redirect_404_to_pypi and status == 404:
+                self.redirect_error(redirect=self.pypi_base + cherrypy.request.path_info)
+                return
+                    
             cherrypy._cputil._cp_on_http_error(status, message)
             error_msg = self._get_error_message(status, message)
             url = cherrypy.request.requestLine
@@ -165,6 +172,10 @@ class ErrorCatcher(controllers.RootContr
     if config.get('error_catcher.on', False):
         _cp_on_http_error = cp_on_http_error
 
+    def redirect_error(self, **data):
+        cherrypy.response.status = 302
+        cherrypy.response.headers['Location'] = data['redirect']
+
     def send_error_page(self, **data):
         """Render error page using template looked up in self._error_templates.
         """
