diff --git a/trac/ticket/model.py b/trac/ticket/model.py
--- a/trac/ticket/model.py
+++ b/trac/ticket/model.py
@@ -52,8 +52,17 @@
             tkt_id = int(tkt_id)
         self.resource = Resource('ticket', tkt_id, version)
         self.fields = TicketSystem(self.env).get_ticket_fields()
-        self.time_fields = [f['name'] for f in self.fields
-                            if f['type'] == 'time']
+        self.custom_fields = []
+        self.std_fields = []
+        self.time_fields = []
+        for f in self.fields:
+            if f.get('custom'):
+                self.custom_fields.append(f['name'])
+            else:
+                self.std_fields.append(f['name'])
+            if f['type'] == 'time':
+                self.time_fields.append(f['name'])
+
         self.values = {}
         if tkt_id is not None:
             self._fetch_ticket(tkt_id, db)
@@ -95,18 +104,16 @@
             db = self._get_db(db)
 
             # Fetch the standard ticket fields
-            std_fields = [f['name'] for f in self.fields
-                          if not f.get('custom')]
             cursor = db.cursor()
             cursor.execute("SELECT %s FROM ticket WHERE id=%%s"
-                           % ','.join(std_fields), (tkt_id,))
+                           % ','.join(self.std_fields), (tkt_id,))
             row = cursor.fetchone()
         if not row:
             raise ResourceNotFound(_('Ticket %(id)s does not exist.', 
                                      id=tkt_id), _('Invalid ticket number'))
 
         self.id = tkt_id
-        for i, field in enumerate(std_fields):
+        for i, field in enumerate(self.std_fields):
             value = row[i]
             if field in self.time_fields:
                 self.values[field] = from_utimestamp(value)
@@ -116,11 +123,10 @@
                 self.values[field] = value
 
         # Fetch custom fields if available
-        custom_fields = [f['name'] for f in self.fields if f.get('custom')]
         cursor.execute("SELECT name,value FROM ticket_custom WHERE ticket=%s",
                        (tkt_id,))
         for name, value in cursor:
-            if name in custom_fields:
+            if name in self.custom_fields:
                 if value is None:
                     self.values[name] = empty
                 else:
@@ -193,6 +199,16 @@
                 # No such component exists
                 pass
 
+        # new ticket has separate field lists
+        custom_fields = []
+        std_fields = []
+        for f in self.fields:
+            if f['name'] in self.values:
+                if f.get('custom'):
+                    custom_fields.append(f['name'])
+                else:
+                    std_fields.append(f['name'])
+
         # Perform type conversions
         values = dict(self.values)
         for field in self.time_fields:
@@ -200,16 +216,6 @@
                 values[field] = to_utimestamp(values[field])
         
         # Insert ticket record
-        std_fields = []
-        custom_fields = []
-        for f in self.fields:
-            fname = f['name']
-            if fname in self.values:
-                if f.get('custom'):
-                    custom_fields.append(fname)
-                else:
-                    std_fields.append(fname)
-
         tkt_id = [None]
         @self.env.with_transaction(db)
         def do_insert(db):
@@ -306,10 +312,8 @@
                 comment_num = str(num + 1)
 
             # store fields
-            custom_fields = [f['name'] for f in self.fields if f.get('custom')]
-
             for name in self._old.keys():
-                if name in custom_fields:
+                if name in self.custom_fields:
                     cursor.execute("""
                         SELECT * FROM ticket_custom 
                         WHERE ticket=%s and name=%s
@@ -441,9 +445,6 @@
                 return
             ts = row[0]
             
-            custom_fields = set(f['name'] for f in self.fields
-                                if f.get('custom'))
-
             # Find modified fields and their previous value
             cursor.execute("""
                 SELECT field, oldvalue, newvalue FROM ticket_change
@@ -469,7 +470,7 @@
                     break
                 else:
                     # No next change, edit ticket field
-                    if field in custom_fields:
+                    if field in self.custom_fields:
                         cursor.execute("""
                             UPDATE ticket_custom SET value=%s
                             WHERE ticket=%s AND name=%s

