diff --git a/Source/Properties.cs b/Source/Properties.cs
new file mode 100644
index 0000000..eefd40c
--- /dev/null
+++ b/Source/Properties.cs
@@ -0,0 +1,121 @@
+#region Apache License 2.0
+/*
+Nuclex Foundation libraries for .NET
+Copyright (C) 2002-2025 Markus Ewald / Nuclex Development Labs
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#endregion // Apache License 2.0
+
+using System;
+
+using Avalonia;
+using Avalonia.Controls;
+
+namespace Nuclex.Avalonia {
+
+ /// Additional properties that can be attached to Avalonia objects
+ public static class Properties {
+
+ #region class InvalidateMeasureOnChangeObserver
+
+ ///
+ /// Invalidates the calculated measurement of the control that is reporting
+ /// a change to the property value
+ ///
+ private class InvalidateMeasureOnChangeObserver :
+ IObserver> {
+
+ /// The one and only instance you need
+ public static readonly InvalidateMeasureOnChangeObserver Instance = new();
+
+ /// Called after all observers have been notified successfully
+ public void OnCompleted() {}
+
+ /// Reports when the observed control encountered an error
+ /// Error the observed control has encountered
+ public void OnError(Exception error) {}
+
+ /// Reports the updated value of the property to the observer
+ /// New value the property has assumed
+ public void OnNext(AvaloniaPropertyChangedEventArgs