Index: Classes/NoesisInstance.h
===================================================================
--- Classes/NoesisInstance.h	(revision 11572)
+++ Classes/NoesisInstance.h	(working copy)
@@ -134,6 +134,8 @@
 	typedef TSharedPtr<class FNoesisSlateElement, ESPMode::ThreadSafe> FNoesisSlateElementPtr;
 	FNoesisSlateElementPtr NoesisSlateElement;
 
+	TSharedPtr<class FHittestGrid> HittestGrid;
+
 	UPROPERTY()
 	class UNoesisXaml* BaseXaml;
 
@@ -181,7 +183,7 @@
 	void OnPreviewGotKeyboardFocus(Noesis::BaseComponent* Component, const Noesis::KeyboardFocusChangedEventArgs& Args);
 	void OnPreviewLostKeyboardFocus(Noesis::BaseComponent* Component, const Noesis::KeyboardFocusChangedEventArgs& Args);
 
-	bool HitTest(FVector2D Position);
+	bool HitTest(FVector2D Position) const;
 
 	void TermInstance();
 
@@ -191,8 +193,9 @@
 	virtual void PostLoad();
 	// End of UObject interface
 
+	// UWidget interface
+	virtual void OnWidgetRebuilt() override;
 #if WITH_EDITOR
-	// UWidget interface
 	virtual void SetDesignerFlags(EWidgetDesignFlags NewFlags) override;
 	// End of UWidget interface
 
Index: Private/NoesisInstance.cpp
===================================================================
--- Private/NoesisInstance.cpp	(revision 11572)
+++ Private/NoesisInstance.cpp	(working copy)
@@ -26,6 +26,9 @@
 #include "Widgets/SWindow.h"
 #include "Framework/Application/SlateApplication.h"
 
+// SlateCore includes
+#include "Input/HitTestGrid.h"
+
 // NoesisRuntime includes
 #include "NoesisCustomVersion.h"
 #include "NoesisRuntimeModule.h"
@@ -269,9 +272,8 @@
 }
 
 UNoesisInstance::UNoesisInstance(const FObjectInitializer& ObjectInitializer)
-	: Super(ObjectInitializer), Scene(nullptr)
+	: Super(ObjectInitializer), Scene(nullptr), HittestGrid(MakeShared<FHittestGrid>())
 {
-	Visibility = ESlateVisibility::Visible;
 }
 
 void UNoesisInstance::InitInstance()
@@ -554,7 +556,7 @@
 	Noesis::UIElement* Hit;
 };
 
-bool UNoesisInstance::HitTest(FVector2D Position)
+bool UNoesisInstance::HitTest(FVector2D Position) const
 {
 	NoesisHitTestVisibleTester HitTester;
 
@@ -641,6 +643,13 @@
 #endif
 }
 
+void UNoesisInstance::OnWidgetRebuilt()
+{
+	Super::OnWidgetRebuilt();
+
+	HittestGrid = MakeShared<FHittestGrid>();
+}
+
 #if WITH_EDITOR
 void UNoesisInstance::SetDesignerFlags(EWidgetDesignFlags NewFlags)
 {
@@ -725,6 +734,46 @@
 {
 	int32 MaxLayer = Super::NativePaint(Args, AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled);
 
+	if (GetVisibility() == ESlateVisibility::SelfHitTestInvisible)
+	{
+		TSharedPtr<ICursor> PlatformCursor = FSlateApplication::Get().GetPlatformCursor();
+		auto ScreenSpacePosition = PlatformCursor->GetPosition() - Args.GetWindowToDesktopTransform();
+		FVector2D Position = AllottedGeometry.AbsoluteToLocal(ScreenSpacePosition) * AllottedGeometry.Scale;
+		bool Hit = HitTest(Position);
+
+		if (Hit)
+		{
+			auto PinnedWidget = MyWidget.Pin();
+			if (PinnedWidget.IsValid())
+			{
+				auto WidgetVisibility = PinnedWidget->GetVisibility();
+				PinnedWidget->SetVisibility(EVisibility::Visible);
+#if UE_VERSION_OLDER_THAN(5, 0, 0)
+				HittestGrid->AddWidget(PinnedWidget.ToSharedRef(), 0, LayerId, FSlateInvalidationWidgetSortOrder());
+#else				
+				HittestGrid->AddWidget(PinnedWidget.Get(), 0, LayerId, FSlateInvalidationWidgetSortOrder());
+#endif
+				PinnedWidget->SetVisibility(WidgetVisibility);
+
+				auto& RootHittestGrid = Args.GetHittestGrid();
+				HittestGrid->SetHittestArea(RootHittestGrid.GetGridOrigin(), RootHittestGrid.GetGridSize(), RootHittestGrid.GetGridWindowOrigin());
+				HittestGrid->SetCullingRect(MyCullingRect);
+				HittestGrid->SetOwner(PinnedWidget.Get());
+				RootHittestGrid.AddGrid(HittestGrid.ToSharedRef());
+			}
+		}
+		else
+		{
+			auto& RootHittestGrid = Args.GetHittestGrid();
+			RootHittestGrid.RemoveGrid(HittestGrid.ToSharedRef());
+		}
+	}
+	else
+	{
+		auto& RootHittestGrid = Args.GetHittestGrid();
+		RootHittestGrid.RemoveGrid(HittestGrid.ToSharedRef());
+	}
+
 	if (XamlView)
 	{
 		Noesis::Ptr<Noesis::IRenderer> Renderer(XamlView->GetRenderer());
