Index: src/configure.c
==================================================================
--- src/configure.c
+++ src/configure.c
@@ -93,10 +93,11 @@
 #endif
   { "timeline-block-markup",  CONFIGSET_SKIN },
   { "timeline-max-comment",   CONFIGSET_SKIN },
   { "ticket-table",           CONFIGSET_TKT  },
   { "ticket-common",          CONFIGSET_TKT  },
+  { "ticket-change",          CONFIGSET_TKT  },
   { "ticket-newpage",         CONFIGSET_TKT  },
   { "ticket-viewpage",        CONFIGSET_TKT  },
   { "ticket-editpage",        CONFIGSET_TKT  },
   { "ticket-reportlist",      CONFIGSET_TKT  },
   { "ticket-report-template", CONFIGSET_TKT  },

Index: src/tkt.c
==================================================================
--- src/tkt.c
+++ src/tkt.c
@@ -242,10 +242,20 @@
   const char *zConfig;
   Th_FossilInit();
   zConfig = ticket_common_code();
   Th_Eval(g.interp, 0, zConfig, -1);
 }
+
+/*
+** Create the subscript interpreter and load the "change" code.
+*/
+int ticket_change(void){
+  const char *zConfig;
+  Th_FossilInit();
+  zConfig = ticket_change_code();
+  return Th_Eval(g.interp, 0, zConfig, -1);
+}
 
 /*
 ** Recreate the ticket table.
 */
 void ticket_create_table(int separateConnection){
@@ -487,11 +497,11 @@
     manifest_crosslink_begin();
     manifest_crosslink(rid, &tktchng);
     assert( blob_is_reset(&tktchng) );
     manifest_crosslink_end();
   }
-  return TH_RETURN;
+  return ticket_change();
 }
 
 
 /*
 ** WEBPAGE: tktnew

Index: src/tktsetup.c
==================================================================
--- src/tktsetup.c
+++ src/tktsetup.c
@@ -38,10 +38,12 @@
     "Specify the schema of the  \"ticket\" table in the database.");
   setup_menu_entry("Timeline", "tktsetup_timeline",
     "How to display ticket status in the timeline");
   setup_menu_entry("Common", "tktsetup_com",
     "Common TH1 code run before all ticket processing.");
+  setup_menu_entry("Change", "tktsetup_change",
+    "The TH1 code run after a ticket is edited or created.");
   setup_menu_entry("New Ticket Page", "tktsetup_newpage",
     "HTML with embedded TH1 code for the \"new ticket\" webpage.");
   setup_menu_entry("View Ticket Page", "tktsetup_viewpage",
     "HTML with embedded TH1 code for the \"view ticket\" webpage.");
   setup_menu_entry("Edit Ticket Page", "tktsetup_editpage",
@@ -238,10 +240,40 @@
     "Ticket Common Script",
     "ticket-common",
     zDefaultTicketCommon,
     zDesc,
     0,
+    0,
+    30
+  );
+}
+
+static const char zDefaultTicketChange[] =
+@ return
+;
+
+/*
+** Return the ticket change code.
+*/
+const char *ticket_change_code(void){
+  return db_get("ticket-change", (char*)zDefaultTicketChange);
+}
+
+/*
+** WEBPAGE: tktsetup_change
+*/
+void tktsetup_change_page(void){
+  static const char zDesc[] =
+  @ Enter TH1 script that runs after processing the ticket editing
+  @ and creation pages.
+  ;
+  tktsetup_generic(
+    "Ticket Change Script",
+    "ticket-change",
+    zDefaultTicketChange,
+    zDesc,
+    0,
     0,
     30
   );
 }