Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix.sln
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix.sln	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix.sln	(revision 16475)
@@ -1,6 +1,6 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.168
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PersistenceCodeFix", "PersistenceCodeFix\PersistenceCodeFix\PersistenceCodeFix.csproj", "{5D74C4E0-52B2-4F01-B024-307EF52BAE35}"
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableConstructor/MissingStorableConstructorAnalyzer.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableConstructor/MissingStorableConstructorAnalyzer.cs	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableConstructor/MissingStorableConstructorAnalyzer.cs	(revision 16475)
@@ -9,10 +9,17 @@
     public const string DiagnosticId = "MissingStorableConstructor";
 
-    private static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.MissingStorableConstructorAnalyzerTitle), Resources.ResourceManager, typeof(Resources));
-    private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.MissingStorableConstructorAnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
-    private static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.MissingStorableConstructorAnalyzerDescription), Resources.ResourceManager, typeof(Resources));
+    private static readonly LocalizableString Title = new LocalizableResourceString(
+      nameof(Resources.MissingStorableConstructorAnalyzerTitle), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString MessageFormat = new LocalizableResourceString(
+      nameof(Resources.MissingStorableConstructorAnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString Description = new LocalizableResourceString(
+      nameof(Resources.MissingStorableConstructorAnalyzerDescription), Resources.ResourceManager, typeof(Resources));
+
     private const string Category = nameof(DiagnosticCategory.Persistence);
 
-    private static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description);
+    private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
+      DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description);
 
     public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeAnalyzer.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeAnalyzer.cs	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeAnalyzer.cs	(revision 16475)
@@ -9,10 +9,17 @@
     public const string DiagnosticId = "MissingStorableType";
 
-    private static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.MissingStorableTypeAnalyzerTitle), Resources.ResourceManager, typeof(Resources));
-    private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.MissingStorableTypeAnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
-    private static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.MissingStorableTypeAnalyzerDescription), Resources.ResourceManager, typeof(Resources));
+    private static readonly LocalizableString Title = new LocalizableResourceString(
+      nameof(Resources.MissingStorableTypeAnalyzerTitle), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString MessageFormat = new LocalizableResourceString(
+      nameof(Resources.MissingStorableTypeAnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString Description = new LocalizableResourceString(
+      nameof(Resources.MissingStorableTypeAnalyzerDescription), Resources.ResourceManager, typeof(Resources));
+
     private const string Category = nameof(DiagnosticCategory.Persistence);
 
-    private static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Info, isEnabledByDefault: true, description: Description);
+    private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
+      DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Info, isEnabledByDefault: true, description: Description);
 
     public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeFix.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeFix.cs	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/MissingStorableType/MissingStorableTypeFix.cs	(revision 16475)
@@ -49,5 +49,5 @@
         SyntaxFactory.LiteralExpression(
           SyntaxKind.StringLiteralExpression,
-          SyntaxFactory.Literal(guid.ToString())
+          SyntaxFactory.Literal(guid.ToString().ToUpperInvariant())
         ));
 
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassAnalyzer.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassAnalyzer.cs	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassAnalyzer.cs	(revision 16475)
@@ -10,10 +10,17 @@
     public const string DiagnosticId = "ObsoleteStorableClass";
 
-    private static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.ObsoleteStorableClassAnalyzerTitle), Resources.ResourceManager, typeof(Resources));
-    private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.ObsoleteStorableClassAnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
-    private static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.ObsoleteStorableClassAnalyzerDescription), Resources.ResourceManager, typeof(Resources));
+    private static readonly LocalizableString Title = new LocalizableResourceString(
+      nameof(Resources.ObsoleteStorableClassAnalyzerTitle), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString MessageFormat = new LocalizableResourceString(
+      nameof(Resources.ObsoleteStorableClassAnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString Description = new LocalizableResourceString(
+      nameof(Resources.ObsoleteStorableClassAnalyzerDescription), Resources.ResourceManager, typeof(Resources));
+
     private const string Category = nameof(DiagnosticCategory.Persistence);
 
-    private static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description);
+    private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
+      DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description);
 
     public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassFix.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassFix.cs	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableClass/ObsoleteStorableClassFix.cs	(revision 16475)
@@ -52,5 +52,5 @@
         SyntaxFactory.LiteralExpression(
           SyntaxKind.StringLiteralExpression,
-          SyntaxFactory.Literal(guid.ToString())
+          SyntaxFactory.Literal(guid.ToString().ToUpperInvariant())
         ));
 
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableConstructor/ObsoleteStorableConstructorAnalyzer.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableConstructor/ObsoleteStorableConstructorAnalyzer.cs	(revision 16475)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableConstructor/ObsoleteStorableConstructorAnalyzer.cs	(revision 16475)
@@ -0,0 +1,50 @@
+﻿using System.Collections.Immutable;
+using System.Linq;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.Diagnostics;
+
+namespace PersistenceCodeFix {
+  [DiagnosticAnalyzer(LanguageNames.CSharp)]
+  public sealed class ObsoleteStorableConstructorAnalyzer : DiagnosticAnalyzer {
+    public const string DiagnosticId = "ObsoleteStorableConstructor";
+
+    private static readonly LocalizableString Title = new LocalizableResourceString(
+      nameof(Resources.ObsoleteStorableConstructorAnalyzerTitle), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString MessageFormat = new LocalizableResourceString(
+      nameof(Resources.ObsoleteStorableConstructorAnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
+
+    private static readonly LocalizableString Description = new LocalizableResourceString(
+      nameof(Resources.ObsoleteStorableConstructorAnalyzerDescription), Resources.ResourceManager, typeof(Resources));
+
+    private const string Category = nameof(DiagnosticCategory.Persistence);
+
+    private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
+      DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description);
+
+    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }
+
+    public override void Initialize(AnalysisContext context) {
+      context.RegisterSymbolAction(AnalyzeNamedType, SymbolKind.NamedType);
+    }
+
+    private static void AnalyzeNamedType(SymbolAnalysisContext context) {
+      var namedTypeSymbol = (INamedTypeSymbol)context.Symbol;
+      if (namedTypeSymbol.IsStatic) return;
+      if (namedTypeSymbol.TypeKind == TypeKind.Delegate
+          || namedTypeSymbol.TypeKind == TypeKind.Enum
+          || namedTypeSymbol.TypeKind == TypeKind.Interface) return;
+
+      foreach (var ctor in namedTypeSymbol.Constructors) {
+        var attr = ctor.GetAttributes();
+        if (attr.Any(x => x.AttributeClass.Name == "StorableConstructorAttribute")) {
+          var @params = ctor.Parameters;
+          if (@params.Length != 1 || @params[0].Type.SpecialType == SpecialType.System_Boolean) {
+            var diagnostic = Diagnostic.Create(Rule, ctor.Locations[0], namedTypeSymbol.Name);
+            context.ReportDiagnostic(diagnostic);
+          }
+        }
+      }
+    }
+  }
+}
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableConstructor/ObsoleteStorableConstructorFix.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableConstructor/ObsoleteStorableConstructorFix.cs	(revision 16475)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Analyzers/ObsoleteStorableConstructor/ObsoleteStorableConstructorFix.cs	(revision 16475)
@@ -0,0 +1,74 @@
+﻿using System.Collections.Immutable;
+using System.Composition;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CodeActions;
+using Microsoft.CodeAnalysis.CodeFixes;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+
+namespace PersistenceCodeFix {
+  [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ObsoleteStorableConstructorFix)), Shared]
+  public sealed class ObsoleteStorableConstructorFix : CodeFixProvider, IDocumentCodeFixProvider {
+    private const string title = "Change StorableConstructor signature";
+
+    public sealed override ImmutableArray<string> FixableDiagnosticIds {
+      get { return ImmutableArray.Create(ObsoleteStorableConstructorAnalyzer.DiagnosticId); }
+    }
+
+    public sealed override FixAllProvider GetFixAllProvider() {
+      return SequentialFixAllProvider.Instance;
+    }
+
+    public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) {
+      var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
+
+      var diagnostic = context.Diagnostics.First();
+      var diagnosticSpan = diagnostic.Location.SourceSpan;
+      var ctorSyntax = root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf().OfType<ConstructorDeclarationSyntax>().First();
+
+      context.RegisterCodeFix(
+        CodeAction.Create(
+          title: title,
+          createChangedDocument: c => FixStorableConstructorSignature(context.Document, ctorSyntax, c),
+          equivalenceKey: title),
+        diagnostic);
+    }
+
+    private static async Task<Document> FixStorableConstructorSignature(Document document, ConstructorDeclarationSyntax ctorSyntax, CancellationToken cancellationToken) {
+      // create ctor parameters
+      var paramList = SyntaxFactory.ParameterList();
+      paramList = paramList.AddParameters(
+        SyntaxFactory.Parameter(
+          SyntaxFactory.Identifier("_"))
+            .WithType(SyntaxFactory.ParseTypeName("StorableConstructorFlag")));
+
+      // create new ctor
+      var storableCtor = ctorSyntax.WithParameterList(paramList);
+
+      if (ctorSyntax.Initializer != null) {
+        // create initializer args
+        var initArgs = SyntaxFactory.ArgumentList();
+        initArgs = initArgs.AddArguments(
+          SyntaxFactory.Argument(
+            SyntaxFactory.IdentifierName("_")));
+
+        // create initializer
+        var initializer = SyntaxFactory.ConstructorInitializer(SyntaxKind.BaseConstructorInitializer, initArgs);
+
+        storableCtor = storableCtor.WithInitializer(initializer);
+      }
+
+      var root = await document.GetSyntaxRootAsync(cancellationToken) as CompilationUnitSyntax;
+      var newRoot = root.ReplaceNode(ctorSyntax, storableCtor);
+
+      return document.WithSyntaxRoot(newRoot);
+    }
+
+    public Task<Document> FixDocumentAsync(Document document, SyntaxNode node, CancellationToken cancellationToken) {
+      return FixStorableConstructorSignature(document, (ConstructorDeclarationSyntax)node, cancellationToken);
+    }
+  }
+}
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix.csproj
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix.csproj	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix.csproj	(revision 16475)
@@ -42,4 +42,6 @@
     <Compile Include="Analyzers\MissingStorableType\MissingStorableTypeAnalyzer.cs" />
     <Compile Include="Analyzers\MissingStorableType\MissingStorableTypeFix.cs" />
