diff --git a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj b/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj
index ae1ef60464..83dbfa41f9 100644
--- a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj
+++ b/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj
@@ -12,6 +12,7 @@
-
-
+
+
+
\ No newline at end of file
diff --git a/tests/Avalonia.ReactiveUI.UnitTests/Avalonia.ReactiveUI.UnitTests.csproj b/tests/Avalonia.ReactiveUI.UnitTests/Avalonia.ReactiveUI.UnitTests.csproj
new file mode 100644
index 0000000000..88f4e08886
--- /dev/null
+++ b/tests/Avalonia.ReactiveUI.UnitTests/Avalonia.ReactiveUI.UnitTests.csproj
@@ -0,0 +1,13 @@
+
+
+ netcoreapp2.0
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs
new file mode 100644
index 0000000000..a3c6b1a44a
--- /dev/null
+++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs
@@ -0,0 +1,95 @@
+using System;
+using System.Reactive.Concurrency;
+using System.Reactive.Disposables;
+using Avalonia.Controls;
+using Avalonia.Rendering;
+using Avalonia.Platform;
+using Avalonia;
+using ReactiveUI;
+using DynamicData;
+using Xunit;
+using Splat;
+
+namespace Avalonia
+{
+ public class AvaloniaActivationForViewFetcherTest
+ {
+ public class TestUserControl : UserControl, IActivatable { }
+
+ public class FakeRenderDecorator : Decorator, IRenderRoot
+ {
+ public Size ClientSize => new Size(100, 100);
+
+ public IRenderer Renderer { get; }
+
+ public double RenderScaling => 1;
+
+ public IRenderTarget CreateRenderTarget() => null;
+
+ public void Invalidate(Rect rect) { }
+
+ public Point PointToClient(Point point) => point;
+
+ public Point PointToScreen(Point point) => point;
+ }
+
+ public class TestUserControlWithWhenActivated : UserControl, IActivatable
+ {
+ public bool Active { get; private set; }
+
+ public TestUserControlWithWhenActivated()
+ {
+ this.WhenActivated(disposables => {
+ Active = true;
+ Disposable
+ .Create(() => Active = false)
+ .DisposeWith(disposables);
+ });
+ }
+ }
+
+ [Fact]
+ public void VisualElementIsActivatedAndDeactivated()
+ {
+ var userControl = new TestUserControl();
+ var activationForViewFetcher = new AvaloniaActivationForViewFetcher();
+
+ activationForViewFetcher
+ .GetActivationForView(userControl)
+ .ToObservableChangeSet(scheduler: ImmediateScheduler.Instance)
+ .Bind(out var activated)
+ .Subscribe();
+
+ var fakeRenderedDecorator = new FakeRenderDecorator();
+ fakeRenderedDecorator.Child = userControl;
+ Assert.True(activated[0]);
+ Assert.Equal(1, activated.Count);
+
+ fakeRenderedDecorator.Child = null;
+ Assert.True(activated[0]);
+ Assert.False(activated[1]);
+ Assert.Equal(2, activated.Count);
+ }
+
+ [Fact]
+ public void ActivationForViewFetcherShouldSupportWhenActivated()
+ {
+ var locator = new ModernDependencyResolver();
+ locator.InitializeSplat();
+ locator.InitializeReactiveUI();
+ locator.RegisterConstant(new AvaloniaActivationForViewFetcher(), typeof(IActivationForViewFetcher));
+ using (locator.WithResolver())
+ {
+ var userControl = new TestUserControlWithWhenActivated();
+ Assert.False(userControl.Active);
+
+ var fakeRenderedDecorator = new FakeRenderDecorator();
+ fakeRenderedDecorator.Child = userControl;
+ Assert.True(userControl.Active);
+
+ fakeRenderedDecorator.Child = null;
+ Assert.False(userControl.Active);
+ }
+ }
+ }
+}
\ No newline at end of file