Index: /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableConstructor/MissingStorableConstructorFix.cs
===================================================================
--- /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableConstructor/MissingStorableConstructorFix.cs	(revision 14988)
+++ /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableConstructor/MissingStorableConstructorFix.cs	(revision 14989)
@@ -15,5 +15,5 @@
 namespace PersistenceCodeFix {
   [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(MissingStorableConstructorFix)), Shared]
-  public sealed class MissingStorableConstructorFix : CodeFixProvider {
+  public sealed class MissingStorableConstructorFix : CodeFixProvider, IDocumentCodeFixProvider {
     private const string title = "Add storable constructor";
 
@@ -23,5 +23,5 @@
 
     public sealed override FixAllProvider GetFixAllProvider() {
-      return WellKnownFixAllProviders.BatchFixer;
+      return SequentialFixAllProvider.Instance;
     }
 
@@ -124,4 +124,8 @@
       return members;
     }
+
+    public Task<Document> FixDocumentAsync(Document document, SyntaxNode node, CancellationToken cancellationToken) {
+      return AddStorableConstructor(document, (BaseTypeDeclarationSyntax)node, cancellationToken);
+    }
   }
 }
Index: /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeFix.cs
===================================================================
--- /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeFix.cs	(revision 14988)
+++ /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeFix.cs	(revision 14989)
@@ -14,5 +14,5 @@
 namespace PersistenceCodeFix {
   [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(MissingStorableTypeFix)), Shared]
-  public sealed class MissingStorableTypeFix : CodeFixProvider {
+  public sealed class MissingStorableTypeFix : CodeFixProvider, IDocumentCodeFixProvider {
     private const string title = "Add StorableType attribute";
 
@@ -22,5 +22,5 @@
 
     public sealed override FixAllProvider GetFixAllProvider() {
-      return WellKnownFixAllProviders.BatchFixer;
+      return SequentialFixAllProvider.Instance;
     }
 
@@ -113,4 +113,8 @@
       return attrLists == null ? SyntaxFactory.List(new[] { attrList }) : attrLists.Add(attrList);
     }
+
+    public Task<Document> FixDocumentAsync(Document document, SyntaxNode node, CancellationToken cancellationToken) {
+      return AddStorableTypeAttribute(document, (BaseTypeDeclarationSyntax)node, cancellationToken);
+    }
   }
 }
Index: /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassFix.cs
===================================================================
--- /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassFix.cs	(revision 14988)
+++ /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassFix.cs	(revision 14989)
@@ -14,5 +14,5 @@
 namespace PersistenceCodeFix {
   [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ObsoleteStorableClassFix)), Shared]
-  public sealed class ObsoleteStorableClassFix : CodeFixProvider {
+  public sealed class ObsoleteStorableClassFix : CodeFixProvider, IDocumentCodeFixProvider {
     private const string title = "Change to StorableType attribute";
 
@@ -22,5 +22,5 @@
 
     public sealed override FixAllProvider GetFixAllProvider() {
-      return WellKnownFixAllProviders.BatchFixer;
+      return SequentialFixAllProvider.Instance;
     }
 
@@ -91,4 +91,8 @@
       return document.WithSyntaxRoot(newRoot);
     }
+
+    public Task<Document> FixDocumentAsync(Document document, SyntaxNode node, CancellationToken cancellationToken) {
+      return ChangeToStorableTypeAttribute(document, (AttributeSyntax)node, cancellationToken);
+    }
   }
 }
Index: /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/IDocumentCodeFixProvider.cs
===================================================================
--- /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/IDocumentCodeFixProvider.cs	(revision 14989)
+++ /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/IDocumentCodeFixProvider.cs	(revision 14989)
@@ -0,0 +1,9 @@
+﻿using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis;
+
+namespace PersistenceCodeFix {
+  public interface IDocumentCodeFixProvider {
+    Task<Document> FixDocumentAsync(Document document, SyntaxNode node, CancellationToken cancellationToken);
+  }
+}
Index: /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix.csproj
===================================================================
--- /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix.csproj	(revision 14988)
+++ /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix.csproj	(revision 14989)
@@ -42,4 +42,5 @@
     <Compile Include="Analyzers\MissingStorableType\MissingStorableTypeAnalyzer.cs" />
     <Compile Include="Analyzers\MissingStorableType\MissingStorableTypeFix.cs" />
+    <Compile Include="IDocumentCodeFixProvider.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Resources.Designer.cs">
@@ -48,4 +49,5 @@
       <DependentUpon>Resources.resx</DependentUpon>
     </Compile>