+    <Compile Include="Analyzers\ObsoleteStorableConstructor\ObsoleteStorableConstructorAnalyzer.cs" />
+    <Compile Include="Analyzers\ObsoleteStorableConstructor\ObsoleteStorableConstructorFix.cs" />
     <Compile Include="IDocumentCodeFixProvider.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Resources.Designer.cs
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Resources.Designer.cs	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Resources.Designer.cs	(revision 16475)
@@ -21,5 +21,5 @@
     // To add or remove a member, edit your .ResX file then rerun ResGen
     // with the /str option, or rebuild your VS project.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@@ -142,4 +142,31 @@
             }
         }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to This kind of StorableConstructor signature is obsolete; Use the new signature instead.
+        /// </summary>
+        internal static string ObsoleteStorableConstructorAnalyzerDescription {
+            get {
+                return ResourceManager.GetString("ObsoleteStorableConstructorAnalyzerDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Type &apos;{0}&apos; should use the new StorableConstructor signature.
+        /// </summary>
+        internal static string ObsoleteStorableConstructorAnalyzerMessageFormat {
+            get {
+                return ResourceManager.GetString("ObsoleteStorableConstructorAnalyzerMessageFormat", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Obsolete StorableConstructor signature.
+        /// </summary>
+        internal static string ObsoleteStorableConstructorAnalyzerTitle {
+            get {
+                return ResourceManager.GetString("ObsoleteStorableConstructorAnalyzerTitle", resourceCulture);
+            }
+        }
     }
 }
Index: /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Resources.resx
===================================================================
--- /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Resources.resx	(revision 16474)
+++ /misc/tools/PersistenceCodeFix/PersistenceCodeFix/PersistenceCodeFix/Resources.resx	(revision 16475)
@@ -145,3 +145,12 @@
     <value>Obsolete StorableClass attribute</value>
   </data>
+  <data name="ObsoleteStorableConstructorAnalyzerDescription" xml:space="preserve">
+    <value>This kind of StorableConstructor signature is obsolete; Use the new signature instead</value>
+  </data>
+  <data name="ObsoleteStorableConstructorAnalyzerMessageFormat" xml:space="preserve">
+    <value>Type '{0}' should use the new StorableConstructor signature</value>
+  </data>
+  <data name="ObsoleteStorableConstructorAnalyzerTitle" xml:space="preserve">
+    <value>Obsolete StorableConstructor signature</value>
+  </data>
 </root>
