diff --git a/src/Markup/Perspex.Markup/ControlLocator.cs b/src/Markup/Perspex.Markup/ControlLocator.cs
index 730c4d24f9..b6080ae059 100644
--- a/src/Markup/Perspex.Markup/ControlLocator.cs
+++ b/src/Markup/Perspex.Markup/ControlLocator.cs
@@ -5,6 +5,7 @@ using System;
using System.Linq;
using System.Reactive.Linq;
using Perspex.Controls;
+using Perspex.LogicalTree;
namespace Perspex.Markup
{
diff --git a/src/Perspex.Controls/DropDown.cs b/src/Perspex.Controls/DropDown.cs
index 7f8c1789ee..b9211caddd 100644
--- a/src/Perspex.Controls/DropDown.cs
+++ b/src/Perspex.Controls/DropDown.cs
@@ -7,6 +7,7 @@ using Perspex.Controls.Primitives;
using Perspex.Controls.Shapes;
using Perspex.Input;
using Perspex.Layout;
+using Perspex.LogicalTree;
using Perspex.Media;
using Perspex.VisualTree;
diff --git a/src/Perspex.Controls/Perspex.Controls.csproj b/src/Perspex.Controls/Perspex.Controls.csproj
index 58aee7f2a5..07cd25039b 100644
--- a/src/Perspex.Controls/Perspex.Controls.csproj
+++ b/src/Perspex.Controls/Perspex.Controls.csproj
@@ -164,7 +164,6 @@
-
diff --git a/src/Perspex.Controls/TextBlock.cs b/src/Perspex.Controls/TextBlock.cs
index 29a760b11f..cf9ce6b919 100644
--- a/src/Perspex.Controls/TextBlock.cs
+++ b/src/Perspex.Controls/TextBlock.cs
@@ -5,6 +5,7 @@ using System;
using System.Reactive;
using System.Reactive.Linq;
using Perspex.Data;
+using Perspex.LogicalTree;
using Perspex.Media;
using Perspex.Metadata;
diff --git a/src/Perspex.Styling/LogicalTree/ILogical.cs b/src/Perspex.Styling/LogicalTree/ILogical.cs
index 2d3faa2020..5eb4b42abf 100644
--- a/src/Perspex.Styling/LogicalTree/ILogical.cs
+++ b/src/Perspex.Styling/LogicalTree/ILogical.cs
@@ -1,6 +1,7 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
+using System;
using Perspex.Collections;
namespace Perspex.LogicalTree
@@ -10,6 +11,16 @@ namespace Perspex.LogicalTree
///
public interface ILogical
{
+ ///
+ /// Raised when the control is attached to a rooted logical tree.
+ ///
+ event EventHandler AttachedToLogicalTree;
+
+ ///
+ /// Raised when the control is detached from a rooted logical tree.
+ ///
+ event EventHandler DetachedFromLogicalTree;
+
///
/// Gets a value indicating whether the element is attached to a rooted logical tree.
///
diff --git a/src/Perspex.Controls/LogicalTreeAttachmentEventArgs.cs b/src/Perspex.Styling/LogicalTree/LogicalTreeAttachmentEventArgs.cs
similarity index 82%
rename from src/Perspex.Controls/LogicalTreeAttachmentEventArgs.cs
rename to src/Perspex.Styling/LogicalTree/LogicalTreeAttachmentEventArgs.cs
index 024942cf71..0ccfad830e 100644
--- a/src/Perspex.Controls/LogicalTreeAttachmentEventArgs.cs
+++ b/src/Perspex.Styling/LogicalTree/LogicalTreeAttachmentEventArgs.cs
@@ -4,11 +4,11 @@
using System;
using Perspex.Styling;
-namespace Perspex.Controls
+namespace Perspex.LogicalTree
{
///
- /// Holds the event arguments for the and
- /// events.
+ /// Holds the event arguments for the and
+ /// events.
///
public class LogicalTreeAttachmentEventArgs : EventArgs
{
diff --git a/src/Perspex.Styling/Perspex.Styling.csproj b/src/Perspex.Styling/Perspex.Styling.csproj
index 39ed053d7b..2219312704 100644
--- a/src/Perspex.Styling/Perspex.Styling.csproj
+++ b/src/Perspex.Styling/Perspex.Styling.csproj
@@ -45,6 +45,7 @@
+