Index: trac/attachment.py
===================================================================
--- trac/attachment.py	(revision 2659)
+++ trac/attachment.py	(working copy)
@@ -26,6 +26,8 @@
 from trac.core import *
 from trac.env import IEnvironmentSetupParticipant
 from trac.mimeview import *
+from trac.Notify import TicketNotifyEmail
+from trac.ticket import Ticket
 from trac.web import IRequestHandler
 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
 from trac.wiki import IWikiSyntaxProvider
@@ -332,6 +334,13 @@
                 pass # don't worry if there's nothing to replace
             attachment.filename = None
         attachment.insert(filename, upload.file, size)
+        if attachment.parent_type == 'ticket':
+            tn = TicketNotifyEmail(self.env)
+            # before we can do this, we have to get the ticket
+            # that the attachment will modify
+            ticket = Ticket(self.env, tkt_id=attachment.parent_id)
+            tn.notify(ticket, newticket=False, modtime=attachment.time)
+            
 
         # Redirect the user to the newly created attachment
         req.redirect(attachment.href())
Index: trac/ticket/web_ui.py
===================================================================
--- trac/ticket/web_ui.py	(revision 2659)
+++ trac/ticket/web_ui.py	(working copy)
@@ -293,12 +293,18 @@
             cursor = db.cursor()
 
             cursor.execute("SELECT t.id,tc.time,tc.author,t.type,t.summary, "
-                           "       tc.field,tc.oldvalue,tc.newvalue "
+                           "    tc.field,tc.oldvalue,tc.newvalue "
                            "  FROM ticket_change tc "
                            "    INNER JOIN ticket t ON t.id = tc.ticket "
-                           "      AND tc.time>=%s AND tc.time<=%s "
+                           "      AND tc.time >= %s AND tc.time <= %s "
+                           "UNION "
+                           "SELECT t.id,att.time,att.author,t.type,t.summary, "
+                           "    'attachment', null, att.filename "
+                           "  FROM attachment att "
+                           "    INNER JOIN ticket t ON t.id = att.id "
+                           "      AND att.time >= %s AND att.time <= %s "
                            "ORDER BY tc.time"
-                           % (start, stop))
+                           % (start, stop, start, stop))
             previous_update = None
             for id,t,author,type,summary,field,oldvalue,newvalue in cursor:
                 if not previous_update or (id,t,author) != previous_update[:3]:

