diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj
index 31141c616..2beb761d3 100644
--- a/src/Orchard.Web/Core/Orchard.Core.csproj
+++ b/src/Orchard.Web/Core/Orchard.Core.csproj
@@ -392,7 +392,7 @@
-
+
diff --git a/src/Orchard/DisplayManagement/Descriptors/ShapePlacements/ShapePlacementParsingStrategy.cs b/src/Orchard/DisplayManagement/Descriptors/ShapePlacements/ShapePlacementParsingStrategy.cs
new file mode 100644
index 000000000..d2ab225d3
--- /dev/null
+++ b/src/Orchard/DisplayManagement/Descriptors/ShapePlacements/ShapePlacementParsingStrategy.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Orchard.Environment.Descriptor.Models;
+using Orchard.Environment.Extensions;
+using Orchard.Environment.Extensions.Models;
+
+namespace Orchard.DisplayManagement.Descriptors.ShapePlacements {
+ public class ShapePlacementParsingStrategy : IShapeTableProvider {
+ private readonly IExtensionManager _extensionManager;
+ private readonly ShellDescriptor _shellDescriptor;
+
+ public ShapePlacementParsingStrategy(
+ IExtensionManager extensionManager,
+ ShellDescriptor shellDescriptor) {
+ _extensionManager = extensionManager;
+ _shellDescriptor = shellDescriptor;
+ }
+
+ public void Discover(ShapeTableBuilder builder) {
+
+ var availableFeatures = _extensionManager.AvailableFeatures();
+ var activeFeatures = availableFeatures.Where(fd => FeatureIsTheme(fd) || FeatureIsEnabled(fd));
+ var activeExtensions = Once(activeFeatures);
+
+ foreach (var extensionDescriptor in activeExtensions) {
+ foreach (var featureDescriptor in extensionDescriptor.Features.Where(fd=>fd.Name == fd.Extension.Name)) {
+ builder.Describe("Parts_RoutableTitle")
+ .From(new Feature{Descriptor = featureDescriptor})
+ .Placement(ctx => ctx.ContentType == "WidgetPage", "Content:after");
+ }
+ //var featureDescriptors = extensionDescriptor.Where(fd => fd.Name == hit.extensionDescriptor.Name);
+ //foreach (var featureDescriptor in featureDescriptors) {
+ }
+ //builder.Describe("Parts_RoutableTitle")
+ //.Placement(ctx => ctx.ContentType == "Page", "Content:after");
+ }
+
+
+ private bool FeatureIsTheme(FeatureDescriptor fd) {
+ return fd.Extension.ExtensionType == "Theme";
+ }
+
+ private bool FeatureIsEnabled(FeatureDescriptor fd) {
+ return _shellDescriptor.Features.Any(sf => sf.Name == fd.Name);
+ }
+
+ private static IEnumerable Once(IEnumerable featureDescriptors) {
+ var once = new ConcurrentDictionary();
+ return featureDescriptors.Select(fd => fd.Extension).Where(ed => once.TryAdd(ed.Name, null)).ToList();
+ }
+
+ }
+}
diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj
index b1be6b24e..a94c28422 100644
--- a/src/Orchard/Orchard.Framework.csproj
+++ b/src/Orchard/Orchard.Framework.csproj
@@ -165,6 +165,7 @@
+