+    <Compile Include="SequentialFixAllProvider.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/SequentialFixAllProvider.cs
===================================================================
--- /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/SequentialFixAllProvider.cs	(revision 14989)
+++ /trunk/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/SequentialFixAllProvider.cs	(revision 14989)
@@ -0,0 +1,102 @@
+﻿using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CodeActions;
+using Microsoft.CodeAnalysis.CodeFixes;
+
+namespace PersistenceCodeFix {
+  public sealed class SequentialFixAllProvider : FixAllProvider {
+    private static readonly SyntaxAnnotation marker = new SyntaxAnnotation(nameof(SequentialFixAllProvider));
+    private const string title = "Apply this fix sequentially";
+
+    private SequentialFixAllProvider() { }
+    public static readonly SequentialFixAllProvider Instance = new SequentialFixAllProvider();
+
+    public override async Task<CodeAction> GetFixAsync(FixAllContext fixAllContext) {
+      var diagnosticsToFix = new List<Diagnostic>();
+
+      switch (fixAllContext.Scope) {
+        case FixAllScope.Document: {
+            var diagnostics = await fixAllContext.GetDocumentDiagnosticsAsync(fixAllContext.Document);
+            diagnosticsToFix.AddRange(diagnostics);
+          }
+          break;
+        case FixAllScope.Project: {
+            var diagnostics = await fixAllContext.GetAllDiagnosticsAsync(fixAllContext.Project);
+            diagnosticsToFix.AddRange(diagnostics);
+          }
+          break;
+        case FixAllScope.Solution: {
+            foreach (var project in fixAllContext.Solution.Projects) {
+              var diagnostics = await fixAllContext.GetAllDiagnosticsAsync(project);
+              diagnosticsToFix.AddRange(diagnostics);
+            }
+          }
+          break;
+      }
+
+      var solution = fixAllContext.Solution;
+      var codeFixProvider = (IDocumentCodeFixProvider)fixAllContext.CodeFixProvider;
+      return await Task.FromResult(CodeAction.Create(title, ct => GetFixedSolutionAsync(solution, diagnosticsToFix.ToImmutableArray(), codeFixProvider, ct)));
+    }
+
+    private static async Task<Solution> GetFixedSolutionAsync(Solution solution,
+                                                              ImmutableArray<Diagnostic> diagnosticsToFix,
+                                                              IDocumentCodeFixProvider codeFixProvider,
+                                                              CancellationToken cancellationToken) {
+      var documentsToFix = diagnosticsToFix.GroupBy(x => solution.GetDocument(x.Location.SourceTree));
+
+      var tasks = new List<Task<Document>>();
+      foreach (var grouping in documentsToFix)
+        tasks.Add(GetFixedDocumentAsync(grouping.Key, grouping.ToImmutableArray(), codeFixProvider, cancellationToken));
+
+      await Task.WhenAll(tasks);
+
+      foreach (var newDocument in tasks.Select(x => x.Result)) {
+        var oldDocument = solution.GetDocument(newDocument.Id);
+        if (oldDocument == newDocument) continue;
+        solution = solution.WithDocumentSyntaxRoot(newDocument.Id, await newDocument.GetSyntaxRootAsync());
+        cancellationToken.ThrowIfCancellationRequested();
+      }
+
+      return solution;
+    }
+
+    private static async Task<Document> GetFixedDocumentAsync(Document document,
+                                                              ImmutableArray<Diagnostic> diagnosticsToFix,
+                                                              IDocumentCodeFixProvider codeFixProvider,
+                                                              CancellationToken cancellationToken) {
+
+      var root = await document.GetSyntaxRootAsync(cancellationToken);
+
+      foreach (var diagnostic in diagnosticsToFix) {
+        var node = root.FindNode(diagnostic.Location.SourceSpan);
+        document = document.WithSyntaxRoot(root.ReplaceNode(node, node.WithAdditionalAnnotations(marker)));
+        root = await document.GetSyntaxRootAsync(cancellationToken);
+        cancellationToken.ThrowIfCancellationRequested();
+      }
+
+      var annotatedNodes = root.GetAnnotatedNodes(marker);
+
+      while (annotatedNodes.Any()) {
+        var node = annotatedNodes.First();
+        document = await codeFixProvider.FixDocumentAsync(document, node, cancellationToken);
+        cancellationToken.ThrowIfCancellationRequested();
+
+        root = await document.GetSyntaxRootAsync(cancellationToken);
+        annotatedNodes = root.GetAnnotatedNodes(marker);
+        node = annotatedNodes.First();
+        document = document.WithSyntaxRoot(root.ReplaceNode(node, node.WithoutAnnotations(marker)));
+        root = await document.GetSyntaxRootAsync(cancellationToken);
+        annotatedNodes = root.GetAnnotatedNodes(marker);
+        cancellationToken.ThrowIfCancellationRequested();
+      }
+
+      return document;
+    }
+
+  }
+}
