Index: /branches/release-33/lib/MT/FileMgr.pm
===================================================================
--- /branches/release-33/lib/MT/FileMgr.pm (revision 1174)
+++ /branches/release-33/lib/MT/FileMgr.pm (revision 1779)
@@ -36,4 +36,5 @@
 sub delete;
 sub content_is_updated { 1 }
+sub file_mod_time { undef }
 
 sub is_handle {
Index: /branches/release-33/lib/MT/CMS/Blog.pm
===================================================================
--- /branches/release-33/lib/MT/CMS/Blog.pm (revision 1778)
+++ /branches/release-33/lib/MT/CMS/Blog.pm (revision 1779)
@@ -559,5 +559,9 @@
     my $done          = 0;
     my $type          = $order[$next];
-    my $archiver      = $app->publisher->archiver($type);
+
+    my $pub           = $app->publisher;
+    $pub->start_time( $start_time );  # force start time to parameter start_time
+
+    my $archiver      = $pub->archiver($type);
     my $archive_label = $archiver ? $archiver->archive_label : '';
 
Index: /branches/release-33/lib/MT/FileMgr/Local.pm
===================================================================
--- /branches/release-33/lib/MT/FileMgr/Local.pm (revision 1174)
+++ /branches/release-33/lib/MT/FileMgr/Local.pm (revision 1779)
@@ -120,4 +120,13 @@
 }
 
+sub file_mod_time {
+    my $fmgr = shift;
+    my ($file) = @_;
+    if (-e $file) {
+        return (stat($file))[9]; # modification timestamp
+    }
+    return undef;
+}
+
 sub content_is_updated {
     my $fmgr = shift;
Index: /branches/release-33/lib/MT/WeblogPublisher.pm
===================================================================
--- /branches/release-33/lib/MT/WeblogPublisher.pm (revision 1754)
+++ /branches/release-33/lib/MT/WeblogPublisher.pm (revision 1779)
@@ -29,4 +29,7 @@
     my $this  = {@_};
     my $cfg   = MT->config;
+    if ( !exists $this->{start_time} ) {
+        $this->{start_time} = time;
+    }
     if ( !exists $this->{NoTempFiles} ) {
         $this->{NoTempFiles} = $cfg->NoTempFiles;
@@ -109,4 +112,10 @@
     };
 
+}
+
+sub start_time {
+    my $pub = shift;
+    $pub->{start_time} = shift if @_;
+    return $pub->{start_time};
 }
 
@@ -809,4 +818,19 @@
     }
 
+    # Calculate file path and URL for the new entry.
+    my $file = File::Spec->catfile( $root_path, $map->{__saved_output_file} );
+
+    ## Untaint. We have to assume that we can trust the user's setting of
+    ## the archive_path, and nothing else is based on user input.
+    ($file) = $file =~ /(.+)/s;
+
+    # compare file modification time to start of build process. if it
+    # is greater than the start_time, then we shouldn't need to build this
+    # file again
+    my $fmgr = $blog->file_mgr;
+    if (my $mod_time = $fmgr->file_mod_time($file)) {
+        return 1 if $mod_time >= $mt->start_time;
+    }
+
     if ( $archiver->category_based ) {
         $category = $specifier{Category};
@@ -850,9 +874,6 @@
     local $ctx->{current_timestamp_end} = $end   if $end;
 
-    my $fmgr = $blog->file_mgr;
     $ctx->{__stash}{blog} = $blog;
 
-    # Calculate file path and URL for the new entry.
-    my $file = File::Spec->catfile( $root_path, $map->{__saved_output_file} );
     require MT::FileInfo;
 
@@ -907,8 +928,4 @@
     my ($rel_url) = ( $url =~ m|^(?:[^:]*\:\/\/)?[^/]*(.*)| );
     $rel_url =~ s|//+|/|g;
-
-    ## Untaint. We have to assume that we can trust the user's setting of
-    ## the archive_path, and nothing else is based on user input.
-    ($file) = $file =~ /(.+)/s;
 
     # Clear out all the FileInfo records that might point at the page
