Index: /branches/release-33/lib/MT/XMLRPCServer.pm
===================================================================
--- /branches/release-33/lib/MT/XMLRPCServer.pm (revision 1419)
+++ /branches/release-33/lib/MT/XMLRPCServer.pm (revision 1724)
@@ -204,4 +204,5 @@
 
     my @categories;
+    my $changed = 0;
 
     if ($param->{page}) {
@@ -224,4 +225,5 @@
                     $folder->basename($basename);
                     $folder->label($basename);
+                    $changed = 1;
                     $folder->save
                       or die _fault(MT->translate("Saving folder failed: [_1]",
@@ -236,11 +238,11 @@
     elsif (my $cats = $item->{categories}) {
         if (@$cats) {
-	    my $cat_class = MT->model('category');
-	    # The spec says to ignore invalid category names.
-	    @categories = grep { defined } $cat_class->search({
-		blog_id => $entry->blog_id,
-		label   => $cats,
-	    });
-	}
+            my $cat_class = MT->model('category');
+            # The spec says to ignore invalid category names.
+            @categories = grep { defined } $cat_class->search({
+                blog_id => $entry->blog_id,
+                label   => $cats,
+            });
+        }
     }
 
@@ -281,5 +283,5 @@
     }
 
-    1;
+    $changed;
 }
 
@@ -372,5 +374,13 @@
     $entry->save;
 
-    $class->_save_placements($entry, $item, \%param);
+    my $changed = $class->_save_placements($entry, $item, \%param);
+
+    my @types = ( $obj_type );
+    if ($changed) {
+        push @types, 'folder'; # folders are the only type that can be
+                               # created in _save_placements
+    }
+    $blog->touch( @types );
+    $blog->save;
 
     MT->run_callbacks("api_post_save.$obj_type", $mt, $entry, $orig_entry);
@@ -436,4 +446,7 @@
         die _fault(MT->translate("Invalid entry ID '[_1]'", $entry_id));
     }
+    require MT::Blog;
+    my $blog = MT::Blog->load($blog_id)
+        or die _fault(MT->translate("Invalid blog ID '[_1]'", $blog_id));
     my($author, $perms) = $class->_login($user, $pass, $entry->blog_id);
     die _fault(MT->translate("Invalid login")) unless $author;
@@ -483,5 +496,11 @@
     $entry->save;
 
-    $class->_save_placements($entry, $item, \%param);
+    my $changed = $class->_save_placements($entry, $item, \%param);
+    my @types = ( $obj_type );
+    if ($changed) {
+        push @types, 'folder'; # folders are the only type that can be
+                               # created in _save_placements
+    }
+    $blog->touch( @types );
 
     MT->run_callbacks("api_post_save.$obj_type", $mt, $entry,
@@ -1001,4 +1020,5 @@
     my $iter = MT::Entry->load_iter({
         blog_id => $blog->id,
+        class => '*',
         status => MT::Entry::FUTURE()},
         {'sort' => 'authored_on',
@@ -1013,4 +1033,5 @@
     my $total_changed = 0;
     my @results;
+    my %types;
     foreach my $entry_id (@queue) {
         my $entry = MT::Entry->load($entry_id);
@@ -1021,4 +1042,5 @@
                 or die $entry->errstr;
 
+            $types{$entry->class} = 1;
             start_background_task(sub {
                 $mt->rebuild_entry( Entry => $entry, Blog => $blog )
@@ -1029,4 +1051,7 @@
         }
     }
+    $blog->touch( keys %types ) if $changed;
+    $blog->save if $changed && (keys %types);
+
     if ($changed) {
         $mt->rebuild_indexes( Blog => $blog )
@@ -1125,4 +1150,7 @@
     $asset->mime_type($file->{type});
     $asset->save;
+
+    $blog->touch('asset');
+    $blog->save;
 
     MT->run_callbacks(
