diff --git a/trac/htdocs/css/ticket.css b/trac/htdocs/css/ticket.css
--- a/trac/htdocs/css/ticket.css
+++ b/trac/htdocs/css/ticket.css
@@ -123,6 +123,12 @@ div.comment ol { list-style: decimal }
  font-size: 100%;
  font-weight: normal;
 }
+.trac-loading {
+  background: url(../loading.gif) 0 50% no-repeat;
+  margin: 0 1em;
+  padding-left: 20px;
+  display: none;
+}
 .threading, #changelog .inlinebuttons { float: right; margin-left: 0.2em }
 .threading { font-size: 85%; }
 .threading :link, .threading :visited { border-bottom: 0 }
@@ -134,6 +140,7 @@ div.comment ol { list-style: decimal }
 #changelog .trac-lastedit :link, #changelog .trac-lastedit :visited { color: inherit }
 
 #changelog .changes, #ticketchange .changes { list-style: square; margin-left: 2em; padding: 0 }
+.trac-conflict { border-left: .3em solid #e44; padding-left: .3em; }
 #changelog .comment, #ticketchange .comment { margin-left: 2em }
 
 form .field { margin-top: .75em; width: 100% }
diff --git a/trac/htdocs/js/auto_preview.js b/trac/htdocs/js/auto_preview.js
--- a/trac/htdocs/js/auto_preview.js
+++ b/trac/htdocs/js/auto_preview.js
@@ -12,7 +12,9 @@
   //  - `args`: additional form data to be passed with the XHR.
   //  - `update`: the function that is called with the submission reply. It
   //              is called with the request data and the reply.
-  $.fn.autoSubmit = function(args, update) {
+  //  - `busy`: an object or jQuery selector to be shown while requesting an
+  //            update.
+  $.fn.autoSubmit = function(args, update, busy) {
     if (this.length == 0 || auto_preview_timeout <= 0)
       return this;
     if (this[0].nodeName == 'FORM') {
@@ -46,6 +48,8 @@
         if (values_changed(new_values)) {
           values = new_values;
           updating = true;
+          if (busy != undefined)
+            $(busy).show();
           
           // Construct request data
           var data = values.slice(0);
@@ -60,11 +64,15 @@
                 timer = setTimeout(request, timeout);
               updating = false;
               queued = false;
+              if (busy != undefined)
+                $(busy).hide();
               update(data, reply);
             },
             error: function(req, err, exc) {
               updating = false;
               queued = false;
+              if (busy != undefined)
+                $(busy).hide();
             },
           });
         }
diff --git a/trac/ticket/templates/ticket.html b/trac/ticket/templates/ticket.html
--- a/trac/ticket/templates/ticket.html
+++ b/trac/ticket/templates/ticket.html
@@ -60,11 +60,11 @@
           // Collapse property form if comment editor has focus
           if (show_preview && comment_focused)
             $("#modify").parent().addClass("collapsed");
-        });
+        }, "#ticketchange .trac-loading");
         $("#trac-comment-editor").autoSubmit({preview_comment: '1'}, function(data, reply) {
           var comment = $("#trac-comment-editor").next("div.comment").html(reply);
           comment.toggle(comment.children().length != 0);
-        });
+        }, "#changelog .trac-loading");
         /*]]>*/
         <py:if test="preview_mode">
         $("#attachments").toggleClass("collapsed");
@@ -74,7 +74,7 @@
       <py:otherwise>
         $("#propertyform").autoSubmit({preview: '1'}, function(data, reply) {
           $('#ticket').replaceWith(reply);
-        });
+        }, "#ticket .trac-loading");
         <py:if test="not preview_mode">
         $("#field-summary").focus();
         </py:if>
@@ -167,7 +167,8 @@
           <div id="trac-edit-warning" class="warning system-message"
                style="${'display: none' if start_time == ticket['changetime'] else None}">
             This ticket has been modified since you started editing. You should review the
-            <em class="trac-new">other modifications</em> which have been appended above.
+            <em class="trac-new">other modifications</em> which have been appended above,
+            and any <em class="trac-conflict">conflicts</em> shown in the preview below.
             You can nevertheless proceed and submit your changes if you wish so.
           </div>
           <!--! Comment field -->
@@ -317,7 +318,7 @@
         <div py:if="ticket.exists and can_append" id="ticketchange" class="ticketdraft"
              style="${'display: none' if not (change_preview.fields or change_preview.comment)
                                          or cnum_edit is not None else None}">
-          <xi:include href="ticket_change.html" py:with="change = change_preview"/>
+          <xi:include href="ticket_change.html" py:with="change = change_preview; preview = True"/>
         </div>
 
         <!--! Author or Reporter -->
