diff --git a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs
index e8df013d50..791a788df5 100644
--- a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs
+++ b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs
@@ -156,6 +156,11 @@ namespace Perspex.Markup.Data
///
string IDescription.Description => Expression;
+ ///
+ /// Gets the root expression node. Used for testing.
+ ///
+ internal ExpressionNode Node => _node;
+
///
/// Gets the leaf node.
///
diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs
new file mode 100644
index 0000000000..22373193c3
--- /dev/null
+++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs
@@ -0,0 +1,70 @@
+// 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 System.Collections.Generic;
+using System.Reactive;
+using System.Reactive.Subjects;
+using Microsoft.Reactive.Testing;
+using Perspex.Markup.Data;
+using Xunit;
+
+namespace Perspex.Markup.UnitTests.Data
+{
+ public class ExpressionObserverTests_Lifetime
+ {
+ [Fact(Skip = "Not working yet")]
+ public void Should_Complete_When_Source_Observable_Completes()
+ {
+ var source = new BehaviorSubject