diff --git a/Perspex.Base/Perspex.Base.csproj b/Perspex.Base/Perspex.Base.csproj
index 56b4bb0a48..2add7a6b12 100644
--- a/Perspex.Base/Perspex.Base.csproj
+++ b/Perspex.Base/Perspex.Base.csproj
@@ -39,6 +39,7 @@
+
diff --git a/Perspex.Base/PerspexObjectExtensions.cs b/Perspex.Base/PerspexObjectExtensions.cs
new file mode 100644
index 0000000000..c40266b4f6
--- /dev/null
+++ b/Perspex.Base/PerspexObjectExtensions.cs
@@ -0,0 +1,53 @@
+// -----------------------------------------------------------------------
+//
+// Copyright 2015 MIT Licence. See licence.md for more information.
+//
+// -----------------------------------------------------------------------
+
+namespace Perspex
+{
+ using System;
+ using System.Reactive.Linq;
+
+ ///
+ /// Provides extension methods for and related classes.
+ ///
+ public static class PerspexObjectExtensions
+ {
+ ///
+ /// Subscribes to a property changed notifications for changes that originate from a
+ /// .
+ ///
+ /// The type of the property change sender.
+ /// The property changed observable.
+ /// Given a TTarget, returns the handler.
+ /// A disposable that can be used to terminate the subscription.
+ public static IDisposable AddClassHandler(
+ this IObservable observable,
+ Func> handler)
+ where TTarget : class
+ {
+ return observable.Subscribe(e => SubscribeAdapter(e, handler));
+ }
+
+ ///
+ /// Observer method for .
+ ///
+ /// The sender type to accept.
+ /// The event args.
+ /// Given a TTarget, returns the handler.
+ private static void SubscribeAdapter(
+ PerspexPropertyChangedEventArgs e,
+ Func> handler)
+ where TTarget : class
+ {
+ var target = e.Sender as TTarget;
+
+ if (target != null)
+ {
+ handler(target)(e);
+ }
+ }
+ }
+}
diff --git a/Perspex.Controls/MenuItem.cs b/Perspex.Controls/MenuItem.cs
index fe5b5adf90..26e125ec33 100644
--- a/Perspex.Controls/MenuItem.cs
+++ b/Perspex.Controls/MenuItem.cs
@@ -84,7 +84,7 @@ namespace Perspex.Controls
FocusableProperty.OverrideDefaultValue