diff --git a/trac/ticket/templates/ticket_box.html b/trac/ticket/templates/ticket_box.html
--- a/trac/ticket/templates/ticket_box.html
+++ b/trac/ticket/templates/ticket_box.html
@@ -18,7 +18,7 @@ Arguments:
   <div class="date">
     <p i18n:msg="created" py:if="ticket.exists">Opened ${pretty_dateinfo(ticket.time)}</p>
     <p i18n:msg="modified" py:if="ticket.changetime != ticket.time">Last modified ${pretty_dateinfo(ticket.changetime)}</p>
-    <p py:if="not ticket.exists"><i>(ticket not yet created)</i></p>
+    <p py:if="not ticket.exists"><span class="trac-loading"/><i>(ticket not yet created)</i></p>
   </div>
   <!--! use a placeholder if it's a new ticket -->
   <h2 class="summary searchable">$ticket.summary</h2>
diff --git a/trac/ticket/templates/ticket_change.html b/trac/ticket/templates/ticket_change.html
--- a/trac/ticket/templates/ticket_change.html
+++ b/trac/ticket/templates/ticket_change.html
@@ -9,6 +9,7 @@ Arguments:
  - cnum_hist=None: the comment number for which to show a historical content
  - can_append=False: True if the user is allowed to append to tickets
  - has_edit_comment=False: True if the user is allowed to edit all comments
+ - preview=False: True if rendering a change preview
 -->
 <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:py="http://genshi.edgewall.org/"
@@ -17,6 +18,7 @@ Arguments:
       py:with="cnum = change.get('cnum'); hide_buttons = value_of('hide_buttons', False);
                cnum_edit = value_of('cnum_edit'); cnum_hist = value_of('cnum_hist');
                can_append = value_of('can_append', False); has_edit_comment = value_of('has_edit_comment', False);
+               preview = value_of('preview', False);
                can_edit_comment = has_edit_comment or (authname and authname != 'anonymous'
                                                        and authname == change.author);
                show_editor = can_edit_comment and str(cnum) == cnum_edit;
@@ -54,6 +56,7 @@ Arguments:
         <i18n:msg params="author">Changed by ${authorinfo(change.author)}</i18n:msg>
       </py:otherwise>
     </py:choose>
+    <span py:if="preview or show_editor" class="trac-loading"/>
   </h3>
   <div py:if="show_buttons" class="trac-ticket-buttons">
     <form py:if="'cnum' in change and can_edit_comment" method="get" action="#comment:${cnum}">
@@ -71,7 +74,8 @@ Arguments:
     </form>
   </div>
   <ul py:if="change.fields" class="changes">
-    <li py:for="field_name, field in sorted(change.fields.iteritems(), key=lambda item: item[1].label.lower())">
+    <li py:for="field_name, field in sorted(change.fields.iteritems(), key=lambda item: item[1].label.lower())"
+        class="${'trac-conflict' if preview and field_name in conflicts else None}">
       <strong>${field.label}</strong>
       <py:choose>
         <py:when test="field_name == 'attachment'"><i18n:msg params="name">
diff --git a/trac/ticket/templates/ticket_preview.html b/trac/ticket/templates/ticket_preview.html
--- a/trac/ticket/templates/ticket_preview.html
+++ b/trac/ticket/templates/ticket_preview.html
@@ -18,5 +18,5 @@ Render data relevant to automatic ticket
   </div>
   <input type="hidden" name="view_time" value="${to_utimestamp(ticket['changetime'])}"/>
   <div id="preview"><xi:include py:if="change_preview.fields or change_preview.comment"
-                                href="ticket_change.html" py:with="change = change_preview"/></div>
+                                href="ticket_change.html" py:with="change = change_preview; preview = True"/></div>
 </html>
diff --git a/trac/ticket/web_ui.py b/trac/ticket/web_ui.py
--- a/trac/ticket/web_ui.py
+++ b/trac/ticket/web_ui.py
@@ -1480,6 +1480,8 @@ class TicketModule(Component):
         changes = []
         cnum = 0
         skip = False
+        start_time = data.get('start_time')
+        conflicts = set()
         for change in self.rendered_changelog_entries(req, ticket):
             # change['permanent'] is false for attachment changes; true for
             # other changes.
@@ -1506,6 +1508,8 @@ class TicketModule(Component):
                             values[k] = v['new']
                     if 'description' in change['fields']:
                         data['description_change'] = change
+                if start_time is not None and change['date'] > start_time:
+                    conflicts.update(change['fields'])
             if not skip:
                 changes.append(change)
 
@@ -1566,7 +1570,7 @@ class TicketModule(Component):
                 data['%s_link' % user] = self._query_link(req, user,
                                                             ticket[user])
         data.update({
-            'context': context,
+            'context': context, 'conflicts': conflicts,
             'fields': fields, 'changes': changes, 'replies': replies,
             'attachments': AttachmentModule(self.env).attachment_data(context),
             'action_controls': action_controls, 'action': selected_action,

