diff --git a/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs b/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs
index a1dca9f4f076a7c93cc38b3c6fc6079cbc14a99c..26deb00a79da611359b574494e67dad412af493e 100644
--- a/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs
+++ b/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs
@@ -14,7 +14,7 @@ namespace LibVLCSharp.Android.Sample
 {
 	
 	
-	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "12.2.0.155")]
+	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.2.120")]
 	public partial class Resource
 	{
 		
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..50ca86b6723b32d34a57da8ad07e611efa205039
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml
@@ -0,0 +1,9 @@
+<?xml version = "1.0" encoding = "UTF-8" ?>
+<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             xmlns:local="clr-namespace:LibVLCSharp.MAUI.Sample.MediaElement"
+             x:Class="LibVLCSharp.MAUI.Sample.MediaElement.App">
+    <Application.Resources>
+
+    </Application.Resources>
+</Application>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..88286d90920e806e6c7bc679817304f91788c2f9
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.Maui.Controls;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    /// <summary>
+    /// Represents the main App.
+    /// </summary>
+    public partial class App : Application
+    {
+        /// <summary>
+        /// Initializes a new instance of <see cref="App"/> class.
+        /// </summary>
+        public App()
+        {
+            InitializeComponent();
+            ConfigureUnhandledExceptionHandling();
+
+            MainPage = new MainPage();
+        }
+
+        private static void ConfigureUnhandledExceptionHandling()
+        {
+            AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
+            {
+                if (e.ExceptionObject is Exception ex)
+                {
+                    HandleException(ex);
+                }
+            };
+
+            TaskScheduler.UnobservedTaskException += (sender, e) =>
+            {
+                if (e.Exception is Exception ex)
+                {
+                    HandleException(ex);
+                }
+                e.SetObserved();  // Prevents the process from terminating.
+            };
+        }
+
+        private static void HandleException(Exception ex)
+        {
+            if (ex != null)
+            {
+                Console.WriteLine(ex.Message);
+            }
+        }
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..6885a1c3ac70ac22954fdba0329f9cd89889c301
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Shell
+    x:Class="LibVLCSharp.MAUI.Sample.MediaElement.AppShell"
+    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
+    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+    xmlns:local="clr-namespace:LibVLCSharp.MAUI.Sample.MediaElement"
+    Shell.FlyoutBehavior="Disabled">
+
+    <ShellContent
+        Title="Home"
+        ContentTemplate="{DataTemplate local:MainPage}"
+        Route="MainPage" />
+
+</Shell>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7d3493c6f3b6261418541eb0c8185e915bc28c70
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml.cs
@@ -0,0 +1,16 @@
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    /// <summary>
+    /// Represents the main shell of the application.
+    /// </summary>
+    public partial class AppShell : Shell
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="AppShell"/> class.
+        /// </summary>
+        public AppShell()
+        {
+            InitializeComponent();
+        }
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/LibVLCSharp.MAUI.Sample.MediaElement.csproj b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/LibVLCSharp.MAUI.Sample.MediaElement.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..b4b416ddf91176c4e2189c609e80fe3a5af1d8d5
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/LibVLCSharp.MAUI.Sample.MediaElement.csproj
@@ -0,0 +1,61 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFrameworks>net8.0-android;net8.0-ios</TargetFrameworks>
+    <!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
+    <!-- <TargetFrameworks>$(TargetFrameworks);net8.0-tizen</TargetFrameworks> -->
+    <OutputType>Exe</OutputType>
+    <RootNamespace>LibVLCSharp.MAUI.Sample.MediaElement</RootNamespace>
+    <UseMaui>true</UseMaui>
+    <SingleProject>true</SingleProject>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <LangVersion>latest</LangVersion>
+    <!-- Display name -->
+    <ApplicationTitle>LibVLCSharp.MAUI.Sample.MediaElement</ApplicationTitle>
+    <!-- App Identifier -->
+    <ApplicationId>com.companyname.libvlcsharp.maui.sample.mediaelement</ApplicationId>
+    <ApplicationIdGuid>3e92aff6-59b5-48cd-a2a0-3ecb5d63d8fb</ApplicationIdGuid>
+    <!-- Versions -->
+    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
+    <ApplicationVersion>1</ApplicationVersion>
+    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
+    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
+    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
+    <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
+    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
+    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.19041.0</SupportedOSPlatformVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <!-- App Icon -->
+    <MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />
+    <!-- Splash Screen -->
+    <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />
+    <!-- Images -->
+    <MauiImage Include="Resources\Images\*" />
+    <MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />
+    <!-- Custom Fonts -->
+    <MauiFont Include="Resources\Fonts\*" />
+    <!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
+    <MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
+    <PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="$(TargetFramework.Contains('-android'))">
+		<PackageReference Include="VideoLAN.LibVLC.Android" Version="3.5.3" />
+  </ItemGroup>
+	<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
+		<PackageReference Include="VideoLAN.LibVLC.iOS" Version="3.3.18" />
+	</ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\src\LibVLCSharp.MAUI\LibVLCSharp.MAUI.csproj" />
+    <ProjectReference Include="..\..\..\src\LibVLCSharp\LibVLCSharp.csproj" />
+  </ItemGroup>
+  <ProjectExtensions>
+    <VisualStudio>
+      <UserProperties XamarinHotReloadDebuggerTimeoutExceptionLibVLCSharpMAUISampleMediaElementHideInfoBar="True" />
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..8477da926b56d3b08f3eb7d9aa066fb1c9dcc235
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             xmlns:local="clr-namespace:LibVLCSharp.MAUI.Sample.MediaElement"
+             xmlns:vlc="clr-namespace:LibVLCSharp.MAUI;assembly=LibVLCSharp.MAUI"
+             x:Class="LibVLCSharp.MAUI.Sample.MediaElement.MainPage"
+             Appearing="OnAppearing"
+             Disappearing="OnDisappearing">
+
+    <ContentPage.BindingContext>
+        <local:MainViewModel />
+    </ContentPage.BindingContext>
+
+    <vlc:MediaPlayerElement MediaPlayer="{Binding MediaPlayer}" LibVLC="{Binding LibVLC}" EnableRendererDiscovery="True" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
+        <vlc:MediaPlayerElement.PlaybackControls>
+            <vlc:PlaybackControls
+        	IsAspectRatioButtonVisible="True" IsSeekButtonVisible="True" IsCastButtonVisible="True" />
+        </vlc:MediaPlayerElement.PlaybackControls>
+
+    </vlc:MediaPlayerElement>
+
+</ContentPage>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bccf31a82f4800e0dbcdb380c24553b9fa9dc47c
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml.cs
@@ -0,0 +1,30 @@
+using Microsoft.Maui.Controls;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    /// <summary>
+    /// Represnets the Main Page.
+    /// </summary>
+    public partial class MainPage : ContentPage
+    {
+        /// <summary>
+        /// Initializes a new instance of <see cref="MainPage"/> class.
+        /// </summary>
+        public MainPage()
+        {
+            InitializeComponent();
+        }
+
+        void OnAppearing(object sender, System.EventArgs e)
+        {
+            base.OnAppearing();
+            ((MainViewModel)BindingContext).OnAppearing();
+        }
+
+        void OnDisappearing(object sender, System.EventArgs e)
+        {
+            base.OnDisappearing();
+            ((MainViewModel)BindingContext).OnDisappearing();
+        }
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainViewModel.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainViewModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6d8304e67a5e6b2cd08908c623deca9c23ff9ed3
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainViewModel.cs
@@ -0,0 +1,92 @@
+using System;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using LibVLCSharp.Shared;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    /// <summary>
+    /// Represents the main viewmodel.
+    /// </summary>
+    public class MainViewModel : INotifyPropertyChanged
+    {
+        /// <summary>
+        /// Property changed event
+        /// </summary>
+        public event PropertyChangedEventHandler PropertyChanged = null!;
+
+        /// <summary>
+        /// Initializes a new instance of <see cref="MainViewModel"/> class.
+        /// </summary>
+        public MainViewModel()
+        {
+        }
+
+        private LibVLC _libVLC;
+		
+        /// <summary>
+        /// Gets the <see cref="LibVLCSharp.Shared.LibVLC"/> instance.
+        /// </summary>
+        public LibVLC LibVLC
+        {
+            get => _libVLC;
+            private set => SetProperty(ref _libVLC, value);
+        }
+
+        private LibVLCSharp.Shared.MediaPlayer _mediaPlayer;
+        /// <summary>
+        /// Gets the <see cref="LibVLCSharp.Shared.MediaPlayer"/> instance.
+        /// </summary>
+        public LibVLCSharp.Shared.MediaPlayer MediaPlayer
+        {
+            get => _mediaPlayer;
+            private set => SetProperty(ref _mediaPlayer, value);
+        }
+
+        /// <summary>
+        /// Initialize LibVLC and playback when page appears
+        /// </summary>
+        public void OnAppearing()
+        {
+            if (LibVLC == null)
+            {
+                LibVLC = new LibVLC(enableDebugLogs: true);
+            }
+
+            if (MediaPlayer == null)
+            {
+                var media = new Media(LibVLC, new Uri("http://streams.videolan.org/streams/mkv/multiple_tracks.mkv"));
+                MediaPlayer = new LibVLCSharp.Shared.MediaPlayer(media)
+                {
+                    EnableHardwareDecoding = true
+                };
+                media.Dispose();
+                MediaPlayer.Play();
+            }
+        }
+
+        /// <summary>
+        /// Dispose MediaPlayer and LibVLC when page disappears
+        /// </summary>
+        public void OnDisappearing()
+        {
+            MediaPlayer?.Dispose();
+            MediaPlayer = null;
+
+            LibVLC?.Dispose();
+            LibVLC = null;
+        }
+
+        /// <summary>
+        /// Set property and notify UI
+        /// </summary>
+        private void SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
+        {
+            if (!Equals(field, value))
+            {
+                field = value;
+                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MauiProgram.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MauiProgram.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a259a4e0f44a3ad483c02458d7f6b7599d5bd14f
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MauiProgram.cs
@@ -0,0 +1,33 @@
+using Microsoft.Extensions.Logging;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    /// <summary>
+    /// The MauiProgram class is responsible for creating and configuring the MAUI application.
+    /// </summary>
+    public static class MauiProgram
+    {
+        /// <summary>
+        /// Creates and configures the MAUI application.
+        /// </summary>
+        /// <returns>The configured MAUI application.</returns>
+        public static MauiApp CreateMauiApp()
+        {
+            var builder = MauiApp.CreateBuilder();
+            builder
+                .UseMauiApp<App>()
+                .ConfigureFonts(fonts =>
+                 {
+                     fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+                     fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+                 })
+                .UseLibVLCSharp(); // Add your custom fonts and handler from your library
+
+#if DEBUG
+            builder.Logging.AddDebug();
+#endif
+
+            return builder.Build();
+        }
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/AndroidManifest.xml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e9937ad77d515322ba687ee6b7508b5d191cd959
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+	<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
+	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+	<uses-permission android:name="android.permission.INTERNET" />
+</manifest>
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainActivity.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000000000000000000000000000000000000..83cdd24019bb8a69683a3971690fedf19b3b827d
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainActivity.cs
@@ -0,0 +1,12 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+using Microsoft.Maui;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+    public class MainActivity : MauiAppCompatActivity
+    {
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainApplication.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c28054c295cda827778db5d1e2103cb459f420d4
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+using Android.App;
+using Android.Runtime;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    [Application]
+    public class MainApplication : MauiApplication
+    {
+        public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+            : base(handle, ownership)
+        {
+        }
+
+        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/Resources/values/colors.xml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c04d7492abf86f02e1b299625efd6f344af01e88
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#512BD4</color>
+    <color name="colorPrimaryDark">#2B0B98</color>
+    <color name="colorAccent">#2B0B98</color>
+</resources>
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/AppDelegate.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f0e33d31d49044c7472ecefd5b2a8dd065d50dd6
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    [Register("AppDelegate")]
+    public class AppDelegate : MauiUIApplicationDelegate
+    {
+        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Info.plist b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000000000000000000000000000000000000..c96dd0a22544b6b71535745b8a65075be5c1b882
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>UIDeviceFamily</key>
+	<array>
+		<integer>1</integer>
+		<integer>2</integer>
+	</array>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>arm64</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>XSAppIconAssets</key>
+	<string>Assets.xcassets/appicon.appiconset</string>
+</dict>
+</plist>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Program.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..30090b8ebd3fb2f1369622b3680329b5cc099edc
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    public class Program
+    {
+        // This is the main entry point of the application.
+        static void Main(string[] args)
+        {
+            // if you want to use a different Application Delegate class from "AppDelegate"
+            // you can specify it here.
+            UIApplication.Main(args, null, typeof(AppDelegate));
+        }
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..8daf553d0ba9494255f2615f4e66a9c208c66ca8
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml
@@ -0,0 +1,8 @@
+<maui:MauiWinUIApplication
+    x:Class="LibVLCSharp.MAUI.Sample.MediaElement.WinUI.App"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:maui="using:Microsoft.Maui"
+    xmlns:local="using:LibVLCSharp.MAUI.Sample.MediaElement.WinUI">
+
+</maui:MauiWinUIApplication>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e5405ac9b96fe20ef22591e4d4df0f038552c1f2
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,25 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement.WinUI
+{
+    /// <summary>
+    /// Provides application-specific behavior to supplement the default Application class.
+    /// </summary>
+    public partial class App : MauiWinUIApplication
+    {
+        /// <summary>
+        /// Initializes the singleton application object.  This is the first line of authored code
+        /// executed, and as such is the logical equivalent of main() or WinMain().
+        /// </summary>
+        public App()
+        {
+            this.InitializeComponent();
+        }
+
+        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+    }
+
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/Package.appxmanifest b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000000000000000000000000000000000000..fcdf34f184dd46a288a8de6c589fbb8c2dc2ee01
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Package
+  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
+  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
+  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
+  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
+  IgnorableNamespaces="uap rescap">
+
+  <Identity Name="maui-package-name-placeholder" Publisher="CN=User Name" Version="0.0.0.0" />
+
+  <mp:PhoneIdentity PhoneProductId="A14EC835-80ED-48C9-80D3-CDB7C110F983" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
+
+  <Properties>
+    <DisplayName>$placeholder$</DisplayName>
+    <PublisherDisplayName>User Name</PublisherDisplayName>
+    <Logo>$placeholder$.png</Logo>
+  </Properties>
+
+  <Dependencies>
+    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
+    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
+  </Dependencies>
+
+  <Resources>
+    <Resource Language="x-generate" />
+  </Resources>
+
+  <Applications>
+    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
+      <uap:VisualElements
+        DisplayName="$placeholder$"
+        Description="$placeholder$"
+        Square150x150Logo="$placeholder$.png"
+        Square44x44Logo="$placeholder$.png"
+        BackgroundColor="transparent">
+        <uap:DefaultTile Square71x71Logo="$placeholder$.png" Wide310x150Logo="$placeholder$.png" Square310x310Logo="$placeholder$.png" />
+        <uap:SplashScreen Image="$placeholder$.png" />
+      </uap:VisualElements>
+    </Application>
+  </Applications>
+
+  <Capabilities>
+    <rescap:Capability Name="runFullTrust" />
+  </Capabilities>
+
+</Package>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/app.manifest b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/app.manifest
new file mode 100644
index 0000000000000000000000000000000000000000..a627260148ff3c08e1d3f416ae0a758b1cfd364f
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/app.manifest
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
+  <assemblyIdentity version="1.0.0.0" name="LibVLCSharp.MAUI.Sample.MediaElement.WinUI.app"/>
+
+  <application xmlns="urn:schemas-microsoft-com:asm.v3">
+    <windowsSettings>
+      <!-- The combination of below two tags have the following effect:
+           1) Per-Monitor for >= Windows 10 Anniversary Update
+           2) System < Windows 10 Anniversary Update
+      -->
+      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
+      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
+    </windowsSettings>
+  </application>
+</assembly>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/AppDelegate.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6e7ff1fe9a17e30add722bb42dee22a2d3e64964
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,18 @@
+using Foundation;
+using Microsoft.Maui;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    /// <summary>
+    /// The AppDelegate class is responsible for handling application-level events.
+    /// </summary>
+    [Register("AppDelegate")]
+    public class AppDelegate : MauiUIApplicationDelegate
+    {
+        /// <summary>
+        /// This method is used to create and configure the Maui application instance.
+        /// </summary>
+        /// <returns>Returns the configured <see cref="MauiApp"/> application instance.</returns>
+        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Info.plist b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Info.plist
new file mode 100644
index 0000000000000000000000000000000000000000..0004a4fdee5d5bd9dac769b3e6a2e17931938ac3
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Info.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UIDeviceFamily</key>
+	<array>
+		<integer>1</integer>
+		<integer>2</integer>
+	</array>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>arm64</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>XSAppIconAssets</key>
+	<string>Assets.xcassets/appicon.appiconset</string>
+</dict>
+</plist>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Program.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..30641945edecff3992eb3ecff709c3c9d4865edc
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Program.cs
@@ -0,0 +1,22 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace LibVLCSharp.MAUI.Sample.MediaElement
+{
+    /// <summary>
+    /// The Program class contains the main entry point of the application.
+    /// </summary>
+    public class Program
+    {
+        /// <summary>
+        /// The main entry point of the application.
+        /// </summary>
+        /// <param name="args">An array of command-line arguments.</param>
+        static void Main(string[] args)
+        {
+            // if you want to use a different Application Delegate class from "AppDelegate"
+            // you can specify it here.
+            UIApplication.Main(args, null, typeof(AppDelegate));
+        }
+    }
+}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Properties/launchSettings.json b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Properties/launchSettings.json
new file mode 100644
index 0000000000000000000000000000000000000000..edf8aadcc83be92d0a7b46c125b10c0e40794fba
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+  "profiles": {
+    "Windows Machine": {
+      "commandName": "MsixPackage",
+      "nativeDebugging": false
+    }
+  }
+}
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appicon.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appicon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9d63b6513a1ce21f50b73c50848461b52441e718
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appicon.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <rect x="0" y="0" width="456" height="456" fill="#512BD4" />
+</svg>
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appiconfg.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 0000000000000000000000000000000000000000..21dfb25f187b2ff04d3b5a6f1913fe971f36b34b
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+    <path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+    <path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+    <path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+</svg>
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Regular.ttf b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..39b6aff94d9aa1fbbf74fe545b99b98eae5d67c0
Binary files /dev/null and b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Semibold.ttf b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..e0d2fa56e1e64e685928d7c984993bb33d9ebab9
Binary files /dev/null and b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Images/dotnet_bot.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Images/dotnet_bot.svg
new file mode 100644
index 0000000000000000000000000000000000000000..abfaff26a85341a34addc984a849b17077cc5cc6
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,93 @@
+<svg width="419" height="519" viewBox="0 0 419 519" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M284.432 247.568L284.004 221.881C316.359 221.335 340.356 211.735 355.308 193.336C382.408 159.996 372.893 108.183 372.786 107.659L398.013 102.831C398.505 105.432 409.797 167.017 375.237 209.53C355.276 234.093 324.719 246.894 284.432 247.568Z" fill="#8A6FE8"/>
+<path d="M331.954 109.36L361.826 134.245C367.145 138.676 375.055 137.959 379.497 132.639C383.928 127.32 383.211 119.41 377.891 114.969L348.019 90.0842C342.7 85.6531 334.79 86.3702 330.348 91.6896C325.917 97.0197 326.634 104.929 331.954 109.36Z" fill="#8A6FE8"/>
+<path d="M407.175 118.062L417.92 94.2263C420.735 87.858 417.856 80.4087 411.488 77.5831C405.12 74.7682 397.67 77.6473 394.845 84.0156L383.831 108.461L407.175 118.062Z" fill="#8A6FE8"/>
+<path d="M401.363 105.175L401.234 69.117C401.181 62.1493 395.498 56.541 388.53 56.5945C381.562 56.648 375.954 62.3313 376.007 69.2989L376.018 96.11L401.363 105.175Z" fill="#8A6FE8"/>
+<path d="M386.453 109.071L378.137 73.9548C376.543 67.169 369.757 62.9628 362.971 64.5575C356.185 66.1523 351.979 72.938 353.574 79.7237L362.04 115.482L386.453 109.071Z" fill="#8A6FE8"/>
+<path d="M381.776 142.261C396.359 142.261 408.181 130.44 408.181 115.857C408.181 101.274 396.359 89.4527 381.776 89.4527C367.194 89.4527 355.372 101.274 355.372 115.857C355.372 130.44 367.194 142.261 381.776 142.261Z" fill="url(#paint0_radial)"/>
+<path d="M248.267 406.979C248.513 384.727 245.345 339.561 222.376 301.736L199.922 315.372C220.76 349.675 222.323 389.715 221.841 407.182C221.798 408.627 235.263 409.933 248.267 406.979Z" fill="url(#paint1_linear)"/>
+<path d="M221.841 406.936L242.637 406.84L262.052 518.065L220.311 518.258C217.132 518.269 214.724 515.711 214.938 512.532L221.841 406.936Z" fill="#522CD5"/>
+<path d="M306.566 488.814C310.173 491.661 310.109 495.782 309.831 500.127L308.964 513.452C308.803 515.839 306.727 517.798 304.34 517.809L260.832 518.012C258.125 518.023 256.08 515.839 256.262 513.142L256.551 499.335C256.883 494.315 255.192 492.474 251.307 487.744C244.649 479.663 224.967 435.62 226.84 406.925L248.256 406.829C249.691 423.858 272.167 461.682 306.566 488.814Z" fill="url(#paint2_linear)"/>
+<path d="M309.82 500.127C310.023 497.088 310.077 494.176 308.889 491.715L254.635 491.961C256.134 494.166 256.765 496.092 256.562 499.314L256.273 513.121C256.091 515.828 258.146 518.012 260.843 517.99L304.34 517.798C306.727 517.787 308.803 515.828 308.964 513.442L309.82 500.127Z" fill="url(#paint3_radial)"/>
+<path d="M133.552 407.471C133.103 385.22 135.864 340.021 158.49 301.993L181.073 315.425C160.545 349.921 159.346 389.972 159.989 407.428C160.042 408.884 146.578 410.318 133.552 407.471Z" fill="url(#paint4_linear)"/>
+<path d="M110.798 497.152C110.765 494.187 111.204 491.575 112.457 487.23C131.882 434.132 133.52 407.364 133.52 407.364L159.999 407.246C159.999 407.246 161.819 433.512 181.716 486.427C183.289 490.195 183.471 493.641 183.674 496.831L183.792 513.816C183.803 516.374 181.716 518.483 179.158 518.494L177.873 518.504L116.781 518.782L115.496 518.793C112.927 518.804 110.83 516.728 110.819 514.159L110.798 497.152Z" fill="url(#paint5_linear)"/>
+<path d="M110.798 497.152C110.798 496.67 110.808 496.199 110.83 495.739C110.969 494.262 111.643 492.603 114.875 492.582L180.207 492.282C182.561 492.367 183.343 494.176 183.589 495.311C183.621 495.814 183.664 496.328 183.696 496.82L183.813 513.806C183.824 515.411 183.011 516.824 181.769 517.669C181.031 518.172 180.132 518.472 179.179 518.483L177.895 518.494L116.802 518.772L115.528 518.782C114.244 518.793 113.077 518.269 112.232 517.434C111.386 516.599 110.862 515.432 110.851 514.148L110.798 497.152Z" fill="url(#paint6_radial)"/>
+<path d="M314.979 246.348C324.162 210.407 318.008 181.777 318.008 181.777L326.452 181.734L326.656 181.574C314.262 115.75 256.326 66.0987 186.949 66.4198C108.796 66.773 45.7233 130.424 46.0765 208.577C46.4297 286.731 110.08 349.803 188.234 349.45C249.905 349.172 302.178 309.474 321.304 254.343C321.872 251.999 321.797 247.804 314.979 246.348Z" fill="url(#paint7_radial)"/>
+<path d="M310.237 279.035L65.877 280.148C71.3998 289.428 77.95 298.012 85.3672 305.761L290.972 304.829C298.336 297.005 304.8 288.368 310.237 279.035Z" fill="#D8CFF7"/>
+<path d="M235.062 312.794L280.924 312.585L280.74 272.021L234.877 272.23L235.062 312.794Z" fill="#512BD4"/>
+<path d="M243.001 297.626C242.691 297.626 242.434 297.53 242.22 297.327C242.006 297.123 241.899 296.866 241.899 296.588C241.899 296.299 242.006 296.042 242.22 295.839C242.434 295.625 242.691 295.528 243.001 295.528C243.312 295.528 243.568 295.635 243.782 295.839C243.996 296.042 244.114 296.299 244.114 296.588C244.114 296.877 244.007 297.123 243.793 297.327C243.568 297.519 243.312 297.626 243.001 297.626Z" fill="white"/>
+<path d="M255.192 297.434H253.212L247.967 289.203C247.839 289 247.721 288.775 247.636 288.55H247.593C247.636 288.786 247.657 289.299 247.657 290.091L247.668 297.444H245.912L245.891 286.228H247.999L253.062 294.265C253.276 294.597 253.415 294.833 253.479 294.95H253.511C253.458 294.651 253.437 294.148 253.437 293.441L253.426 286.217H255.17L255.192 297.434Z" fill="white"/>
+<path d="M263.733 297.412L257.589 297.423L257.568 286.206L263.465 286.195V287.779L259.387 287.79L259.398 290.969L263.155 290.958V292.532L259.398 292.542L259.409 295.86L263.733 295.85V297.412Z" fill="white"/>
+<path d="M272.445 287.758L269.298 287.769L269.32 297.401H267.5L267.479 287.769L264.343 287.779V286.195L272.434 286.174L272.445 287.758Z" fill="white"/>
+<path d="M315.279 246.337C324.355 210.836 318.457 182.483 318.308 181.798L171.484 182.462C171.484 182.462 162.226 181.563 162.268 190.018C162.311 198.463 162.761 222.341 162.878 248.746C162.9 254.172 167.363 256.773 170.863 256.751C170.874 256.751 311.618 252.213 315.279 246.337Z" fill="url(#paint8_radial)"/>
+<path d="M227.685 246.798C227.685 246.798 250.183 228.827 254.571 225.499C258.959 222.17 262.812 221.977 266.869 225.445C270.925 228.913 293.616 246.498 293.616 246.498L227.685 246.798Z" fill="#A08BE8"/>
+<path d="M320.748 256.141C320.748 256.141 324.943 248.414 315.279 246.348C315.289 246.305 170.927 246.894 170.927 246.894C167.566 246.905 163.232 244.925 162.846 241.671C162.857 244.004 162.878 246.369 162.889 248.756C162.91 253.68 166.582 256.27 169.878 256.698C170.21 256.73 170.542 256.773 170.874 256.773L180.742 256.73L320.748 256.141Z" fill="#512BD4"/>
+<path d="M206.4 233.214C212.511 233.095 217.302 224.667 217.102 214.39C216.901 204.112 211.785 195.878 205.674 195.997C199.563 196.116 194.772 204.544 194.973 214.821C195.173 225.099 200.289 233.333 206.4 233.214Z" fill="#512BD4"/>
+<path d="M306.249 214.267C306.356 203.989 301.488 195.605 295.377 195.541C289.266 195.478 284.225 203.758 284.118 214.037C284.011 224.315 288.878 232.699 294.99 232.763C301.101 232.826 306.142 224.545 306.249 214.267Z" fill="#512BD4"/>
+<path d="M205.905 205.291C208.152 203.022 211.192 202.016 214.157 202.262C215.912 205.495 217.014 209.733 217.111 214.389C217.164 217.3 216.811 220.04 216.158 222.513C212.669 223.519 208.752 222.662 205.979 219.922C201.912 215.909 201.88 209.348 205.905 205.291Z" fill="#8065E0"/>
+<path d="M294.996 204.285C297.255 202.016 300.294 200.999 303.259 201.256C305.164 204.628 306.309 209.209 306.256 214.239C306.224 216.808 305.892 219.259 305.303 221.485C301.793 222.523 297.843 221.678 295.061 218.916C291.004 214.892 290.972 208.342 294.996 204.285Z" fill="#8065E0"/>
+<path d="M11.6342 357.017C10.9171 354.716 -5.72611 300.141 21.3204 258.903C36.9468 235.078 63.3083 221.035 99.6664 217.15L102.449 243.276C74.3431 246.273 54.4676 256.345 43.3579 273.202C23.0971 303.941 36.5722 348.733 36.7113 349.183L11.6342 357.017Z" fill="url(#paint9_linear)"/>
+<path d="M95.1498 252.802C109.502 252.802 121.137 241.167 121.137 226.815C121.137 212.463 109.502 200.828 95.1498 200.828C80.7976 200.828 69.1628 212.463 69.1628 226.815C69.1628 241.167 80.7976 252.802 95.1498 252.802Z" fill="url(#paint10_radial)"/>
+<path d="M72.0098 334.434L33.4683 329.307C26.597 328.397 20.2929 333.214 19.3725 340.085C18.4627 346.956 23.279 353.26 30.1504 354.181L68.6919 359.308C75.5632 360.217 81.8673 355.401 82.7878 348.53C83.6975 341.658 78.8705 335.344 72.0098 334.434Z" fill="#8A6FE8"/>
+<path d="M3.73535 367.185L7.35297 393.076C8.36975 399.968 14.7702 404.731 21.6629 403.725C28.5556 402.708 33.3185 396.308 32.3124 389.415L28.5984 362.861L3.73535 367.185Z" fill="#8A6FE8"/>
+<path d="M15.5194 374.988L34.849 405.427C38.6058 411.292 46.4082 413.005 52.2735 409.248C58.1387 405.491 59.8512 397.689 56.0945 391.823L41.7953 369.144L15.5194 374.988Z" fill="#8A6FE8"/>
+<path d="M26.0511 363.739L51.8026 389.019C56.7688 393.911 64.7532 393.846 69.6445 388.88C74.5358 383.914 74.4715 375.929 69.516 371.038L43.2937 345.297L26.0511 363.739Z" fill="#8A6FE8"/>
+<path d="M26.4043 381.912C40.987 381.912 52.8086 370.091 52.8086 355.508C52.8086 340.925 40.987 329.104 26.4043 329.104C11.8216 329.104 0 340.925 0 355.508C0 370.091 11.8216 381.912 26.4043 381.912Z" fill="url(#paint11_radial)"/>
+<path d="M184.73 63.6308L157.819 66.5892L158.561 38.5412L177.888 36.4178L184.73 63.6308Z" fill="#8A6FE8"/>
+<path d="M170.018 41.647C180.455 39.521 187.193 29.3363 185.067 18.8988C182.941 8.46126 172.757 1.72345 162.319 3.84944C151.882 5.97543 145.144 16.1601 147.27 26.5976C149.396 37.0351 159.58 43.773 170.018 41.647Z" fill="#D8CFF7"/>
+<path d="M196.885 79.385C198.102 79.2464 198.948 78.091 198.684 76.8997C195.851 64.2818 183.923 55.5375 170.773 56.9926C157.622 58.4371 147.886 69.5735 147.865 82.4995C147.863 83.7232 148.949 84.6597 150.168 84.5316L196.885 79.385Z" fill="url(#paint12_radial)"/>
+<defs>
+<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(382.004 103.457) scale(26.4058)">
+<stop stop-color="#8065E0"/>
+<stop offset="1" stop-color="#512BD4"/>
+</radialGradient>
+<linearGradient id="paint1_linear" x1="214.439" y1="303.482" x2="236.702" y2="409.505" gradientUnits="userSpaceOnUse">
+<stop stop-color="#522CD5"/>
+<stop offset="0.4397" stop-color="#8A6FE8"/>
+</linearGradient>
+<linearGradient id="paint2_linear" x1="231.673" y1="404.144" x2="297.805" y2="522.048" gradientUnits="userSpaceOnUse">
+<stop stop-color="#522CD5"/>
+<stop offset="0.4397" stop-color="#8A6FE8"/>
+</linearGradient>
+<radialGradient id="paint3_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(280.957 469.555) rotate(-0.260742) scale(45.8326)">
+<stop offset="0.034" stop-color="#522CD5"/>
+<stop offset="0.9955" stop-color="#8A6FE8"/>
+</radialGradient>
+<linearGradient id="paint4_linear" x1="166.061" y1="303.491" x2="144.763" y2="409.709" gradientUnits="userSpaceOnUse">
+<stop stop-color="#522CD5"/>
+<stop offset="0.4397" stop-color="#8A6FE8"/>
+</linearGradient>
+<linearGradient id="paint5_linear" x1="146.739" y1="407.302" x2="147.246" y2="518.627" gradientUnits="userSpaceOnUse">
+<stop stop-color="#522CD5"/>
+<stop offset="0.4397" stop-color="#8A6FE8"/>
+</linearGradient>
+<radialGradient id="paint6_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(148.63 470.023) rotate(179.739) scale(50.2476)">
+<stop offset="0.034" stop-color="#522CD5"/>
+<stop offset="0.9955" stop-color="#8A6FE8"/>
+</radialGradient>
+<radialGradient id="paint7_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(219.219 153.929) rotate(179.739) scale(140.935)">
+<stop offset="0.4744" stop-color="#A08BE8"/>
+<stop offset="0.8618" stop-color="#8065E0"/>
+</radialGradient>
+<radialGradient id="paint8_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(314.861 158.738) rotate(179.739) scale(146.053)">
+<stop offset="0.0933" stop-color="#E1DFDD"/>
+<stop offset="0.6573" stop-color="white"/>
+</radialGradient>
+<linearGradient id="paint9_linear" x1="54.1846" y1="217.159" x2="54.1846" y2="357.022" gradientUnits="userSpaceOnUse">
+<stop offset="0.3344" stop-color="#9780E6"/>
+<stop offset="0.8488" stop-color="#8A6FE8"/>
+</linearGradient>
+<radialGradient id="paint10_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.3494 218.071) rotate(-0.260742) scale(25.9924)">
+<stop stop-color="#8065E0"/>
+<stop offset="1" stop-color="#512BD4"/>
+</radialGradient>
+<radialGradient id="paint11_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(25.805 345.043) scale(26.4106)">
+<stop stop-color="#8065E0"/>
+<stop offset="1" stop-color="#512BD4"/>
+</radialGradient>
+<radialGradient id="paint12_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(169.113 67.3662) rotate(-32.2025) scale(21.0773)">
+<stop stop-color="#8065E0"/>
+<stop offset="1" stop-color="#512BD4"/>
+</radialGradient>
+</defs>
+</svg>
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Raw/AboutAssets.txt b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Raw/AboutAssets.txt
new file mode 100644
index 0000000000000000000000000000000000000000..15d6244845fb9725c674dab726b3564bff8865f1
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,15 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+	<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
+
+These files will be deployed with you package and will be accessible using Essentials:
+
+	async Task LoadMauiAsset()
+	{
+		using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+		using var reader = new StreamReader(stream);
+
+		var contents = reader.ReadToEnd();
+	}
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Splash/splash.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Splash/splash.svg
new file mode 100644
index 0000000000000000000000000000000000000000..21dfb25f187b2ff04d3b5a6f1913fe971f36b34b
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Splash/splash.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+    <path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+    <path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+    <path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
+</svg>
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Colors.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Colors.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..43ebcdedc49a4242eb24266f5deaaeb01c2fa82e
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Colors.xaml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<?xaml-comp compile="true" ?>
+<ResourceDictionary 
+    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
+    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
+
+    <Color x:Key="Primary">#512BD4</Color>
+    <Color x:Key="Secondary">#DFD8F7</Color>
+    <Color x:Key="Tertiary">#2B0B98</Color>
+    <Color x:Key="White">White</Color>
+    <Color x:Key="Black">Black</Color>
+    <Color x:Key="Gray100">#E1E1E1</Color>
+    <Color x:Key="Gray200">#C8C8C8</Color>
+    <Color x:Key="Gray300">#ACACAC</Color>
+    <Color x:Key="Gray400">#919191</Color>
+    <Color x:Key="Gray500">#6E6E6E</Color>
+    <Color x:Key="Gray600">#404040</Color>
+    <Color x:Key="Gray900">#212121</Color>
+    <Color x:Key="Gray950">#141414</Color>
+    <SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource Primary}"/>
+    <SolidColorBrush x:Key="SecondaryBrush" Color="{StaticResource Secondary}"/>
+    <SolidColorBrush x:Key="TertiaryBrush" Color="{StaticResource Tertiary}"/>
+    <SolidColorBrush x:Key="WhiteBrush" Color="{StaticResource White}"/>
+    <SolidColorBrush x:Key="BlackBrush" Color="{StaticResource Black}"/>
+    <SolidColorBrush x:Key="Gray100Brush" Color="{StaticResource Gray100}"/>
+    <SolidColorBrush x:Key="Gray200Brush" Color="{StaticResource Gray200}"/>
+    <SolidColorBrush x:Key="Gray300Brush" Color="{StaticResource Gray300}"/>
+    <SolidColorBrush x:Key="Gray400Brush" Color="{StaticResource Gray400}"/>
+    <SolidColorBrush x:Key="Gray500Brush" Color="{StaticResource Gray500}"/>
+    <SolidColorBrush x:Key="Gray600Brush" Color="{StaticResource Gray600}"/>
+    <SolidColorBrush x:Key="Gray900Brush" Color="{StaticResource Gray900}"/>
+    <SolidColorBrush x:Key="Gray950Brush" Color="{StaticResource Gray950}"/>
+
+    <Color x:Key="Yellow100Accent">#F7B548</Color>
+    <Color x:Key="Yellow200Accent">#FFD590</Color>
+    <Color x:Key="Yellow300Accent">#FFE5B9</Color>
+    <Color x:Key="Cyan100Accent">#28C2D1</Color>
+    <Color x:Key="Cyan200Accent">#7BDDEF</Color>
+    <Color x:Key="Cyan300Accent">#C3F2F4</Color>
+    <Color x:Key="Blue100Accent">#3E8EED</Color>
+    <Color x:Key="Blue200Accent">#72ACF1</Color>
+    <Color x:Key="Blue300Accent">#A7CBF6</Color>
+
+</ResourceDictionary>
\ No newline at end of file
diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Styles.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Styles.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..7159c06db2ecd01492f7d8bc84b37664a2967ee8
--- /dev/null
+++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Styles.xaml
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<?xaml-comp compile="true" ?>
+<ResourceDictionary 
+    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
+    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
+
+    <Style TargetType="ActivityIndicator">
+        <Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+    </Style>
+
+    <Style TargetType="IndicatorView">
+        <Setter Property="IndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}"/>
+        <Setter Property="SelectedIndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}"/>
+    </Style>
+
+    <Style TargetType="Border">
+        <Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
+        <Setter Property="StrokeShape" Value="Rectangle"/>
+        <Setter Property="StrokeThickness" Value="1"/>
+    </Style>
+
+    <Style TargetType="BoxView">
+        <Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
+    </Style>
+
+    <Style TargetType="Button">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" />
+        <Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="FontFamily" Value="OpenSansRegular"/>
+        <Setter Property="FontSize" Value="14"/>
+        <Setter Property="CornerRadius" Value="8"/>
+        <Setter Property="Padding" Value="14,10"/>
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
+                            <Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="CheckBox">
+        <Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="DatePicker">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="OpenSansRegular"/>
+        <Setter Property="FontSize" Value="14"/>
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="Editor">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="OpenSansRegular"/>
+        <Setter Property="FontSize" Value="14" />
+        <Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="Entry">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="OpenSansRegular"/>
+        <Setter Property="FontSize" Value="14" />
+        <Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="Frame">
+        <Setter Property="HasShadow" Value="False" />
+        <Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
+        <Setter Property="CornerRadius" Value="8" />
+    </Style>
+
+    <Style TargetType="ImageButton">
+        <Setter Property="Opacity" Value="1" />
+        <Setter Property="BorderColor" Value="Transparent"/>
+        <Setter Property="BorderWidth" Value="0"/>
+        <Setter Property="CornerRadius" Value="0"/>
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="Opacity" Value="0.5" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="Label">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="OpenSansRegular" />
+        <Setter Property="FontSize" Value="14" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="ListView">
+        <Setter Property="SeparatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
+        <Setter Property="RefreshControlColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
+    </Style>
+
+    <Style TargetType="Picker">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
+        <Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="OpenSansRegular"/>
+        <Setter Property="FontSize" Value="14"/>
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                            <Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="ProgressBar">
+        <Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="RadioButton">
+        <Setter Property="BackgroundColor" Value="Transparent"/>
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
+        <Setter Property="FontFamily" Value="OpenSansRegular"/>
+        <Setter Property="FontSize" Value="14"/>
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="RefreshView">
+        <Setter Property="RefreshColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
+    </Style>
+
+    <Style TargetType="SearchBar">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
+        <Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
+        <Setter Property="CancelButtonColor" Value="{StaticResource Gray500}" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="OpenSansRegular" />
+        <Setter Property="FontSize" Value="14" />
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                            <Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="SearchHandler">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
+        <Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="OpenSansRegular" />
+        <Setter Property="FontSize" Value="14" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                            <Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="Shadow">
+        <Setter Property="Radius" Value="15" />
+        <Setter Property="Opacity" Value="0.5" />
+        <Setter Property="Brush" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
+        <Setter Property="Offset" Value="10,10" />
+    </Style>
+
+    <Style TargetType="Slider">
+        <Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
+        <Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
+                            <Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
+                            <Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="SwipeItem">
+        <Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
+    </Style>
+
+    <Style TargetType="Switch">
+        <Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="ThumbColor" Value="{StaticResource White}" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                            <Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                    <VisualState x:Name="On">
+                        <VisualState.Setters>
+                            <Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}" />
+                            <Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                    <VisualState x:Name="Off">
+                        <VisualState.Setters>
+                            <Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="TimePicker">
+        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
+        <Setter Property="BackgroundColor" Value="Transparent"/>
+        <Setter Property="FontFamily" Value="OpenSansRegular"/>
+        <Setter Property="FontSize" Value="14"/>
+        <Setter Property="MinimumHeightRequest" Value="44"/>
+        <Setter Property="MinimumWidthRequest" Value="44"/>
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CommonStates">
+                    <VisualState x:Name="Normal" />
+                    <VisualState x:Name="Disabled">
+                        <VisualState.Setters>
+                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style TargetType="Page" ApplyToDerivedTypes="True">
+        <Setter Property="Padding" Value="0"/>
+        <Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
+    </Style>
+
+    <Style TargetType="Shell" ApplyToDerivedTypes="True">
+        <Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
+        <Setter Property="Shell.ForegroundColor" Value="{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}" />
+        <Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
+        <Setter Property="Shell.DisabledColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
+        <Setter Property="Shell.UnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}" />
+        <Setter Property="Shell.NavBarHasShadow" Value="False" />
+        <Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
+        <Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="Shell.TabBarTitleColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="Shell.TabBarUnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
+    </Style>
+
+    <Style TargetType="NavigationPage">
+        <Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
+        <Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
+        <Setter Property="IconColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
+    </Style>
+
+    <Style TargetType="TabbedPage">
+        <Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}" />
+        <Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
+        <Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
+        <Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
+    </Style>
+
+</ResourceDictionary>
diff --git a/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs b/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs
index ae0515d8d5acce03975cdd13740f6663e044ba73..9b40c1ec94f4255aa77ebf32cf6deee45e1c0a9a 100644
--- a/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs
+++ b/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs
@@ -10,10 +10,22 @@
         /// </summary>
         /// <param name="builder">MauiAppBuilder</param>
         /// <returns>configured builder for libvlcsharp</returns>
-        public static MauiAppBuilder UseLibVLCSharp(this MauiAppBuilder builder) =>
+        public static MauiAppBuilder UseLibVLCSharp(this MauiAppBuilder builder)
+        {
+            // Register LibVLCSharp handlers
             builder.ConfigureMauiHandlers(handlers =>
             {
                 handlers.AddHandler(typeof(VideoView), typeof(VideoViewHandler));
             });
+
+            // Configure custom fonts
+            builder.ConfigureFonts(fonts =>
+            {
+                fonts.AddFont("FontAwesome5Brands.otf", "FontAwesomeBrands");
+                fonts.AddFont("FontAwesome5Solid.otf", "FontAwesomeSolid");
+            });
+
+            return builder;
+        }   
     }
 }
diff --git a/src/LibVLCSharp.MAUI/Converters/BufferingProgressToBoolConverter.cs b/src/LibVLCSharp.MAUI/Converters/BufferingProgressToBoolConverter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..39d705c097207ef48b386ec3ed69169ba1773785
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Converters/BufferingProgressToBoolConverter.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Globalization;
+using Microsoft.Maui.Controls;
+
+namespace LibVLCSharp.MAUI.Converters
+{
+    /// <summary>
+    /// Converts a value not equals to 0 and 1 to true.
+    /// </summary>
+    internal class BufferingProgressToBoolConverter : IValueConverter
+    {
+        /// <summary>
+        /// Modifies the source data before passing it to the target for display in the UI.
+        /// </summary>
+        /// <param name="value">The source data being passed to the target.</param>
+        /// <param name="targetType">The type of the target property.</param>
+        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
+        /// <param name="culture">The culture of the conversion.</param>
+        /// <returns>true if value is not equals to 0 or 1, false otherwise</returns>
+        public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+        {
+            return value is double d && d != 0 && d != 1;
+        }
+
+        /// <summary>
+        /// Not implemented
+        /// </summary>
+        public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/Converters/ObjectToBoolConverter.cs b/src/LibVLCSharp.MAUI/Converters/ObjectToBoolConverter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6bad71becaac8a19639a0f9809cefa6b488ae611
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Converters/ObjectToBoolConverter.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Globalization;
+using Microsoft.Maui.Controls;
+
+namespace LibVLCSharp.MAUI.Converters
+{
+    /// <summary>
+    /// Converts not null object to true.
+    /// </summary>
+    internal class ObjectToBoolConverter : IValueConverter
+    {
+        /// <summary>
+        /// Modifies the source data before passing it to the target for display in the UI.
+        /// </summary>
+        /// <param name="value">The source data being passed to the target.</param>
+        /// <param name="targetType">The type of the target property.</param>
+        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
+        /// <param name="culture">The culture of the conversion.</param>
+        /// <returns>true if value is not null, false otherwise</returns>
+        public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+        {
+            return value != null;
+        }
+
+        /// <summary>
+        /// Not implemented
+        /// </summary>
+        public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/Dispatcher.cs b/src/LibVLCSharp.MAUI/Dispatcher.cs
new file mode 100644
index 0000000000000000000000000000000000000000..eabc330c4874c2f5b2d1f3e01729beab0f4f39a3
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Dispatcher.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Threading.Tasks;
+using LibVLCSharp.Shared.MediaPlayerElement;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui;
+
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Object that provides services for managing the queue of work items for a thread
+    /// </summary>
+    internal class Dispatcher : Shared.MediaPlayerElement.IDispatcher
+    {
+        /// <summary>
+        /// Schedules the provided callback on the UI thread from a worker thread
+        /// </summary>
+        /// <param name="action">The callback on which the dispatcher returns when the event is dispatched</param>
+        /// <returns>The task object representing the asynchronous operation</returns>
+        public Task InvokeAsync(Action action)
+        {
+            Application.Current?.Dispatcher.Dispatch(action);
+            return Task.CompletedTask;
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/DisplayInformation.cs b/src/LibVLCSharp.MAUI/DisplayInformation.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b1ff2b516befd5bb13e540a561a6264def955804
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/DisplayInformation.cs
@@ -0,0 +1,17 @@
+using LibVLCSharp.Shared.MediaPlayerElement;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui;
+
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Monitors display-related information for an application view.
+    /// </summary>
+    internal class DisplayInformation : IDisplayInformation
+    {
+        /// <summary>
+        /// Gets the scale factor
+        /// </summary>
+        public double ScalingFactor => DeviceDisplay.MainDisplayInfo.Density;
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/DisplayRequest.cs b/src/LibVLCSharp.MAUI/DisplayRequest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..720915834743074b905b049240e6adf09b42cf78
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/DisplayRequest.cs
@@ -0,0 +1,28 @@
+using LibVLCSharp.Shared.MediaPlayerElement;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui;
+
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Represents a display request
+    /// </summary>
+    internal class DisplayRequest : IDisplayRequest
+    {
+        /// <summary>
+        /// Activates a display request
+        /// </summary>
+        public void RequestActive()
+        {
+            DeviceDisplay.Current.KeepScreenOn = true;
+        }
+
+        /// <summary>
+        /// Deactivates a display request
+        /// </summary>
+        public void RequestRelease()
+        {
+            DeviceDisplay.Current.KeepScreenOn = false;
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/Effects/ClickEffect.cs b/src/LibVLCSharp.MAUI/Effects/ClickEffect.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5b6642e66670c31df88c07e5f628bb54173b1629
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Effects/ClickEffect.cs
@@ -0,0 +1,20 @@
+using Microsoft.Maui.Controls;
+
+namespace LibVLCSharp.MAUI.Effects
+{
+    /// <summary>
+    /// Click effect.
+    /// </summary>
+    internal class ClickEffect : TriggerAction<VisualElement>
+    {
+        /// <summary>
+        /// Apply a click effect.
+        /// </summary>
+        /// <param name="sender">The object on which to invoke the trigger action.</param>
+        protected override async void Invoke(VisualElement sender)
+        {
+            await sender.ScaleTo(0.85, 100);
+            await sender.ScaleTo(1, 50);
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/IOrientationHandler.cs b/src/LibVLCSharp.MAUI/IOrientationHandler.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2a8e868ec500024c87bf2d412cbd97ee00c14822
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/IOrientationHandler.cs
@@ -0,0 +1,18 @@
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Force Device Orientation.
+    /// </summary>
+    public interface IOrientationHandler
+    {
+        /// <summary>
+        /// Lock device's orientation.
+        /// </summary>
+        void LockOrientation();
+
+        /// <summary>
+        /// Unlock device's orientation.
+        /// </summary>
+        void UnLockOrientation();
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/IPowerManager.cs b/src/LibVLCSharp.MAUI/IPowerManager.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fee934bb7dd09586f90c86ef75e2efd3c84bfbf5
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/IPowerManager.cs
@@ -0,0 +1,13 @@
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Interface for power management.
+    /// </summary>
+    public interface IPowerManager
+    {
+        /// <summary>
+        /// Gets or sets a value indicating whether the screen should be kept on.
+        /// </summary>
+        bool KeepScreenOn { get; set; }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/ISystemUI.cs b/src/LibVLCSharp.MAUI/ISystemUI.cs
new file mode 100644
index 0000000000000000000000000000000000000000..07c6e5a5f1cd0a955f342ae79d67de013aee1420
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/ISystemUI.cs
@@ -0,0 +1,8 @@
+namespace LibVLCSharp.MAUI
+{
+    internal interface ISystemUI
+    {
+        void ShowSystemUI();
+        void HideSystemUI();
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj b/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj
index d1af6db4b63e2d5c21999fec2d5ba0fcd1c0cd04..40905a1ed9f21758b72bc3b565563cb48abdc0ea 100644
--- a/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj
+++ b/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj
@@ -16,8 +16,40 @@ LibVLC needs to be installed separately, see VideoLAN.LibVLC.* packages.
     </Description>
   </PropertyGroup>
 
+  <ItemGroup>
+    <MauiFont Include="Resources\Fonts\FontAwesome5Brands.otf" />
+    <MauiFont Include="Resources\Fonts\FontAwesome5Solid.otf" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\LibVLCSharp\LibVLCSharp.csproj" />
     <PackageReference Include="Microsoft.Maui.Controls" Version="8.0.70" />
   </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="MediaPlayerElement.xaml.cs">
+      <DependentUpon>%(Filename)</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Update="PlaybackControls.xaml.cs">
+      <DependentUpon>%(Filename)</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Update="Themes\Generic.xaml.cs">
+      <DependentUpon>%(Filename)</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <MauiXaml Update="MediaPlayerElement.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </MauiXaml>
+    <MauiXaml Update="PlaybackControls.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </MauiXaml>
+  </ItemGroup>
+
 </Project>
diff --git a/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..1e7ea849450b0b0963374ae14a42c098376ade85
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui" 
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="LibVLCSharp.MAUI.MediaPlayerElement">
+    <ContentView.ControlTemplate>
+        <ControlTemplate>
+            <AbsoluteLayout>
+                <Grid AbsoluteLayout.LayoutBounds="0, 0, 1, 1" AbsoluteLayout.LayoutFlags="All">
+                    <Grid.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="GestureRecognized" />
+                        <ClickGestureRecognizer Clicked="GestureRecognized" />
+                        <PanGestureRecognizer PanUpdated="GestureRecognized" />
+                        <PinchGestureRecognizer PinchUpdated="GestureRecognized" />
+                        <SwipeGestureRecognizer Swiped="GestureRecognized" />
+                    </Grid.GestureRecognizers>
+                    <ContentPresenter Content="{TemplateBinding VideoView}"/>
+                    <Grid>
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="*" />
+                            <RowDefinition Height="Auto" />
+                        </Grid.RowDefinitions>
+                        <ContentPresenter Content="{TemplateBinding Content}" />
+                        <ContentPresenter Grid.Row="1" Content="{TemplateBinding PlaybackControls}" />
+                    </Grid>
+                </Grid>
+            </AbsoluteLayout>
+        </ControlTemplate>
+    </ContentView.ControlTemplate>
+</ContentView>
diff --git a/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml.cs b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ca2e5b73556b934aee6d1c6eda9e875349ef44c0
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml.cs
@@ -0,0 +1,315 @@
+using System;
+using LibVLCSharp.Shared;
+using Microsoft.Maui.Controls.Xaml;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui.Storage;
+
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Represents event data for page-related events.
+    /// </summary>
+    public class PageEventArgs : EventArgs
+    {
+        /// <summary>
+        /// Gets the associated <see cref="Page"/> instance.
+        /// </summary>
+        public Page Page { get; }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="PageEventArgs"/> class with the specified page.
+        /// </summary>
+        /// <param name="page">The page associated with the event.</param>
+        public PageEventArgs(Page page)
+        {
+            Page = page;
+        }
+    }
+
+    /// <summary>
+    /// Provides helper methods for handling page lifecycle events.
+    /// </summary>
+    public static class LifecycleHelper
+    {
+        private static readonly WeakEventManager _pageAppearingEventManager = new();
+        private static readonly WeakEventManager _pageDisappearingEventManager = new();
+
+        /// <summary>
+        /// Occurs when a page is appearing.
+        /// </summary>
+        public static event EventHandler<PageEventArgs> PageAppearing
+        {
+            add => _pageAppearingEventManager.AddEventHandler(value);
+            remove => _pageAppearingEventManager.RemoveEventHandler(value);
+        }
+
+        /// <summary>
+        /// Occurs when a page is disappearing.
+        /// </summary>
+        public static event EventHandler<PageEventArgs> PageDisappearing
+        {
+            add => _pageDisappearingEventManager.AddEventHandler(value);
+            remove => _pageDisappearingEventManager.RemoveEventHandler(value);
+        }
+
+        /// <summary>
+        /// Registers the page lifecycle events to track page appearing and disappearing.
+        /// </summary>
+        public static void RegisterPageLifecycleEvents()
+        {
+            if (Application.Current != null)
+            {
+                Application.Current.PageAppearing += (s, e) => _pageAppearingEventManager.HandleEvent(s ?? Application.Current, new PageEventArgs(e), nameof(PageAppearing));
+                Application.Current.PageDisappearing += (s, e) => _pageDisappearingEventManager.HandleEvent(s ?? Application.Current, new PageEventArgs(e), nameof(PageDisappearing));
+            }
+        }
+    }
+
+    /// <summary>
+    /// Represents an object that uses a <see cref="LibVLCSharp.Shared.MediaPlayer"/> to render audio and video to the display.
+    /// </summary>
+    [XamlCompilation(XamlCompilationOptions.Compile)]
+    public partial class MediaPlayerElement : ContentView
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="MediaPlayerElement"/> class.
+        /// </summary>
+        public MediaPlayerElement()
+        {
+            InitializeComponent();
+            LifecycleHelper.RegisterPageLifecycleEvents();
+        }
+
+        private bool Initialized { get; set; }
+
+        /// <summary>
+        /// Identifies the <see cref="LibVLC"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty LibVLCProperty = BindableProperty.Create(nameof(LibVLC), typeof(LibVLC),
+            typeof(MediaPlayerElement), propertyChanged: LibVLCPropertyChanged);
+
+        /// <summary>
+        /// Gets the <see cref="LibVLCSharp.Shared.LibVLC"/> instance.
+        /// </summary>
+        public LibVLC LibVLC
+        {
+            get => (LibVLC)GetValue(LibVLCProperty);
+            set => SetValue(LibVLCProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="MediaPlayer"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty MediaPlayerProperty = BindableProperty.Create(nameof(MediaPlayer),
+            typeof(LibVLCSharp.Shared.MediaPlayer), typeof(MediaPlayerElement), propertyChanged: MediaPlayerPropertyChanged);
+
+        /// <summary>
+        /// Gets the <see cref="LibVLCSharp.Shared.MediaPlayer"/> instance.
+        /// </summary>
+        public LibVLCSharp.Shared.MediaPlayer MediaPlayer
+        {
+            get => (LibVLCSharp.Shared.MediaPlayer)GetValue(MediaPlayerProperty);
+            set => SetValue(MediaPlayerProperty, value);
+        }
+
+        private static readonly BindableProperty PlaybackControlsProperty = BindableProperty.Create(nameof(PlaybackControls),
+            typeof(PlaybackControls), typeof(MediaPlayerElement), propertyChanged: PlaybackControlsPropertyChanged);
+
+        /// <summary>
+        /// Gets or sets the playback controls for the media.
+        /// </summary>
+        public PlaybackControls PlaybackControls
+        {
+            get => (PlaybackControls)GetValue(PlaybackControlsProperty);
+            set => SetValue(PlaybackControlsProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="VideoView"/> dependency property.
+        /// </summary>
+        private static readonly BindableProperty VideoViewProperty = BindableProperty.Create(nameof(VideoView), typeof(VideoView),
+         typeof(MediaPlayerElement), propertyChanged: VideoViewPropertyChanged);
+
+        /// <summary>
+        /// Gets or sets the video view.
+        /// </summary>
+        public VideoView? VideoView
+        {
+            get => (VideoView)GetValue(VideoViewProperty);
+            private set => SetValue(VideoViewProperty, value);
+        }
+
+        private static readonly BindableProperty EnableRendererDiscoveryProperty = BindableProperty.Create(nameof(EnableRendererDiscovery),
+            typeof(bool), typeof(PlaybackControls), true, propertyChanged: EnableRendererDiscoveryPropertyChanged);
+
+        /// <summary>
+        /// Enable or disable renderer discovery.
+        /// </summary>
+        public bool EnableRendererDiscovery
+        {
+            get => (bool)GetValue(EnableRendererDiscoveryProperty);
+            set => SetValue(EnableRendererDiscoveryProperty, value);
+        }
+
+        private void OnVideoViewChanged(VideoView videoView)
+        {
+            if (videoView != null)
+            {
+                videoView.MediaPlayer = MediaPlayer;
+                var playbackControls = PlaybackControls;
+                if (playbackControls != null)
+                {
+                    playbackControls.VideoView = videoView;
+                }
+            }
+        }
+
+        private void OnLibVLCChanged(LibVLC libVLC)
+        {
+            var playbackControls = PlaybackControls;
+            if (playbackControls != null)
+            {
+                playbackControls.LibVLC = libVLC;
+            }
+        }
+
+        private void OnMediaPlayerChanged(LibVLCSharp.Shared.MediaPlayer mediaPlayer)
+        {
+            var videoView = VideoView;
+            if (videoView != null)
+            {
+                videoView.MediaPlayer = mediaPlayer;
+            }
+            var playbackControls = PlaybackControls;
+            if (playbackControls != null)
+            {
+                playbackControls.MediaPlayer = mediaPlayer;
+            }
+        }
+
+        private void OnPlayControlsChanged(PlaybackControls playbackControls)
+        {
+            if (playbackControls != null)
+            {
+                playbackControls.IsCastButtonVisible = EnableRendererDiscovery;
+                playbackControls.LibVLC = LibVLC;
+                playbackControls.MediaPlayer = MediaPlayer;
+                playbackControls.VideoView = VideoView;
+            }
+        }
+
+        private void OnEnableRendererDiscoveryChanged(bool enableRendererDiscovery)
+        {
+            var playbackControls = PlaybackControls;
+            if (playbackControls != null)
+            {
+                playbackControls.IsCastButtonVisible = enableRendererDiscovery;
+            }
+        }
+
+        private static void VideoViewPropertyChanged(BindableObject bindable, object oldValue, object newValue)
+        {
+            ((MediaPlayerElement)bindable).OnVideoViewChanged((VideoView)newValue);
+        }
+
+        private static void LibVLCPropertyChanged(BindableObject bindable, object oldValue, object newValue)
+        {
+            ((MediaPlayerElement)bindable).OnLibVLCChanged((LibVLC)newValue);
+        }
+
+        private static void MediaPlayerPropertyChanged(BindableObject bindable, object oldValue, object newValue)
+        {
+            ((MediaPlayerElement)bindable).OnMediaPlayerChanged((LibVLCSharp.Shared.MediaPlayer)newValue);
+        }
+
+        private static void PlaybackControlsPropertyChanged(BindableObject bindable, object oldValue, object newValue)
+        {
+            ((MediaPlayerElement)bindable).OnPlayControlsChanged((PlaybackControls)newValue);
+        }
+
+        private static void EnableRendererDiscoveryPropertyChanged(BindableObject bindable, object oldValue, object newValue)
+        {
+            ((MediaPlayerElement)bindable).OnEnableRendererDiscoveryChanged((bool)newValue);
+        }
+
+        /// <summary>
+        /// Invoked whenever the <see cref="Element.Parent"/> of an element is set. 
+        /// Implement this method in order to add behavior when the element is added to a parent.
+        /// </summary>
+        /// <remarks>Implementors must call the base method.</remarks>
+        protected override void OnParentSet()
+        {
+            base.OnParentSet();
+
+            if (Parent != null && !Initialized)
+            {
+                Initialized = true;
+
+                if (VideoView == null)
+                {
+                    VideoView = new VideoView();
+                }
+
+                if (PlaybackControls == null)
+                {
+                    PlaybackControls = new PlaybackControls();
+                }
+
+                AttachLifecycleEvents();
+            }
+        }
+
+        private void AttachLifecycleEvents()
+        {
+            LifecycleHelper.PageAppearing += OnPageAppearing;
+            LifecycleHelper.PageDisappearing += OnPageDisappearing;
+        }
+
+        /// <summary>
+        /// Handle page appearing logic
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void OnPageAppearing(object? sender, EventArgs e)
+        {
+            if (sender is Page page && page == this.FindAncestor<Page>())
+            {
+                var mediaPlayer = MediaPlayer;
+                if (mediaPlayer != null)
+                {
+                    Preferences.Set($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_Position", mediaPlayer.Position);
+                    Preferences.Set($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_IsPlaying", mediaPlayer.State == VLCState.Playing);
+                    mediaPlayer.Stop();
+                }
+                VideoView = null;
+            }
+        }
+
+        /// <summary>
+        /// Handle page disappearing logic
+        /// </summary> minimize change.
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void OnPageDisappearing(object? sender, EventArgs e)
+        {
+            if (sender is Page page && page == this.FindAncestor<Page>())
+            {
+                VideoView = new VideoView();
+                var mediaPlayer = MediaPlayer;
+                if (mediaPlayer != null)
+                {
+                    if (Preferences.Get($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_IsPlaying", false))
+                    {
+                        mediaPlayer.Play();
+                        mediaPlayer.Position = Preferences.Get($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_Position", 0f);
+                    }
+                }
+            }
+        }
+
+        private void GestureRecognized(object sender, EventArgs e)
+        {
+            PlaybackControls.Show();
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/PlaybackControls.xaml b/src/LibVLCSharp.MAUI/PlaybackControls.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..fd279fb27e15fc83f8f6b8725f09ebceb91caa1d
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/PlaybackControls.xaml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TemplatedView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             xmlns:themes="clr-namespace:LibVLCSharp.MAUI.Themes"
+             x:Class="LibVLCSharp.MAUI.PlaybackControls"
+             Style="{StaticResource PlaybackControlsStyle}">
+    <TemplatedView.Resources>
+        <themes:Generic />
+    </TemplatedView.Resources>
+</TemplatedView>
diff --git a/src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs b/src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8cceda26cadbdc6d1b0d3034def055f28cf41ffc
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs
@@ -0,0 +1,1363 @@
+using System;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Resources;
+using System.Threading.Tasks;
+using LibVLCSharp.MAUI.Resources;
+using LibVLCSharp.Shared;
+using LibVLCSharp.Shared.MediaPlayerElement;
+using Microsoft.Maui.Controls.Xaml;
+using Microsoft.Maui.Graphics;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui;
+
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Represents the playback controls for a <see cref="LibVLCSharp.Shared.MediaPlayer"/>.
+    /// </summary>
+    [XamlCompilation(XamlCompilationOptions.Compile)]
+    public partial class PlaybackControls : TemplatedView
+    {
+        private const string AudioSelectionAvailableState = "AudioSelectionAvailable";
+        private const string VideoSelectionAvailableState = "VideoSelectionAvailable";
+        private const string AudioSelectionUnavailableState = "AudioSelectionUnavailable";
+        private const string VideoSelectionUnavailableState = "videoSelectionUnavailable";
+        private const string ClosedCaptionsSelectionAvailableState = "ClosedCaptionsSelectionAvailable";
+        private const string ClosedCaptionsSelectionUnavailableState = "ClosedCaptionsSelectionUnavailable";
+        private const string PlayState = "PlayState";
+        private const string PauseState = "PauseState";
+        private const string PauseAvailableState = "PauseAvailable";
+        private const string PauseUnavailableState = "PauseUnavailable";
+        private const string SeekAvailableState = "SeekAvailable";
+        private const string SeekUnavailableState = "SeekUnavailable";
+        private const string CastAvailableState = "CastAvailable";
+        private const string CastUnavailableState = "CastUnavailable";
+
+        /// <summary>
+        /// Initializes a new instance of <see cref="PlaybackControls"/> class.
+        /// </summary>
+        public PlaybackControls()
+        {
+            InitializeComponent();
+
+            try
+            {
+                ButtonColor = (Color)(Resources[nameof(ButtonColor)] ?? Colors.Transparent);
+                Foreground = (Color)(Resources[nameof(Foreground)] ?? Colors.White);
+                MainColor = (Color)(Resources[nameof(MainColor)] ?? Colors.Transparent);
+                TracksButtonStyle = Resources[nameof(TracksButtonStyle)] as Style;
+                BufferingProgressBarStyle = Resources[nameof(BufferingProgressBarStyle)] as Style;
+                ButtonBarStyle = Resources[nameof(ButtonBarStyle)] as Style;
+                CastButtonStyle = Resources[nameof(CastButtonStyle)] as Style;
+                ControlsPanelStyle = Resources[nameof(ControlsPanelStyle)] as Style;
+                MessageStyle = Resources[nameof(MessageStyle)] as Style;
+                PlayPauseButtonStyle = Resources[nameof(PlayPauseButtonStyle)] as Style;
+                RemainingTimeLabelStyle = Resources[nameof(RemainingTimeLabelStyle)] as Style;
+                ElapsedTimeLabelStyle = Resources[nameof(ElapsedTimeLabelStyle)] as Style;
+                SeekBarStyle = Resources[nameof(SeekBarStyle)] as Style;
+                StopButtonStyle = Resources[nameof(StopButtonStyle)] as Style;
+                AspectRatioButtonStyle = Resources[nameof(AspectRatioButtonStyle)] as Style;
+                RewindButtonStyle = Resources[nameof(RewindButtonStyle)] as Style;
+                SeekButtonStyle = Resources[nameof(SeekButtonStyle)] as Style;
+                LockButtonStyle = Resources[nameof(LockButtonStyle)] as Style;
+                UnLockButtonStyle = Resources[nameof(UnLockButtonStyle)] as Style;
+                UnLockControlsPanelStyle = Resources[nameof(UnLockControlsPanelStyle)] as Style;
+
+                Manager = new MediaPlayerElementManager(new Dispatcher(), new DisplayInformation(), new DisplayRequest());
+                var autoHideManager = Manager.Get<AutoHideNotifier>();
+                autoHideManager.Shown += async (sender, e) => await FadeInAsync();
+                autoHideManager.Hidden += async (sender, e) => await FadeOutAsync();
+                autoHideManager.Enabled = ShowAndHideAutomatically;
+                var audioTrackManager = Manager.Get<AudioTracksManager>();
+                audioTrackManager.TrackAdded += OnAudioTracksChanged;
+                audioTrackManager.TrackDeleted += OnAudioTracksChanged;
+                audioTrackManager.TracksCleared += OnAudioTracksChanged;
+                var videoTrackManager = Manager.Get<VideoTracksManager>();
+                videoTrackManager.TrackAdded += OnVideoTracksChanged;
+                videoTrackManager.TrackDeleted += OnVideoTracksChanged;
+                videoTrackManager.TracksCleared += OnVideoTracksChanged;
+                var subTitlesTrackManager = Manager.Get<SubtitlesTracksManager>();
+                subTitlesTrackManager.TrackAdded += OnSubtitlesTracksChanged;
+                subTitlesTrackManager.TrackDeleted += OnSubtitlesTracksChanged;
+                subTitlesTrackManager.TracksCleared += OnSubtitlesTracksChanged;
+                var castRenderersDiscoverer = Manager.Get<CastRenderersDiscoverer>();
+                castRenderersDiscoverer.CastAvailableChanged += (sender, e) => UpdateCastAvailability();
+                castRenderersDiscoverer.Enabled = IsCastButtonVisible;
+                var seekBarManager = Manager.Get<SeekBarManager>();
+                seekBarManager.PositionChanged += SeekBarManager_PositionChanged;
+                seekBarManager.SeekableChanged += (sender, e) => UpdateSeekAvailability();
+                var bufferingProgressNotifier = Manager.Get<BufferingProgressNotifier>();
+                bufferingProgressNotifier.Buffering += (sender, e) => OnBuffering();
+                var stateManager = Manager.Get<StateManager>();
+                stateManager.ErrorOccured += (sender, e) => ShowError();
+                stateManager.ErrorCleared += (sender, e) => ErrorMessage = null;
+                stateManager.Playing += (sender, e) => OnPlaying();
+                stateManager.Paused += (sender, e) => OnStoppedOrPaused();
+                stateManager.Stopped += (sender, e) => OnStoppedOrPaused();
+                stateManager.PlayPauseAvailableChanged += (sender, e) => UpdatePauseAvailability();
+            }
+            catch (Exception ex)
+            {
+                ShowErrorMessageBox(ex);
+            }
+        }
+
+        private void SeekBarManager_PositionChanged(object? sender, EventArgs e)
+        {
+            if (!Manager.Get<SeekBarManager>().IsDragging)
+            {
+                UpdateTime();
+            }
+        }
+
+        /// <summary>
+        /// Finalizer
+        /// </summary>
+        ~PlaybackControls()
+        {
+            Manager.Dispose();
+        }
+
+        private MediaPlayerElementManager Manager { get; } = default!;
+        private Button? TracksButton { get; set; }
+        private Button? CastButton { get; set; }
+        private VisualElement? ControlsPanel { get; set; }
+        private VisualElement? ButtonBar { get; set; }
+        private VisualElement? UnLockControlsPanel { get; set; }
+        private VisualElement? TracksOverlayView { get; set; }
+        private SwipeToUnLockView? SwipeToUnLock { get; set; }
+        private Label? TrackBarLabel { get; set; }
+        private Label? AudioTracksLabel { get; set; }
+        private Label? VideoTracksLabel { get; set; }
+        private Label? SubtileTracksLabel { get; set; }
+        private Button? PlayPauseButton { get; set; }
+        private Label? RemainingTimeLabel { get; set; }
+        private Label? ElapsedTimeLabel { get; set; }
+        private Label? AspectRatioLabel { get; set; }
+
+        private Slider? SeekBar { get; set; }
+        private ListView? AudioTracksListView { get; set; }
+        private ListView? VideoTracksListView { get; set; }
+        private ListView? SubtitlesTracksListView { get; set; }
+        private bool ScreenLockModeEnable { get; set; } = false;
+
+        private bool Initialized { get; set; }
+        private ISystemUI? SystemUI => DependencyService.Get<ISystemUI>();
+        private IOrientationHandler? OrientationHandler => DependencyService.Get<IOrientationHandler>();
+
+        private const int SEEK_OFFSET = 2000;
+        private bool RemoteRendering { get; set; } = false;
+        private const string Disconnect = "Disconnect";
+        private const string Cancel = "Cancel";
+
+        /// <summary>
+        /// Identifies the <see cref="ButtonColor"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ButtonColorProperty = BindableProperty.Create(nameof(ButtonColor), typeof(Color),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the button color.
+        /// </summary>
+        public Color ButtonColor
+        {
+            get => (Color)GetValue(ButtonColorProperty);
+            set => SetValue(ButtonColorProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="Foreground"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ForegroundProperty = BindableProperty.Create(nameof(Foreground), typeof(Color),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the button color.
+        /// </summary>
+        public Color Foreground
+        {
+            get => (Color)GetValue(ForegroundProperty);
+            set => SetValue(ForegroundProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="MainColor"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty MainColorProperty = BindableProperty.Create(nameof(MainColor), typeof(Color),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the main color.
+        /// </summary>
+        public Color MainColor
+        {
+            get => (Color)GetValue(MainColorProperty);
+            set => SetValue(MainColorProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="TracksButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty TracksButtonStyleProperty = BindableProperty.Create(
+            nameof(TracksButtonStyle), typeof(Style), typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the tracks button style.
+        /// </summary>
+        public Style? TracksButtonStyle
+        {
+            get => (Style)GetValue(TracksButtonStyleProperty);
+            set => SetValue(TracksButtonStyleProperty, value);
+        }
+
+
+        /// <summary>
+        /// Identifies the <see cref="BufferingProgressBarStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty BufferingProgressBarStyleProperty = BindableProperty.Create(nameof(BufferingProgressBarStyle),
+            typeof(Style), typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the controls panel style.
+        /// </summary>
+        public Style? BufferingProgressBarStyle
+        {
+            get => (Style)GetValue(BufferingProgressBarStyleProperty);
+            set => SetValue(BufferingProgressBarStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ButtonBarStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ButtonBarStyleProperty = BindableProperty.Create(nameof(ButtonBarStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the button bar style.
+        /// </summary>
+        public Style? ButtonBarStyle
+        {
+            get => (Style)GetValue(ButtonBarStyleProperty);
+            set => SetValue(ButtonBarStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="CastButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty CastButtonStyleProperty = BindableProperty.Create(nameof(CastButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the cast button style.
+        /// </summary>
+        public Style? CastButtonStyle
+        {
+            get => (Style)GetValue(CastButtonStyleProperty);
+            set => SetValue(CastButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ControlsPanelStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ControlsPanelStyleProperty = BindableProperty.Create(nameof(ControlsPanelStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the controls panel style.
+        /// </summary>
+        public Style? ControlsPanelStyle
+        {
+            get => (Style)GetValue(ControlsPanelStyleProperty);
+            set => SetValue(ControlsPanelStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="UnLockControlsPanelStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty UnLockControlsPanelStyleProperty = BindableProperty.Create(nameof(UnLockControlsPanelStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the unlock controls panel style.
+        /// </summary>
+        public Style? UnLockControlsPanelStyle
+        {
+            get => (Style)GetValue(UnLockControlsPanelStyleProperty);
+            set => SetValue(UnLockControlsPanelStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="UnLockButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty UnLockButtonStyleProperty = BindableProperty.Create(nameof(UnLockButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the unlock controls panel style.
+        /// </summary>
+        public Style? UnLockButtonStyle
+        {
+            get => (Style)GetValue(UnLockButtonStyleProperty);
+            set => SetValue(UnLockButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="MessageStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty MessageStyleProperty = BindableProperty.Create(nameof(MessageStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the message style.
+        /// </summary>
+        public Style? MessageStyle
+        {
+            get => (Style)GetValue(MessageStyleProperty);
+            set => SetValue(MessageStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="PlayPauseButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty PlayPauseButtonStyleProperty = BindableProperty.Create(nameof(PlayPauseButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the play/pause button style.
+        /// </summary>
+        public Style? PlayPauseButtonStyle
+        {
+            get => (Style)GetValue(PlayPauseButtonStyleProperty);
+            set => SetValue(PlayPauseButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="RemainingTimeLabelStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty RemainingTimeLabelStyleProperty = BindableProperty.Create(nameof(RemainingTimeLabelStyle),
+            typeof(Style), typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the remaining time label style.
+        /// </summary>
+        public Style? RemainingTimeLabelStyle
+        {
+            get => (Style)GetValue(RemainingTimeLabelStyleProperty);
+            set => SetValue(RemainingTimeLabelStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ElapsedTimeLabelStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ElapsedTimeLabelStyleProperty = BindableProperty.Create(nameof(ElapsedTimeLabelStyle),
+            typeof(Style), typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the elapsed time label style.
+        /// </summary>
+        public Style? ElapsedTimeLabelStyle
+        {
+            get => (Style)GetValue(ElapsedTimeLabelStyleProperty);
+            set => SetValue(ElapsedTimeLabelStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="SeekBarStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty SeekBarStyleProperty = BindableProperty.Create(nameof(SeekBarStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the seek bar style.
+        /// </summary>
+        public Style? SeekBarStyle
+        {
+            get => (Style)GetValue(SeekBarStyleProperty);
+            set => SetValue(SeekBarStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="StopButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty StopButtonStyleProperty = BindableProperty.Create(nameof(StopButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the stop button style.
+        /// </summary>
+        public Style? StopButtonStyle
+        {
+            get => (Style)GetValue(StopButtonStyleProperty);
+            set => SetValue(StopButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="VideoView"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty VideoViewProperty = BindableProperty.Create(nameof(VideoView), typeof(VideoView),
+            typeof(PlaybackControls),
+            propertyChanged: (bindable, oldValue, newValue) => ((PlaybackControls)bindable).Manager.VideoView = (IVideoControl)newValue);
+
+        /// <summary>
+        /// Gets or sets the associated <see cref="VideoView"/>.
+        /// </summary>
+        /// <remarks>It is only useful to set this property for the aspect ratio feature.</remarks>
+        public VideoView? VideoView
+        {
+            get => (VideoView)GetValue(VideoViewProperty);
+            set => SetValue(VideoViewProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="LockButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty LockButtonStyleProperty = BindableProperty.Create(nameof(LockButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the Lock button style.
+        /// </summary>
+        public Style? LockButtonStyle
+        {
+            get => (Style)GetValue(LockButtonStyleProperty);
+            set => SetValue(LockButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="AspectRatioButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty AspectRatioButtonStyleProperty = BindableProperty.Create(nameof(AspectRatioButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the aspect ratio button style.
+        /// </summary>
+        public Style? AspectRatioButtonStyle
+        {
+            get => (Style)GetValue(AspectRatioButtonStyleProperty);
+            set => SetValue(AspectRatioButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="RewindButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty RewindButtonStyleProperty = BindableProperty.Create(nameof(RewindButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the rewind button style.
+        /// </summary>
+        public Style? RewindButtonStyle
+        {
+            get => (Style)GetValue(RewindButtonStyleProperty);
+            set => SetValue(RewindButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="SeekButtonStyle"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty SeekButtonStyleProperty = BindableProperty.Create(nameof(SeekButtonStyle), typeof(Style),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the rewind button style.
+        /// </summary>
+        public Style? SeekButtonStyle
+        {
+            get => (Style)GetValue(SeekButtonStyleProperty);
+            set => SetValue(SeekButtonStyleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ButtonBarStartArea"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ButtonBarStartAreaProperty = BindableProperty.Create(nameof(ButtonBarStartArea), typeof(View),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the view in the button bar start area.
+        /// </summary>
+        public View ButtonBarStartArea
+        {
+            get => (View)GetValue(ButtonBarStartAreaProperty);
+            set => SetValue(ButtonBarStartAreaProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ButtonBarEndArea"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ButtonBarEndAreaProperty = BindableProperty.Create(nameof(ButtonBarEndArea), typeof(View),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the view in the button bar end area.
+        /// </summary>
+        public View ButtonBarEndArea
+        {
+            get => (View)GetValue(ButtonBarEndAreaProperty);
+            set => SetValue(ButtonBarEndAreaProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="LibVLC"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty LibVLCProperty = BindableProperty.Create(nameof(LibVLC), typeof(LibVLC), typeof(PlaybackControls),
+            propertyChanged: LibVLCPropertyChanged);
+        /// <summary>
+        /// Gets or sets the <see cref="LibVLCSharp.Shared.LibVLC"/> instance.
+        /// </summary>
+        public LibVLC LibVLC
+        {
+            get => (LibVLC)GetValue(LibVLCProperty);
+            set => SetValue(LibVLCProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="MediaPlayer"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty MediaPlayerProperty = BindableProperty.Create(nameof(MediaPlayer),
+            typeof(LibVLCSharp.Shared.MediaPlayer), typeof(PlaybackControls), propertyChanged: MediaPlayerPropertyChanged);
+        /// <summary>
+        /// Gets or sets the <see cref="LibVLCSharp.Shared.MediaPlayer"/> instance.
+        /// </summary>
+        public LibVLCSharp.Shared.MediaPlayer MediaPlayer
+        {
+            get => (LibVLCSharp.Shared.MediaPlayer)GetValue(MediaPlayerProperty);
+            set => SetValue(MediaPlayerProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="BufferingProgress"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty BufferingProgressProperty = BindableProperty.Create(nameof(BufferingProgress), typeof(double),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets a value corresponding to the buffering progress.
+        /// </summary>
+        public double BufferingProgress
+        {
+            get => (double)GetValue(BufferingProgressProperty);
+            set => SetValue(BufferingProgressProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ErrorMessage"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ErrorMessageProperty = BindableProperty.Create(nameof(ErrorMessage), typeof(string),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets the last error message.
+        /// </summary>
+        public string? ErrorMessage
+        {
+            get => (string)GetValue(ErrorMessageProperty);
+            private set => SetValue(ErrorMessageProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="KeepScreenOn"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty KeepScreenOnProperty = BindableProperty.Create(nameof(KeepScreenOn), typeof(bool),
+            typeof(PlaybackControls), true, propertyChanged: KeepScreenOnPropertyChangedAsync);
+        /// <summary>
+        /// Gets or sets a value indicating whether the screen must be kept on when playing.
+        /// </summary>
+        public bool KeepScreenOn
+        {
+            get => (bool)GetValue(KeepScreenOnProperty);
+            set => SetValue(KeepScreenOnProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="Position"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty PositionProperty = BindableProperty.Create(nameof(Position), typeof(TimeSpan),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the playback position within the media.
+        /// </summary>
+        public TimeSpan Position
+        {
+            get => (TimeSpan)GetValue(PositionProperty);
+            set => SetValue(PositionProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ResourceManager"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ResourceManagerProperty = BindableProperty.Create(nameof(ResourceManager), typeof(ResourceManager),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets the resource manager to localize strings.
+        /// </summary>
+        public ResourceManager ResourceManager
+        {
+            get => (ResourceManager)GetValue(ResourceManagerProperty) ?? Strings.ResourceManager;
+            set => SetValue(ResourceManagerProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="ShowAndHideAutomatically"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty ShowAndHideAutomaticallyProperty = BindableProperty.Create(nameof(ShowAndHideAutomatically),
+            typeof(bool), typeof(PlaybackControls), true,
+            propertyChanged: (bindable, oldValue, newValue) => ((PlaybackControls)bindable).OnShowAndHideAutomaticallyPropertyChanged());
+        /// <summary>
+        /// Gets or sets a value that indicates whether the controls are shown and hidden automatically.
+        /// </summary>
+        public bool ShowAndHideAutomatically
+        {
+            get => (bool)GetValue(ShowAndHideAutomaticallyProperty);
+            set => SetValue(ShowAndHideAutomaticallyProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsLockButtonVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsLockButtonVisibleProperty = BindableProperty.Create(nameof(IsLockButtonVisible), typeof(bool),
+            typeof(PlaybackControls), true);
+        /// <summary>
+        /// Gets or sets a value that indicates whether the lock button is shown.
+        /// </summary>
+        public bool IsLockButtonVisible
+        {
+            get => (bool)GetValue(IsLockButtonVisibleProperty);
+            set => SetValue(IsLockButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsTracksButtonVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsTracksButtonVisibleProperty = BindableProperty.Create(nameof(IsTracksButtonVisible), typeof(bool),
+            typeof(PlaybackControls), true);
+        /// <summary>
+        /// Gets or sets a value that indicates whether the tracks button is shown.
+        /// </summary>
+        public bool IsTracksButtonVisible
+        {
+            get => (bool)GetValue(IsTracksButtonVisibleProperty);
+            set => SetValue(IsTracksButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsCastButtonVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsCastButtonVisibleProperty = BindableProperty.Create(nameof(IsCastButtonVisible), typeof(bool),
+            typeof(PlaybackControls), true, propertyChanged: IsCastButtonVisiblePropertyChangedAsync);
+        /// <summary>
+        /// Gets or sets a value indicating whether the cast button is shown.
+        /// </summary>
+        public bool IsCastButtonVisible
+        {
+            get => (bool)GetValue(IsCastButtonVisibleProperty);
+            set => SetValue(IsCastButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsPlayPauseButtonVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsPlayPauseButtonVisibleProperty = BindableProperty.Create(nameof(IsPlayPauseButtonVisible),
+            typeof(bool), typeof(PlaybackControls), true, propertyChanged: IsPlayPauseButtonVisiblePropertyChanged);
+        /// <summary>
+        /// Gets or sets a value indicating whether the play/pause button is shown.
+        /// </summary>
+        public bool IsPlayPauseButtonVisible
+        {
+            get => (bool)GetValue(IsPlayPauseButtonVisibleProperty);
+            set => SetValue(IsPlayPauseButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsSeekEnabled"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsSeekEnabledProperty = BindableProperty.Create(nameof(IsSeekEnabled), typeof(bool),
+            typeof(PlaybackControls), true);
+        /// <summary>
+        /// Gets or sets a value that indicates whether a user can use the seek bar to find a location in the media.
+        /// </summary>
+        public bool IsSeekEnabled
+        {
+            get => (bool)GetValue(IsSeekEnabledProperty);
+            set => SetValue(IsSeekEnabledProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsSeekBarVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsSeekBarVisibleProperty = BindableProperty.Create(nameof(IsSeekBarVisible), typeof(bool),
+            typeof(PlaybackControls), true);
+        /// <summary>
+        /// Gets or sets a value that indicates whether the seek bar is shown.
+        /// </summary>
+        public bool IsSeekBarVisible
+        {
+            get => (bool)GetValue(IsSeekBarVisibleProperty);
+            set => SetValue(IsSeekBarVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsStopButtonVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsStopButtonVisibleProperty = BindableProperty.Create(nameof(IsStopButtonVisible), typeof(bool),
+            typeof(PlaybackControls));
+        /// <summary>
+        /// Gets or sets a value that indicates whether the stop button is shown.
+        /// </summary>
+        public bool IsStopButtonVisible
+        {
+            get => (bool)GetValue(IsStopButtonVisibleProperty);
+            set => SetValue(IsStopButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsAspectRatioButtonVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsAspectRatioButtonVisibleProperty = BindableProperty.Create(nameof(IsAspectRatioButtonVisible),
+            typeof(bool), typeof(PlaybackControls), true);
+        /// <summary>
+        /// Gets or sets a value indicating whether the aspect ratio button is shown.
+        /// </summary>
+        public bool IsAspectRatioButtonVisible
+        {
+            get => (bool)GetValue(IsAspectRatioButtonVisibleProperty);
+            set => SetValue(IsAspectRatioButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsRewindButtonVisible"/> dependency property.
+        /// </summary>s
+        public static readonly BindableProperty IsRewindButtonVisibleProperty = BindableProperty.Create(nameof(IsRewindButtonVisible),
+            typeof(bool), typeof(PlaybackControls), true);
+        /// <summary>
+        /// Gets or sets a value indicating whether the rewind button is shown.
+        /// </summary>
+        public bool IsRewindButtonVisible
+        {
+            get => (bool)GetValue(IsRewindButtonVisibleProperty);
+            set => SetValue(IsRewindButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Identifies the <see cref="IsSeekButtonVisible"/> dependency property.
+        /// </summary>
+        public static readonly BindableProperty IsSeekButtonVisibleProperty = BindableProperty.Create(nameof(IsSeekButtonVisible),
+            typeof(bool), typeof(PlaybackControls), true);
+        /// <summary>
+        /// Gets or sets a value indicating whether the seek button is shown.
+        /// </summary>
+        public bool IsSeekButtonVisible
+        {
+            get => (bool)GetValue(IsSeekButtonVisibleProperty);
+            set => SetValue(IsSeekButtonVisibleProperty, value);
+        }
+
+        /// <summary>
+        /// Called when the <see cref="Element.Parent"/> property has changed.
+        /// </summary>
+        protected override void OnParentSet()
+        {
+            base.OnParentSet();
+            if (Parent != null && !Initialized)
+            {
+                Initialized = true;
+                OnApplyCustomTemplate();
+            }
+        }
+
+        private void OnApplyCustomTemplate()
+        {
+            TracksButton = SetClickEventHandler(nameof(TracksButton), TracksButton_Clicked);
+            CastButton = SetClickEventHandler(nameof(CastButton), CastButton_ClickedAsync);
+            PlayPauseButton = SetClickEventHandler(nameof(PlayPauseButton), PlayPauseButton_Clicked);
+            SetClickEventHandler("StopButton", StopButton_Clicked);
+            SetClickEventHandler("LockButton", LockButton_ClickedAsync);
+            SetClickEventHandler("AspectRatioButton", AspectRatioButton_ClickedAsync);
+            ControlsPanel = this.FindChild<VisualElement>(nameof(ControlsPanel));
+            ButtonBar = this.FindChild<VisualElement>(nameof(ButtonBar));
+            UnLockControlsPanel = this.FindChild<VisualElement>(nameof(UnLockControlsPanel));
+            TracksOverlayView = this.FindChild<VisualElement>(nameof(TracksOverlayView));
+            SwipeToUnLock = this.FindChild<SwipeToUnLockView>(nameof(SwipeToUnLock));
+            SeekBar = this.FindChild<Slider>(nameof(SeekBar));
+            AudioTracksListView = this.FindChild<ListView>(nameof(AudioTracksListView));
+            if (AudioTracksListView != null)
+                AudioTracksListView.ItemTapped += AudioTracksItemTapped;
+            VideoTracksListView = this.FindChild<ListView>(nameof(VideoTracksListView));
+            if (VideoTracksListView != null)
+                VideoTracksListView.ItemTapped += VideoTracksItemTapped;
+            SubtitlesTracksListView = this.FindChild<ListView>(nameof(SubtitlesTracksListView));
+            if (SubtitlesTracksListView != null)
+                SubtitlesTracksListView.ItemTapped += SubtitlesTracksItemTapped;
+            TrackBarLabel = this.FindChild<Label>(nameof(TrackBarLabel));
+            AudioTracksLabel = this.FindChild<Label>(nameof(AudioTracksLabel));
+            VideoTracksLabel = this.FindChild<Label>(nameof(VideoTracksLabel));
+            SubtileTracksLabel = this.FindChild<Label>(nameof(SubtileTracksLabel));
+            RemainingTimeLabel = this.FindChild<Label>(nameof(RemainingTimeLabel));
+            ElapsedTimeLabel = this.FindChild<Label>(nameof(ElapsedTimeLabel));
+            AspectRatioLabel = this.FindChild<Label>(nameof(AspectRatioLabel));
+            SetClickEventHandler("RewindButton", RewindButton_Clicked);
+            SetClickEventHandler("SeekButton", SeekButton_Clicked);
+
+            if (SeekBar != null)
+            {
+                Manager.Get<SeekBarManager>().SeekBarMaximum = SeekBar.Maximum;
+                SeekBar.DragCompleted += SeekBar_DragCompleted;
+                SeekBar.DragStarted += SeekBar_DragStarted;
+                SeekBar.ValueChanged += SeekBar_ValueChanged;
+            }
+
+            if (TrackBarLabel != null)
+                TrackBarLabel.Text = ResourceManager.GetString(nameof(Strings.Unlock));
+            if (AudioTracksLabel != null && VideoTracksLabel != null && SubtileTracksLabel != null)
+            {
+                AudioTracksLabel.Text = ResourceManager.GetString(nameof(Strings.AudioTracks));
+                VideoTracksLabel.Text = ResourceManager.GetString(nameof(Strings.VideoTracks));
+                SubtileTracksLabel.Text = ResourceManager.GetString(nameof(Strings.ClosedCaptions));
+            }
+
+            if (SwipeToUnLock != null)
+                SwipeToUnLock.SlideCompleted += Handle_SlideCompletedAsync;
+
+            OrientationHandler?.UnLockOrientation();
+
+            VisualStateManager.GoToState(PlayPauseButton, Manager.Get<StateManager>().IsPlaying ? PauseState : PlayState);
+            UpdateSeekAvailability();
+            UpdateAudioTracksSelectionAvailability();
+            UpdateVideoTracksSelectionAvailability();
+            UpdateClosedCaptionsTracksSelectionAvailability();
+            UpdatePauseAvailability();
+            UpdateTime();
+            OnBuffering();
+        }
+
+        /// <summary>
+        /// Event handler for when dragging the seek bar completes.
+        /// Updates the position to the final value set by the user.
+        /// </summary>
+        private void SeekBar_DragCompleted(object? sender, EventArgs e)
+        {
+            Manager.Get<SeekBarManager>().IsDragging = false;
+
+            if (SeekBar != null)
+            {
+                Show();
+                Manager.Get<SeekBarManager>().SetSeekBarPosition(SeekBar.Value);
+                UpdateTime();
+            }
+        }
+
+        /// <summary>
+        /// Event handler for when dragging the seek bar starts.
+        /// Sets the dragging state to true.
+        /// </summary>
+        private void SeekBar_DragStarted(object? sender, EventArgs e)
+        {
+            Manager.Get<SeekBarManager>().IsDragging = true;
+        }
+
+        /// <summary>
+        /// Event handler for when the seek bar value changes while dragging.
+        /// Updates the displayed time estimation during the dragging process.
+        /// </summary>
+        private void SeekBar_ValueChanged(object? sender, ValueChangedEventArgs e)
+        {
+            if (Manager.Get<SeekBarManager>().IsDragging)
+            {
+                Show();
+            }
+        }
+
+        private static void IsPlayPauseButtonVisiblePropertyChanged(BindableObject bindable, object? oldValue, object? newValue)
+        {
+            ((PlaybackControls)bindable).UpdatePauseAvailability();
+        }
+
+        private static void IsCastButtonVisiblePropertyChangedAsync(BindableObject bindable, object? oldValue, object newValue)
+        {
+            var playbackControls = (PlaybackControls)bindable;
+            playbackControls.Manager.Get<CastRenderersDiscoverer>().Enabled = (bool)newValue;
+        }
+
+        private static void KeepScreenOnPropertyChangedAsync(BindableObject bindable, object? oldValue, object newValue)
+        {
+            ((PlaybackControls)bindable).UpdateKeepScreenOn((bool)newValue);
+        }
+
+        private static void LibVLCPropertyChanged(BindableObject bindable, object? oldValue, object newValue)
+        {
+            ((PlaybackControls)bindable).Manager.LibVLC = (LibVLC)newValue;
+        }
+
+        private static void MediaPlayerPropertyChanged(BindableObject bindable, object? oldValue, object newValue)
+        {
+            ((PlaybackControls)bindable).Manager.MediaPlayer = (LibVLCSharp.Shared.MediaPlayer)newValue;
+        }
+
+        private void OnBuffering()
+        {
+            BufferingProgress = Manager.Get<BufferingProgressNotifier>().BufferingProgress;
+        }
+
+        private void OnAudioTracksChanged(object? sender, EventArgs e)
+        {
+            UpdateAudioTracksSelectionAvailability();
+        }
+
+        private void OnVideoTracksChanged(object? sender, EventArgs e)
+        {
+            UpdateVideoTracksSelectionAvailability();
+        }
+
+        private void OnSubtitlesTracksChanged(object? sender, EventArgs e)
+        {
+            UpdateClosedCaptionsTracksSelectionAvailability();
+        }
+
+        private void TracksButton_Clicked(object? sender, EventArgs e)
+        {
+            if (ControlsPanel != null)
+                ControlsPanel.IsVisible = false;
+
+            var subtitleTracksSources = LoadTracks(Manager.Get<SubtitlesTracksManager>());
+            var audioTrackSouces = LoadTracks(Manager.Get<AudioTracksManager>());
+            var videoTrackSouces = LoadTracks(Manager.Get<VideoTracksManager>());
+
+            HideOrDisplayListview(SubtitlesTracksListView, subtitleTracksSources);
+            HideOrDisplayListview(AudioTracksListView, audioTrackSouces);
+            HideOrDisplayListview(VideoTracksListView, videoTrackSouces);
+
+            if (subtitleTracksSources.Count <= 0 && audioTrackSouces.Count <= 0 && videoTrackSouces.Count <= 0)
+            {
+                ShowErrorMessageBox(new Exception(ResourceManager.GetString(nameof(Strings.ErrorWithMedia))));
+            }
+            else if (TracksOverlayView != null)
+            {
+                TracksOverlayView.IsVisible = true;
+            }
+        }
+
+        private void HideOrDisplayListview(ListView? tracksListview, ObservableCollection<TrackViewModel> itemsSource)
+        {
+            if (tracksListview != null)
+            {
+                if (itemsSource.Count <= 0)
+                {
+                    tracksListview.IsVisible = false;
+                }
+                else
+                {
+                    tracksListview.IsVisible = true;
+                    tracksListview.ItemsSource = itemsSource;
+                }
+            }
+        }
+
+        private void AudioTracksItemTapped(object? sender, ItemTappedEventArgs e)
+        {
+            var track = (TrackViewModel)e.Item;
+            var manager = Manager.Get<AudioTracksManager>();
+            SelectTrack(manager, track, AudioTracksListView);
+        }
+
+        private void VideoTracksItemTapped(object? sender, ItemTappedEventArgs e)
+        {
+            var track = (TrackViewModel)e.Item;
+            var manager = Manager.Get<VideoTracksManager>();
+            SelectTrack(manager, track, VideoTracksListView);
+        }
+
+        private void SubtitlesTracksItemTapped(object? sender, ItemTappedEventArgs e)
+        {
+            var track = (TrackViewModel)e.Item;
+            var manager = Manager.Get<SubtitlesTracksManager>();
+            SelectTrack(manager, track, SubtitlesTracksListView);
+        }
+
+        private void SelectTrack(TracksManager manager, TrackViewModel track, ListView? tracksListview)
+        {
+            try
+            {
+                var tracks = manager.Tracks;
+                var currentTrackId = manager.CurrentTrackId;
+                if (tracks == null || track.Selected)
+                    return;
+            
+                var foundTrack = tracks.First(t => t.Id == track.Id);
+                manager.CurrentTrackId = foundTrack.Id;
+                PlaybackControls.UpdateTracksListviewItemsSource(track, tracksListview);
+            }
+            catch (Exception)
+            {
+                manager.CurrentTrackId = -1;
+            }     
+        }
+
+        private static void UpdateTracksListviewItemsSource(TrackViewModel selectedTrack, ListView? trackListView)
+        {
+            if (trackListView != null)
+            {
+                var itemSources = (ObservableCollection<TrackViewModel>)trackListView.ItemsSource;
+                var previousTrack = itemSources.First(t => t.Selected);
+                previousTrack.Selected = false;
+                selectedTrack.Selected = true;
+            }
+        }
+
+        private ObservableCollection<TrackViewModel> LoadTracks(TracksManager manager)
+        {
+            var allTracks = new ObservableCollection<TrackViewModel>();
+            var tracks = manager.Tracks;
+            try
+            {
+                if (tracks != null)
+                {
+                    var currentTrackId = manager.CurrentTrackId;
+                    foreach (var track in tracks)
+                    {
+                        var trackViewModel = new TrackViewModel(track.Id, track.Name);
+
+                        if (track.Id == currentTrackId)
+                            trackViewModel.Selected = true;
+                        allTracks.Add(trackViewModel);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                ShowErrorMessageBox(ex);
+            }
+            return allTracks;
+        }
+
+        private async void CastButton_ClickedAsync(object? sender, EventArgs e)
+        {
+            Manager.Get<AutoHideNotifier>().Enabled = false;
+            try
+            {
+                var renderersDiscoverer = Manager.Get<CastRenderersDiscoverer>();
+                var renderers = renderersDiscoverer.Renderers;
+                var mediaPlayer = MediaPlayer;
+                if (!RemoteRendering && renderers.Count() == 1)
+                {
+                    mediaPlayer.SetRenderer(renderers.First());
+                    RemoteRendering = true;
+                }
+                else
+                {
+                    var page = this.FindAncestor<Page>();
+                    if (page == null)
+                        return;
+
+                    var result = await page.DisplayActionSheet(ResourceManager.GetString(nameof(Strings.CastTo)),
+                        Cancel, Disconnect, renderers.Select(r => r.Name).OrderBy(r => r).ToArray());
+
+                    if (result != null)
+                    {
+                        var rendererName = renderers.FirstOrDefault(r => r.Name == result);
+                        if (rendererName != null)
+                        {
+                            mediaPlayer.SetRenderer(rendererName);
+                            RemoteRendering = true;
+                        }
+                        else if (result == Disconnect)
+                        {
+                            mediaPlayer.SetRenderer(null);
+                            RemoteRendering = false;
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                ShowErrorMessageBox(ex);
+            }
+            finally
+            {
+                OnShowAndHideAutomaticallyPropertyChanged();
+            }
+            Show();
+        }
+
+
+        private void PlayPauseButton_Clicked(object? sender, EventArgs e)
+        {
+            Manager.Get<StateManager>().TogglePause();
+        }
+
+        private void StopButton_Clicked(object? sender, EventArgs e)
+        {
+            Manager.Get<StateManager>().Stop();
+        }
+
+        private async void AspectRatioButton_ClickedAsync(object? sender, EventArgs e)
+        {
+            try
+            {
+                var aspectRatioManager = Manager.Get<AspectRatioManager>();
+                aspectRatioManager.AspectRatio = aspectRatioManager.AspectRatio == AspectRatio.Original ? AspectRatio.BestFit :
+                    aspectRatioManager.AspectRatio + 1;
+
+                if (AspectRatioLabel == null)
+                    return;
+
+                AspectRatioLabel.Text = Strings.ResourceManager.GetString($"{nameof(AspectRatio)}{aspectRatioManager.AspectRatio}");
+                await AspectRatioLabel.FadeTo(1);
+                await AspectRatioLabel.FadeTo(0, 2000);
+            }
+            catch (Exception ex)
+            {
+                ShowErrorMessageBox(ex);
+            }
+
+        }
+
+        private void RewindButton_Clicked(object? sender, EventArgs e)
+        {
+            var mediaPlayer = MediaPlayer;
+            if (mediaPlayer == null)
+            {
+                return;
+            }
+
+            mediaPlayer.Time -= SEEK_OFFSET;
+        }
+
+        private void SeekButton_Clicked(object? sender, EventArgs e)
+        {
+            var mediaPlayer = MediaPlayer;
+            if (mediaPlayer == null)
+            {
+                return;
+            }
+
+            mediaPlayer.Time += SEEK_OFFSET;
+        }
+
+        private Button? SetClickEventHandler(string name, EventHandler eventHandler, bool fadeIn = false)
+        {
+            var button = this.FindChild<Button>(name);
+            if (button != null)
+            {
+                button.Clicked += (sender, e) => OnButtonClicked(sender, e, eventHandler);
+            }
+            return button;
+        }
+
+        private void OnButtonClicked(object? sender, EventArgs e, EventHandler eventHandler)
+        {
+            Show();
+
+            try
+            {
+                eventHandler?.Invoke(sender, e);
+            }
+            catch (Exception ex)
+            {
+                ShowErrorMessageBox(ex);
+            }
+        }
+
+        private void OnPlaying()
+        {
+            VisualStateManager.GoToState(PlayPauseButton, PauseState);
+        }
+
+        private void OnStoppedOrPaused()
+        {
+            VisualStateManager.GoToState(PlayPauseButton, PlayState);
+        }
+
+        private void UpdateTracksSelectionButtonAvailability(Button? tracksSelectionButton, string state)
+        {
+            if (tracksSelectionButton != null)
+            {
+                VisualStateManager.GoToState(tracksSelectionButton, state);
+            }
+        }
+
+        private void UpdateTracksSelectionAvailability(TracksManager tracksManager, Button? tracksSelectionButton,
+            string availableState, string unavailableState, int count)
+        {
+            if (tracksSelectionButton != null)
+            {
+                var c = tracksManager.Tracks?.Where(t => t.Id != -1).Count();
+                UpdateTracksSelectionButtonAvailability(tracksSelectionButton,
+                    tracksManager.Tracks?.Where(t => t.Id != -1).Count() >= count ? availableState : unavailableState);
+            }
+        }
+
+        private void UpdateAudioTracksSelectionAvailability()
+        {
+            UpdateTracksSelectionAvailability(Manager.Get<AudioTracksManager>(), TracksButton,
+                AudioSelectionAvailableState, AudioSelectionUnavailableState, 2);
+        }
+
+        private void UpdateVideoTracksSelectionAvailability()
+        {
+            UpdateTracksSelectionAvailability(Manager.Get<VideoTracksManager>(), TracksButton,
+                VideoSelectionAvailableState, VideoSelectionUnavailableState, 3);
+        }
+
+        private void UpdateClosedCaptionsTracksSelectionAvailability()
+        {
+            UpdateTracksSelectionAvailability(Manager.Get<SubtitlesTracksManager>(), TracksButton,
+                ClosedCaptionsSelectionAvailableState, ClosedCaptionsSelectionUnavailableState, 1);
+        }
+
+        private void ShowError()
+        {
+            MainThread.BeginInvokeOnMainThread(() =>
+            {
+                var resourceManager = ResourceManager.GetString(nameof(Strings.ErrorWithMedia));
+                var mediaResourceLocator = Manager?.Get<StateManager>()?.MediaResourceLocator;
+                ErrorMessage = string.Format(resourceManager ?? "Error with media: {0}", mediaResourceLocator);
+            });
+        }
+
+        private void UpdateKeepScreenOn(bool keepScreenOn)
+        {
+            Manager.Get<DeviceAwakeningManager>().KeepDeviceAwake = keepScreenOn;
+        }
+
+        private void UpdatePauseAvailability()
+        {
+            var playPauseButton = PlayPauseButton;
+            if (playPauseButton != null)
+            {
+                VisualStateManager.GoToState(playPauseButton, IsPlayPauseButtonVisible &&
+                    Manager.Get<StateManager>().PlayPauseAvailable ? PauseAvailableState : PauseUnavailableState);
+            }
+        }
+
+        private void UpdateSeekAvailability()
+        {
+            var seekBar = SeekBar;
+            if (seekBar != null)
+            {
+                VisualStateManager.GoToState(seekBar, IsSeekEnabled &&
+                    Manager.Get<SeekBarManager>().Seekable ? SeekAvailableState : SeekUnavailableState);
+            }
+        }
+
+        private void UpdateCastAvailability()
+        {
+            var castButton = CastButton;
+            if (castButton != null)
+            {
+                VisualStateManager.GoToState(castButton,
+                    Manager.Get<CastRenderersDiscoverer>().CastAvailable ? CastAvailableState : CastUnavailableState);
+            }
+        }
+
+        private void UpdateTime()
+        {
+            try
+            {
+                var position = Manager.Get<SeekBarManager>().Position;
+                if (SeekBar != null)
+                {
+                    SeekBar.ValueChanged -= SeekBar_ValueChanged;
+                    try
+                    {
+                        SeekBar.Value = position.SeekBarPosition;
+                    }
+                    finally
+                    {
+                        SeekBar.ValueChanged += SeekBar_ValueChanged;
+                    }
+                }
+                if (RemainingTimeLabel != null)
+                {
+                    RemainingTimeLabel.Text = position.RemainingTimeText;
+                }
+                if (ElapsedTimeLabel != null)
+                {
+                    ElapsedTimeLabel.Text = position.ElapsedTimeText;
+                }
+            }
+            catch (Exception ex)
+            {
+                ShowErrorMessageBox(ex);
+            }
+        }
+
+        /// <summary>
+        /// Show an error message box.
+        /// </summary>
+        /// <param name="ex">The exception to show.</param>
+        protected virtual void ShowErrorMessageBox(Exception ex)
+        {
+            var errorString = ResourceManager.GetString(nameof(Strings.Error)) ?? "Error";
+            var okString = ResourceManager.GetString(nameof(Strings.OK)) ?? "OK";
+            MainThread.BeginInvokeOnMainThread(() =>
+            {
+                var page = this.FindAncestor<Page>();
+                page?.DisplayAlert(errorString ?? "Error", ex?.GetBaseException().Message ?? errorString ?? "An error occurred", okString);
+            });
+        }
+
+        private void OnShowAndHideAutomaticallyPropertyChanged()
+        {
+            Manager.Get<AutoHideNotifier>().Enabled = ShowAndHideAutomatically;
+        }
+
+        /// <summary>
+        /// Shows the tranport controls if they're hidden
+        /// </summary>
+        public void Show()
+        {
+            Manager.Get<AutoHideNotifier>().Show();
+        }
+
+        /// <summary>
+        /// Hides the playback controls if they're shown
+        /// </summary>
+        public void Hide()
+        {
+            Manager.Get<AutoHideNotifier>().Hide();
+        }
+
+        private async Task FadeInAsync()
+        {
+            var controlsPanel = ControlsPanel;
+            if (controlsPanel != null && SeekBar != null && ButtonBar != null && UnLockControlsPanel != null && TracksOverlayView != null)
+            {
+                controlsPanel.IsVisible = true;
+                SeekBar.IsVisible = true;
+
+                SeekBar.IsEnabled = !ScreenLockModeEnable;
+                ButtonBar.IsVisible = !ScreenLockModeEnable;
+                UnLockControlsPanel.IsVisible = ScreenLockModeEnable;
+
+                if (TracksOverlayView.IsVisible)
+                    TracksOverlayView.IsVisible = false;
+
+                if (controlsPanel.Opacity != 1)
+                {
+                    var systemUI = SystemUI;
+                    systemUI?.ShowSystemUI();
+                    await controlsPanel.FadeTo(1);
+                }
+            }
+        }
+
+        private async Task FadeOutAsync()
+        {
+            var controlsPanel = ControlsPanel;
+            if (controlsPanel != null)
+            {
+                if (await controlsPanel.FadeTo(0, 1000) && controlsPanel.Opacity == 0)
+                {
+                    controlsPanel.IsVisible = false;
+                }
+            }
+            if (UnLockControlsPanel != null)
+                UnLockControlsPanel.IsVisible = false;
+
+            var systemUI = SystemUI;
+            systemUI?.HideSystemUI();
+        }
+
+        /// <summary>
+        /// Trigger when user clicks on the Lock screen Button.
+        /// </summary>
+        /// <param name="sender">The control on which the event is triggered</param>
+        /// <param name="e">Then event's arguments</param>
+        private async void LockButton_ClickedAsync(object? sender, EventArgs e)
+        {
+            ScreenLockModeEnable = true;
+            OrientationHandler?.LockOrientation();
+            await FadeOutAsync();
+        }
+
+        /// <summary>
+        /// Trigger when user clicks finished to move the swipe button that unlocks the view.
+        /// </summary>
+        /// <param name="sender">The control on which the event is triggered</param>
+        /// <param name="e">Then event's arguments</param>
+        private async void Handle_SlideCompletedAsync(object? sender, EventArgs e)
+        {
+            ScreenLockModeEnable = false;
+            OrientationHandler?.UnLockOrientation();
+            await FadeInAsync();
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/Properties/AssemblyInfo.cs b/src/LibVLCSharp.MAUI/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..14ec619d97ec33f202aa208790e8fa76cc2be7e7
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Properties/AssemblyInfo.cs
@@ -0,0 +1,3 @@
+
+[assembly: ExportFont("FontAwesome5Brands.otf", Alias = "FontAwesomeBrands")]
+[assembly: ExportFont("FontAwesome5Solid.otf", Alias = "FontAwesomeSolid")]
diff --git a/src/LibVLCSharp.MAUI/README.md b/src/LibVLCSharp.MAUI/README.md
index f421c08495b1a368f980ef302946b05968a08879..226a33c636c534f6dcd5c376a65806435ad64498 100644
--- a/src/LibVLCSharp.MAUI/README.md
+++ b/src/LibVLCSharp.MAUI/README.md
@@ -1,6 +1,6 @@
 # LibVLCSharp.MAUI
 
-[![NuGet Stats](https://img.shields.io/nuget/v/LibVLCSharp.MAUI.svg)](https://www.nuget.org/packages/LibVLCSharp.MAUI)
+[![NuGet Stats](https://img.shields.io/nuget/v/LibVLCSharp.MAUI.svg)](https://www.nuget.org/packages/LibVLCSharp.MAUI)  
 [![NuGet Stats](https://img.shields.io/nuget/dt/LibVLCSharp.MAUI.svg)](https://www.nuget.org/packages/LibVLCSharp.MAUI)
 
 This package provides MAUI support for LibVLCSharp.
@@ -9,16 +9,18 @@ This package also contains the views for the following platforms:
 
 - Android
 - iOS
-- More platform soon...
+- More platforms coming soon...
 
-This package has multiple target frameworks, which means it will pick the right features for your project (you will only get the mac view if you are building a mac project).
+This package has multiple target frameworks, which means it will pick the right features for your project (you will only get the Mac view if you are building a Mac project).
 
-   BE CAREFUL: This project does not include **LibVLC** itself! You will need to install it separately!
-   See the [Installation](../../README.md#installation) documentation for more info.
+**BE CAREFUL:** This project does not include **LibVLC** itself! You will need to install it separately!  
+See the [Installation](../../README.md#installation) documentation for more info.
 
 ## MediaPlayerElement
 
-Coming soon...
+This package includes a MAUI MediaPlayerElement component. It currently supports iOS and Android only.
+
+See the [sample](../../samples/MAUI/LibVLCSharp.MAUI.MediaElement) for more info.
 
 ## Why should I reference this package in my project?
 
@@ -26,4 +28,11 @@ If you are in this situation, this package is made for you:
 
 - You want to build a MAUI application using LibVLCSharp.
 
-For other platforms, see the [main documentation](../../README.md)
\ No newline at end of file
+For other platforms, see the [main documentation](../../README.md).
+
+## Acknowledgments
+
+This project uses icons from [FontAwesome](https://fontawesome.com/).  
+- **Font License**: SIL OFL 1.1 (http://scripts.sil.org/OFL)  
+Font Awesome by Dave Gandy - http://fontawesome.io.
+
diff --git a/src/LibVLCSharp.MAUI/Resources/FontAwesomeCodes.cs b/src/LibVLCSharp.MAUI/Resources/FontAwesomeCodes.cs
new file mode 100644
index 0000000000000000000000000000000000000000..76967de471d8cac1f1e5c7307a6ace4d206d52d7
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Resources/FontAwesomeCodes.cs
@@ -0,0 +1,64 @@
+namespace LibVLCSharp.MAUI.Resources
+{
+    /// <summary>
+    /// Simplified list of FontAwesome icons used in the project.
+    /// Each constant represents a FontAwesome icon's Unicode value.
+    /// </summary>
+    public static class FontAwesomeCodes
+    {
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Chromecast icon.
+        /// </summary>
+        public const string Chromecast = "\uf838";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Play icon.
+        /// </summary>
+        public const string Play = "\uf04b";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Pause icon.
+        /// </summary>
+        public const string Pause = "\uf04c";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Stop icon.
+        /// </summary>
+        public const string Stop = "\uf04d";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Unlock Alt icon.
+        /// </summary>
+        public const string UnlockAlt = "\uf13e";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Lock icon.
+        /// </summary>
+        public const string Lock = "\uf023";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome List Alt icon.
+        /// </summary>
+        public const string ListAlt = "\uf022";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Expand Arrows Alt icon.
+        /// </summary>
+        public const string ExpandArrowsAlt = "\uf31e";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Backward icon.
+        /// </summary>
+        public const string Backward = "\uf04a";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Forward icon.
+        /// </summary>
+        public const string Forward = "\uf04e";
+
+        /// <summary>
+        /// Gets the Unicode character for the FontAwesome Check icon.
+        /// </summary>
+        public const string Check = "\uf00c";
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Brands.otf b/src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Brands.otf
new file mode 100644
index 0000000000000000000000000000000000000000..51d69ab8e699f50e45ba3f1a7ac824ad909e3cf0
Binary files /dev/null and b/src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Brands.otf differ
diff --git a/src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Solid.otf b/src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Solid.otf
new file mode 100644
index 0000000000000000000000000000000000000000..f2ed9d114095b12a6f949433b395c8f386e7484d
Binary files /dev/null and b/src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Solid.otf differ
diff --git a/src/LibVLCSharp.MAUI/Resources/Strings.Designer.cs b/src/LibVLCSharp.MAUI/Resources/Strings.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..af3d46f4e469c65d548847e691e7d5b58dd00d8f
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Resources/Strings.Designer.cs
@@ -0,0 +1,216 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LibVLCSharp.MAUI.Resources {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class Strings {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Strings() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LibVLCSharp.MAUI.Resources.Strings", typeof(Strings).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 16:9.
+        /// </summary>
+        public static string AspectRatio_16_9 {
+            get {
+                return ResourceManager.GetString("AspectRatio_16_9", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 4:3.
+        /// </summary>
+        public static string AspectRatio_4_3 {
+            get {
+                return ResourceManager.GetString("AspectRatio_4_3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Best fit.
+        /// </summary>
+        public static string AspectRatioBestFit {
+            get {
+                return ResourceManager.GetString("AspectRatioBestFit", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fill.
+        /// </summary>
+        public static string AspectRatioFill {
+            get {
+                return ResourceManager.GetString("AspectRatioFill", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fit screen.
+        /// </summary>
+        public static string AspectRatioFitScreen {
+            get {
+                return ResourceManager.GetString("AspectRatioFitScreen", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Original.
+        /// </summary>
+        public static string AspectRatioOriginal {
+            get {
+                return ResourceManager.GetString("AspectRatioOriginal", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Audio tracks.
+        /// </summary>
+        public static string AudioTracks {
+            get {
+                return ResourceManager.GetString("AudioTracks", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Cast to.
+        /// </summary>
+        public static string CastTo {
+            get {
+                return ResourceManager.GetString("CastTo", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Subtitles.
+        /// </summary>
+        public static string ClosedCaptions {
+            get {
+                return ResourceManager.GetString("ClosedCaptions", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Disable.
+        /// </summary>
+        public static string Disable {
+            get {
+                return ResourceManager.GetString("Disable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Error.
+        /// </summary>
+        public static string Error {
+            get {
+                return ResourceManager.GetString("Error", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Error with media {0}.
+        /// </summary>
+        public static string ErrorWithMedia {
+            get {
+                return ResourceManager.GetString("ErrorWithMedia", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No track found.
+        /// </summary>
+        public static string NoTrackFoundMessage {
+            get {
+                return ResourceManager.GetString("NoTrackFoundMessage", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OK.
+        /// </summary>
+        public static string OK {
+            get {
+                return ResourceManager.GetString("OK", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Track {0}.
+        /// </summary>
+        public static string Track {
+            get {
+                return ResourceManager.GetString("Track", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to SWIPE TO UNLOCK.
+        /// </summary>
+        public static string Unlock {
+            get {
+                return ResourceManager.GetString("Unlock", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Video tracks.
+        /// </summary>
+        public static string VideoTracks {
+            get {
+                return ResourceManager.GetString("VideoTracks", resourceCulture);
+            }
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/Resources/Strings.fr.resx b/src/LibVLCSharp.MAUI/Resources/Strings.fr.resx
new file mode 100644
index 0000000000000000000000000000000000000000..cfbe24aa87d7d85860f0fc94867d8bab87fd5acf
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Resources/Strings.fr.resx
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="AudioTracks" xml:space="preserve">
+    <value>Pistes audio</value>
+  </data>
+  <data name="CastTo" xml:space="preserve">
+    <value>Caster sur</value>
+  </data>
+  <data name="ClosedCaptions" xml:space="preserve">
+    <value>Sous-titres</value>
+  </data>
+  <data name="Disable" xml:space="preserve">
+    <value>Désactiver</value>
+  </data>
+  <data name="Error" xml:space="preserve">
+    <value>Erreur</value>
+  </data>
+  <data name="NoTrackFoundMessage" xml:space="preserve">
+    <value>Aucune piste trouvée</value>
+  </data>
+  <data name="OK" xml:space="preserve">
+    <value>OK</value>
+  </data>
+  <data name="Track" xml:space="preserve">
+    <value>Piste {0}</value>
+  </data>
+  <data name="Unlock" xml:space="preserve">
+    <value>DÉVERROUILLER</value>
+  </data>
+  <data name="VideoTracks" xml:space="preserve">
+    <value>Pistes vidéo</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/src/LibVLCSharp.MAUI/Resources/Strings.resx b/src/LibVLCSharp.MAUI/Resources/Strings.resx
new file mode 100644
index 0000000000000000000000000000000000000000..2e40a0f4faebaaad316dc0ff98d5cf3ce6ca8cad
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Resources/Strings.resx
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="AspectRatioBestFit" xml:space="preserve">
+    <value>Best fit</value>
+  </data>
+  <data name="AspectRatioFill" xml:space="preserve">
+    <value>Fill</value>
+  </data>
+  <data name="AspectRatioFitScreen" xml:space="preserve">
+    <value>Fit screen</value>
+  </data>
+  <data name="AspectRatioOriginal" xml:space="preserve">
+    <value>Original</value>
+  </data>
+  <data name="AspectRatio_16_9" xml:space="preserve">
+    <value>16:9</value>
+  </data>
+  <data name="AspectRatio_4_3" xml:space="preserve">
+    <value>4:3</value>
+  </data>
+  <data name="AudioTracks" xml:space="preserve">
+    <value>Audio tracks</value>
+  </data>
+  <data name="CastTo" xml:space="preserve">
+    <value>Cast to</value>
+  </data>
+  <data name="ClosedCaptions" xml:space="preserve">
+    <value>Subtitles</value>
+  </data>
+  <data name="Disable" xml:space="preserve">
+    <value>Disable</value>
+  </data>
+  <data name="Error" xml:space="preserve">
+    <value>Error</value>
+  </data>
+  <data name="ErrorWithMedia" xml:space="preserve">
+    <value>Error with media {0}</value>
+  </data>
+  <data name="NoTrackFoundMessage" xml:space="preserve">
+    <value>No track found</value>
+  </data>
+  <data name="OK" xml:space="preserve">
+    <value>OK</value>
+  </data>
+  <data name="Track" xml:space="preserve">
+    <value>Track {0}</value>
+  </data>
+  <data name="Unlock" xml:space="preserve">
+    <value>SWIPE TO UNLOCK</value>
+  </data>
+  <data name="VideoTracks" xml:space="preserve">
+    <value>Video tracks</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/src/LibVLCSharp.MAUI/SwipeToUnLockView.cs b/src/LibVLCSharp.MAUI/SwipeToUnLockView.cs
new file mode 100644
index 0000000000000000000000000000000000000000..dcbcf15215fececf3dba4f511906e90278aeeb28
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/SwipeToUnLockView.cs
@@ -0,0 +1,175 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.Maui.Graphics;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui;
+using Microsoft.Maui.Layouts;
+
+
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Custom view that allows user to unlock the MediaPlayerElement View.
+    /// </summary>
+    public class SwipeToUnLockView : AbsoluteLayout
+    {
+        private const string ThumbPropertyName = "Thumb";
+        private const string TrackBarPropertyName = "TrackBar";
+        private const string FillBarPropertyName = "FillBar";
+
+        /// <summary>
+        /// Defines the ThumbProperty.
+        /// </summary>
+        public static readonly BindableProperty ThumbProperty =
+            BindableProperty.Create(
+                ThumbPropertyName, typeof(View), typeof(SwipeToUnLockView),
+                defaultValue: default(View));
+
+        /// <summary>
+        /// Gets or sets the Thumb.
+        /// </summary>
+        public View Thumb
+        {
+            get { return (View)GetValue(ThumbProperty); }
+            set { SetValue(ThumbProperty, value); }
+        }
+
+        /// <summary>
+        /// Defines the TrackBar Property.
+        /// </summary>
+        public static readonly BindableProperty TrackBarProperty =
+            BindableProperty.Create(
+                TrackBarPropertyName, typeof(View), typeof(SwipeToUnLockView),
+                defaultValue: default(View));
+
+        /// <summary>
+        /// Gets or sets the TrackBar.
+        /// </summary>
+        public View TrackBar
+        {
+            get { return (View)GetValue(TrackBarProperty); }
+            set { SetValue(TrackBarProperty, value); }
+        }
+
+        /// <summary>
+        /// Defines the FillBar Property.
+        /// </summary>
+        public static readonly BindableProperty FillBarProperty =
+            BindableProperty.Create(
+                FillBarPropertyName, typeof(View), typeof(SwipeToUnLockView),
+                defaultValue: default(View));
+
+        /// <summary>
+        /// Gets or sets the FillBar.
+        /// </summary>
+        public View FillBar
+        {
+            get { return (View)GetValue(FillBarProperty); }
+            set { SetValue(FillBarProperty, value); }
+        }
+
+        /// <summary>
+        /// Defines the PanGesture.
+        /// </summary>
+        private PanGestureRecognizer _panGesture = new PanGestureRecognizer();
+
+        /// <summary>
+        /// Defines the Gesture Listener.
+        /// </summary>
+        private View _gestureListener;
+
+        /// <summary>
+        /// Defaut Constructor.
+        /// </summary>
+        public SwipeToUnLockView()
+        {
+            _panGesture.PanUpdated += OnPanGestureUpdated;
+            SizeChanged += OnSizeChanged;
+
+            _gestureListener = new ContentView { BackgroundColor = Colors.White, Opacity = 0.05 };
+            _gestureListener.GestureRecognizers.Add(_panGesture);
+        }
+
+        /// <summary>
+        /// The event wich will trigger when the view is completely swiped.
+        /// </summary>
+        public event EventHandler? SlideCompleted = null;
+
+        /// <summary>
+        /// Defines the FadeEffect default value.
+        /// </summary>
+        private const double FadeEffect = 0.5;
+
+        /// <summary>
+        /// Defines the Animation Length.
+        /// </summary>
+        private const uint AnimLength = 50;
+
+        internal async void OnPanGestureUpdated(object? sender, PanUpdatedEventArgs e)
+        {
+            if (Thumb == null || TrackBar == null || FillBar == null)
+                return;
+
+            switch (e.StatusType)
+            {
+                case GestureStatus.Started:
+                    await TrackBar.FadeTo(FadeEffect, AnimLength);
+                    break;
+
+                case GestureStatus.Running:
+                    // Translate and ensure we don't pan beyond the wrapped user interface element bounds.
+                    var x = Math.Max(0, e.TotalX);
+                    if (x > (Width - Thumb.Width))
+                        x = (Width - Thumb.Width);
+
+                    // Uncomment this if you want only forward dragging.
+                    // if (e.TotalX < Thumb.TranslationX)
+                    //    return;
+                    Thumb.TranslationX = x;
+                    this.SetLayoutBounds(FillBar, new Rect(0, 0, x + Thumb.Width / 2, Height));
+                    break;
+
+                case GestureStatus.Completed:
+                    var posX = Thumb.TranslationX;
+                    this.SetLayoutBounds(FillBar, new Rect(0, 0, 0, Height));
+
+                    // Reset translation applied during the pan
+                    await Task.WhenAll(new Task[]
+                    {
+                        TrackBar.FadeTo(1, AnimLength),
+                        Thumb.TranslateTo(0, 0, AnimLength * 2, Easing.CubicIn),
+                    });
+
+                    if (posX >= (Width - Thumb.Width - 10 /* keep some margin for error*/))
+                        SlideCompleted?.Invoke(this, EventArgs.Empty);
+                    break;
+            }
+        }
+
+        internal void OnSizeChanged(object? sender, EventArgs e)
+        {
+            if (Width == 0 || Height == 0)
+                return;
+            if (Thumb == null || TrackBar == null || FillBar == null)
+                return;
+
+            Children.Clear();
+
+            this.SetLayoutFlags(TrackBar, AbsoluteLayoutFlags.SizeProportional);
+            this.SetLayoutBounds(TrackBar, new Rect(0, 0, 1, 1));
+            Children.Add(TrackBar);
+
+            this.SetLayoutFlags(FillBar, AbsoluteLayoutFlags.None);
+            this.SetLayoutBounds(FillBar, new Rect(0, 0, 0, Height));
+            Children.Add(FillBar);
+
+            this.SetLayoutFlags(Thumb, AbsoluteLayoutFlags.None);
+            this.SetLayoutBounds(Thumb, new Rect(0, 0, Width / 5, Height));
+            Children.Add(Thumb);
+
+            this.SetLayoutFlags(_gestureListener, AbsoluteLayoutFlags.SizeProportional);
+            this.SetLayoutBounds(_gestureListener, new Rect(0, 0, 1, 1));
+            Children.Add(_gestureListener);
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/Themes/Generic.xaml b/src/LibVLCSharp.MAUI/Themes/Generic.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..f1baa5b2b87d53558085c10d72f20bbb459b59b1
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Themes/Generic.xaml
@@ -0,0 +1,333 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui" 
+                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+                    xmlns:converters="clr-namespace:LibVLCSharp.MAUI.Converters"
+                    xmlns:effects="clr-namespace:LibVLCSharp.MAUI.Effects"
+                    xmlns:local="clr-namespace:LibVLCSharp.MAUI"
+                    xmlns:fontAwesome="clr-namespace:LibVLCSharp.MAUI.Resources"
+                    x:Class="LibVLCSharp.MAUI.Themes.Generic">
+    <converters:BufferingProgressToBoolConverter x:Key="BufferingProgressToBoolConverter" />
+    <converters:ObjectToBoolConverter x:Key="ObjectToBoolConverter" />
+
+    <Color x:Key="Foreground">White</Color>
+    <Color x:Key="MainColor">#E57A00</Color>
+    <Color x:Key="ButtonColor">#A0E57A00</Color>
+
+    <Style x:Key="MessageStyle" TargetType="Label">
+        <Setter Property="HorizontalTextAlignment" Value="Center" />
+        <Setter Property="LineBreakMode" Value="WordWrap" />
+        <Setter Property="TextColor" Value="{TemplateBinding Foreground}" />
+    </Style>
+
+    <Style x:Key="BufferingProgressBarStyle" TargetType="ProgressBar">
+        <Setter Property="HeightRequest" Value="6" />
+        <Setter Property="ProgressColor" Value="{TemplateBinding MainColor}" />
+    </Style>
+
+    <Style x:Key="ControlsPanelStyle" TargetType="Layout">
+        <Setter Property="BackgroundColor" Value="#40E57A00" />
+        <Setter Property="Padding" Value="2,0,2,2" />
+    </Style>
+
+    <Style x:Key="UnLockControlsPanelStyle" TargetType="Layout">
+        <Setter Property="Margin" Value="0, 0, 0, 10" />
+        <Setter Property="WidthRequest" Value="300" />
+        <Setter Property="HorizontalOptions" Value="Center" />
+        <Setter Property="BackgroundColor" Value="Transparent"></Setter>
+    </Style>
+
+    <Style x:Key="SeekBarStyle" TargetType="Slider">
+        <Setter Property="HorizontalOptions" Value="FillAndExpand" />
+        <Setter Property="IsEnabled" Value="False" />
+        <Setter Property="MinimumTrackColor" Value="{TemplateBinding MainColor}" />
+        <Setter Property="MaximumTrackColor" Value="{TemplateBinding Foreground}" />
+        <Setter Property="Maximum" Value="1000" />
+        <Setter Property="ThumbColor" Value="{TemplateBinding MainColor}" />
+        <Setter Property="VerticalOptions" Value="Center" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="SeekAvailabilityStates">
+                    <VisualState x:Name="SeekAvailable">
+                        <VisualState.Setters>
+                            <Setter Property="IsEnabled" Value="True" />
+                        </VisualState.Setters>
+                    </VisualState>
+                    <VisualState x:Name="SeekUnavailable" />
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style x:Key="ElapsedTimeLabelStyle" TargetType="Label">
+        <Setter Property="HorizontalOptions" Value="StartAndExpand" />
+        <Setter Property="Margin" Value="15,15,15,0" />
+        <Setter Property="FontSize" Value="Small" />
+        <Setter Property="TextColor" Value="{TemplateBinding MainColor}" />
+        <Setter Property="VerticalOptions" Value="Center" />
+    </Style>
+
+    <Style x:Key="RemainingTimeLabelStyle" TargetType="Label">
+        <Setter Property="HorizontalOptions" Value="StartAndExpand" />
+        <Setter Property="Margin" Value="15,15,15,0" />
+        <Setter Property="FontSize" Value="Small" />
+        <Setter Property="TextColor" Value="{TemplateBinding Foreground}" />
+        <Setter Property="VerticalOptions" Value="Center" />
+    </Style>
+
+    <Style x:Key="ButtonBarStyle" TargetType="Layout">
+        <Setter Property="HeightRequest" Value="54" />
+    </Style>
+
+    <Style x:Key="ButtonStyle" TargetType="Button">
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="FontFamily" Value="FontAwesomeSolid" />
+        <Setter Property="FontSize" Value="30" />
+        <Setter Property="HeightRequest" Value="40" />
+        <Setter Property="HorizontalOptions" Value="Center" />
+        <Setter Property="Margin" Value="0" />
+        <Setter Property="Padding" Value="0" />
+        <Setter Property="TextColor" Value="{TemplateBinding Foreground}" />
+        <Setter Property="VerticalOptions" Value="Center" />
+        <Setter Property="WidthRequest" Value="40" />
+        <Style.Triggers>
+            <Trigger TargetType="Button" Property="IsEnabled" Value="False">
+                <Setter Property="TextColor" Value="DarkGray"/>
+            </Trigger>
+            <EventTrigger Event="Clicked">
+                <effects:ClickEffect />
+            </EventTrigger>
+        </Style.Triggers>
+    </Style>
+
+    <Style x:Key="CastButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="IsVisible" Value="False" />
+        <Setter Property="FontFamily" Value="FontAwesomeBrands" />
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Chromecast}" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="CastAvailabilityStates">
+                    <VisualState x:Name="CastAvailable">
+                        <VisualState.Setters>
+                            <Setter Property="IsVisible" Value="True" />
+                        </VisualState.Setters>
+                    </VisualState>
+                    <VisualState x:Name="CastUnavailable" />
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style x:Key="PlayPauseButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="CornerRadius" Value="27" />
+        <Setter Property="FontSize" Value="36" />
+        <Setter Property="HeightRequest" Value="54" />
+        <Setter Property="WidthRequest" Value="54" />
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Play}" />
+        <Setter Property="VisualStateManager.VisualStateGroups">
+            <VisualStateGroupList>
+                <VisualStateGroup x:Name="PlayPauseStates">
+                    <VisualState x:Name="PlayState" />
+                    <VisualState x:Name="PauseState">
+                        <VisualState.Setters>
+                            <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Pause}" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+                <VisualStateGroup x:Name="PauseAvailabilityStates">
+                    <VisualState x:Name="PauseAvailable" />
+                    <VisualState x:Name="PauseUnavailable">
+                        <VisualState.Setters>
+                            <Setter Property="IsVisible" Value="False" />
+                        </VisualState.Setters>
+                    </VisualState>
+                </VisualStateGroup>
+            </VisualStateGroupList>
+        </Setter>
+    </Style>
+
+    <Style x:Key="StopButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="IsVisible" Value="{TemplateBinding IsStopButtonVisible}" />
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Stop}" />
+    </Style>
+
+    <Style x:Key="LockButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.UnlockAlt}" />
+        <Setter Property="IsVisible" Value="{TemplateBinding IsLockButtonVisible}" />
+    </Style>
+
+    <Style x:Key="UnLockButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Lock}" />
+    </Style>
+
+    <Style x:Key="TracksButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.ListAlt}" />
+        <Setter Property="IsVisible" Value="{TemplateBinding IsTracksButtonVisible}" />
+    </Style>
+
+    <Style x:Key="AspectRatioButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="IsVisible" Value="{TemplateBinding IsAspectRatioButtonVisible}" />
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.ExpandArrowsAlt}" />
+    </Style>
+
+    <Style x:Key="RewindButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="IsVisible" Value="{TemplateBinding IsRewindButtonVisible}" />
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Backward}" />
+    </Style>
+
+    <Style x:Key="SeekButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
+        <Setter Property="IsVisible" Value="{TemplateBinding IsSeekButtonVisible}" />
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Forward}" />
+    </Style>
+
+    <Style x:Key="TracksListViewStyle" TargetType="ListView">
+        <Setter Property="SeparatorColor" Value="Transparent" />
+        <Setter Property="SeparatorVisibility" Value="None" />
+        <Setter Property="BackgroundColor">
+            <Setter.Value>
+                <OnPlatform x:TypeArguments="Color">
+                    <On Platform="iOS">#7F000000</On>
+                </OnPlatform>
+            </Setter.Value>
+        </Setter>
+        <Setter Property="RowHeight">
+            <Setter.Value>
+                <OnPlatform x:TypeArguments="x:Int32">
+                    <On Platform="Android">40</On>
+                    <On Platform="iOS">50</On>
+                </OnPlatform>
+            </Setter.Value>
+        </Setter>
+        <Setter Property="HasUnevenRows" Value="False" />
+        <Setter Property="SelectionMode" Value="None" />
+    </Style>
+
+    <Style x:Key="TrackTypeLabelStyle" TargetType="Label">
+        <Setter Property="FontSize" Value="18"/>
+        <Setter Property="TextColor" Value="White" />
+    </Style>
+    
+    <Style x:Key="TrackNameLabelStyle" TargetType="Label">
+        <Setter Property="TextColor" Value="White" />
+        <Setter Property="VerticalOptions" Value="End" />
+    </Style>
+
+    <Style x:Key="CheckedTrackStyle" TargetType="Button">
+        <Setter Property="FontFamily" Value="FontAwesomeSolid" />
+        <Setter Property="Text" Value="{x:Static fontAwesome:FontAwesomeCodes.Check}" />
+        <Setter Property="TextColor" Value="#FE8A03" />
+        <Setter Property="BackgroundColor" Value="Transparent" />
+        <Setter Property="WidthRequest" Value="40" />
+        <Setter Property="FontSize" Value="14" />
+    </Style>
+    
+    <Style x:Key="TrackViewCellStyle" TargetType="StackLayout">
+        <Setter Property="Orientation" Value="Horizontal" />
+        <Setter Property="HorizontalOptions" Value="FillAndExpand" />
+        <Setter Property="VerticalOptions" Value="Center" />
+    </Style>
+    
+    <DataTemplate x:Key="TrackViewCellDataTemplate">
+        <ViewCell>
+            <StackLayout Style="{StaticResource TrackViewCellStyle}">
+                <StackLayout WidthRequest="30" Orientation="Horizontal" VerticalOptions="Center">
+                    <Button Style="{StaticResource CheckedTrackStyle}" IsVisible="{Binding Selected}" />
+                </StackLayout>
+                <StackLayout Orientation="Horizontal" VerticalOptions="Center">
+                    <Label Style="{StaticResource TrackNameLabelStyle}" Text="{Binding Name}" />
+                </StackLayout>
+            </StackLayout>
+        </ViewCell>
+    </DataTemplate>
+
+    <Style x:Key="PlaybackControlsStyle" TargetType="TemplatedView">
+        <Setter Property="ControlTemplate">
+            <ControlTemplate>
+                <Grid>
+                    <StackLayout IsVisible="{TemplateBinding MediaPlayer, Converter={StaticResource ObjectToBoolConverter}}" Spacing="0">
+                        <Label Text="{TemplateBinding ErrorMessage}" Style="{TemplateBinding MessageStyle}"
+                       IsVisible="{TemplateBinding ErrorMessage, Converter={StaticResource ObjectToBoolConverter}}" />
+                        <ProgressBar Style="{TemplateBinding BufferingProgressBarStyle}" Progress="{TemplateBinding BufferingProgress}" 
+                             IsVisible="{TemplateBinding BufferingProgress, Converter={StaticResource BufferingProgressToBoolConverter}}" />
+                        <Label x:Name="AspectRatioLabel" Style="{TemplateBinding MessageStyle}"/>
+                        <!-- ControlsPanel -->
+                        <StackLayout x:Name="ControlsPanel" Style="{TemplateBinding ControlsPanelStyle}">
+                            <StackLayout Orientation="Horizontal" >
+                                <StackLayout Orientation="Horizontal" HorizontalOptions="Start">
+                                    <Label x:Name="ElapsedTimeLabel" Style="{TemplateBinding ElapsedTimeLabelStyle}"/>
+                                </StackLayout>
+                                <StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand">
+                                    <Label x:Name="RemainingTimeLabel" Style="{TemplateBinding RemainingTimeLabelStyle}"/>
+                                </StackLayout>
+                            </StackLayout>
+                            <StackLayout Orientation="Horizontal" IsVisible="{TemplateBinding IsSeekBarVisible}" Spacing="0">
+                                <Slider x:Name="SeekBar" Style="{TemplateBinding SeekBarStyle}" />
+                            </StackLayout>
+                            <StackLayout x:Name="ButtonBar" Orientation="Horizontal" Style="{TemplateBinding ButtonBarStyle}">
+                                <StackLayout Orientation="Horizontal" HorizontalOptions="Start" VerticalOptions="Center">
+                                    <Button x:Name="TracksButton" Style="{StaticResource TracksButtonStyle}" />
+                                    <Button x:Name="LockButton" Style="{StaticResource LockButtonStyle}" />
+                                </StackLayout>
+                                <ContentPresenter Content="{TemplateBinding ButtonBarStartArea}" HorizontalOptions="Start" VerticalOptions="Center" />
+                                <StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand" VerticalOptions="Center">
+                                    <Button x:Name="RewindButton" Style="{TemplateBinding RewindButtonStyle}" />
+                                    <Button x:Name="PlayPauseButton" Style="{TemplateBinding PlayPauseButtonStyle}" />
+                                    <Button x:Name="StopButton" Style="{TemplateBinding StopButtonStyle}" />
+                                    <Button x:Name="SeekButton" Style="{TemplateBinding SeekButtonStyle}" />
+                                </StackLayout>
+                                <ContentPresenter Content="{TemplateBinding ButtonBarEndArea}" HorizontalOptions="End" VerticalOptions="Center" />
+                                <StackLayout Orientation="Horizontal" HorizontalOptions="End" VerticalOptions="Center">
+                                    <Button x:Name="AspectRatioButton" Style="{TemplateBinding AspectRatioButtonStyle}" />
+                                    <Button x:Name="CastButton" Style="{TemplateBinding CastButtonStyle}" />
+                                </StackLayout>
+                            </StackLayout>
+                        </StackLayout>
+
+                        <!--  Unlock Control View  -->
+                        <StackLayout x:Name="UnLockControlsPanel" Style="{TemplateBinding UnLockControlsPanelStyle}" IsVisible="False">
+                            <local:SwipeToUnLockView x:Name="SwipeToUnLock" HeightRequest="60" VerticalOptions="Center">
+                                <local:SwipeToUnLockView.Thumb>
+                                    <Button IsVisible="True" Style="{StaticResource UnLockButtonStyle}" />
+                                </local:SwipeToUnLockView.Thumb>
+
+                                <local:SwipeToUnLockView.TrackBar>
+                                    <Frame Padding="0" BackgroundColor="#1C1C1C" CornerRadius="30" HasShadow="false">
+                                        <Label HorizontalOptions="CenterAndExpand" x:Name="TrackBarLabel" TextColor="White" VerticalOptions="CenterAndExpand" />
+                                    </Frame>
+                                </local:SwipeToUnLockView.TrackBar>
+
+                                <local:SwipeToUnLockView.FillBar>
+                                    <Frame Padding="0" BackgroundColor="#1C1C1C" CornerRadius="20" HasShadow="false" />
+                                </local:SwipeToUnLockView.FillBar>
+                            </local:SwipeToUnLockView>
+                        </StackLayout>
+                    </StackLayout>
+
+                    <!-- Overlay -->
+                    <ContentView HeightRequest="300" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" x:Name="TracksOverlayView" AbsoluteLayout.LayoutBounds="0, 0, 1, 1"  AbsoluteLayout.LayoutFlags="All" IsVisible="False" BackgroundColor="#7F000000">
+                        <ScrollView VerticalScrollBarVisibility="Never" HorizontalOptions="FillAndExpand" VerticalOptions="Fill" Orientation="Vertical">
+                            <Grid>
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="Auto" />
+                                    <RowDefinition Height="Auto" />
+                                    <RowDefinition Height="Auto" />
+                                </Grid.RowDefinitions>
+                                <StackLayout Grid.Row="0" HorizontalOptions="FillAndExpand">
+                                    <Label Style="{StaticResource TrackTypeLabelStyle}" x:Name="AudioTracksLabel" />
+                                    <ListView x:Name="AudioTracksListView" ItemTemplate="{StaticResource TrackViewCellDataTemplate}" Style="{StaticResource TracksListViewStyle}" />
+                                </StackLayout>
+                                <StackLayout Grid.Row="1" HorizontalOptions="FillAndExpand">
+                                    <Label Style="{StaticResource TrackTypeLabelStyle}" x:Name="VideoTracksLabel" />
+                                    <ListView x:Name="VideoTracksListView" ItemTemplate="{StaticResource TrackViewCellDataTemplate}" Style="{StaticResource TracksListViewStyle}" />
+                                </StackLayout>
+                                <StackLayout Grid.Row="2" HorizontalOptions="FillAndExpand">
+                                    <Label Style="{StaticResource TrackTypeLabelStyle}" x:Name="SubtileTracksLabel" />
+                                    <ListView x:Name="SubtitlesTracksListView" ItemTemplate="{StaticResource TrackViewCellDataTemplate}" Style="{StaticResource TracksListViewStyle}" />
+                                </StackLayout>
+                            </Grid>
+                        </ScrollView>
+                    </ContentView>
+                </Grid>
+            </ControlTemplate>
+        </Setter>
+    </Style>
+</ResourceDictionary>
diff --git a/src/LibVLCSharp.MAUI/Themes/Generic.xaml.cs b/src/LibVLCSharp.MAUI/Themes/Generic.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c137b0776cb818a592a20cfc5a4d644730aa207d
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/Themes/Generic.xaml.cs
@@ -0,0 +1,15 @@
+namespace LibVLCSharp.MAUI.Themes;
+
+/// <summary>
+/// Represents the generic theme resource dictionary for the MAUI components.
+/// </summary>
+public partial class Generic : ResourceDictionary
+{
+    /// <summary>
+    /// Initializes a new instance of the <see cref="Generic"/> class and loads the theme resources.
+    /// </summary>
+    public Generic()
+	{
+		InitializeComponent();
+	}
+}
diff --git a/src/LibVLCSharp.MAUI/TrackViewModel.cs b/src/LibVLCSharp.MAUI/TrackViewModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b89bafcea4060123adda30fafa277ecf480c342e
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/TrackViewModel.cs
@@ -0,0 +1,55 @@
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+
+namespace LibVLCSharp.MAUI
+{
+    /// <summary>
+    /// Defines the <see cref="TrackViewModel" />.
+    /// </summary>
+    public class TrackViewModel : INotifyPropertyChanged
+    {
+        /// <summary>
+        /// Track description Id
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// Track description
+        /// </summary>
+        public string Name { get; set; }
+        
+        private bool selected = false;
+        /// <summary>
+        /// The track is selected or not.
+        /// </summary>
+        public bool Selected
+        {
+            get { return selected; }
+            set
+            {
+                selected = value;
+                NotifyPropertyChanged();
+            }
+        }
+
+        /// <summary>
+        /// TrackViewModel constructor
+        /// </summary>
+        /// <param name="id">Track description Id</param>
+        /// <param name="name">Track description</param>
+        internal TrackViewModel(int id, string name)
+        {
+            Id = id;
+            Name = name;
+        }
+
+        /// <summary>
+        /// Occurs when a property value changes
+        /// </summary>
+        public event PropertyChangedEventHandler? PropertyChanged;
+        private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
+        {
+            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+        }
+    }
+}
diff --git a/src/LibVLCSharp.MAUI/VideoView.cs b/src/LibVLCSharp.MAUI/VideoView.cs
index 6b02092e41d713db6fdc141da8171b1d86d6a469..740f24c68721a596bc4c24a948ecf525146b6dd5 100644
--- a/src/LibVLCSharp.MAUI/VideoView.cs
+++ b/src/LibVLCSharp.MAUI/VideoView.cs
@@ -7,7 +7,7 @@ namespace LibVLCSharp.MAUI
     /// <summary>
     /// Generic MAUI VideoView
     /// </summary>
-    public class VideoView : View//, IVideoControl
+    public class VideoView : View, IVideoControl
     {
         /// <summary>
         /// Raised when a new MediaPlayer is set and will be attached to the view
diff --git a/src/LibVLCSharp.MAUI/VideoViewHandler.cs b/src/LibVLCSharp.MAUI/VideoViewHandler.cs
index f6b06b172a21e233e2902a4b309a40e284c04c8d..73633a15c1140bb843f957083f53c1016a7acddf 100644
--- a/src/LibVLCSharp.MAUI/VideoViewHandler.cs
+++ b/src/LibVLCSharp.MAUI/VideoViewHandler.cs
@@ -18,7 +18,7 @@ namespace LibVLCSharp.MAUI
         /// <summary>
         /// 
         /// </summary>
-        public VideoViewHandler() : base(PropertyMapper, null)
+        public VideoViewHandler() : base(PropertyMapper)
         {
         }
 
diff --git a/src/LibVLCSharp.MAUI/VisualTreeHelper.cs b/src/LibVLCSharp.MAUI/VisualTreeHelper.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fa8e1ab5bc2dbbfba127ea56e3449ce147e798aa
--- /dev/null
+++ b/src/LibVLCSharp.MAUI/VisualTreeHelper.cs
@@ -0,0 +1,85 @@
+using System.Collections.Generic;
+using Microsoft.Maui;
+using Microsoft.Maui.Controls;
+
+namespace LibVLCSharp.MAUI
+{
+    internal static class VisualTreeHelper
+    {
+        internal static T? FindChild<T>(this IElement parent) where T : IElement
+        {
+            foreach (var child in GetVisualChildren(parent))
+            {
+                if (child is T result)
+                {
+                    return result;
+                }
+
+                var childResult = FindChild<T>(child);
+                if (childResult != null)
+                {
+                    return childResult;
+                }
+            }
+            return default;
+        }
+
+        internal static T? FindChild<T>(this IElement parent, string name) where T : IElement
+        {
+            foreach (var child in GetVisualChildren(parent))
+            {
+                if (child is Element element && element.StyleId == name && child is T result)
+                {
+                    return result;
+                }
+
+                var childResult = FindChild<T>(child, name);
+                if (childResult != null)
+                {
+                    return childResult;
+                }
+            }
+            return default;
+        }
+
+        internal static T? FindAncestor<T>(this IElement? element) where T : IElement
+        {
+            while (element != null)
+            {
+                element = element.Parent;
+                if (element is T ancestor)
+                {
+                    return ancestor;
+                }
+            }
+            return default;
+        }
+
+        private static IEnumerable<IElement> GetVisualChildren(IElement parent)
+        {
+            if (parent is IContentView contentView && contentView.PresentedContent is IElement contentElement)
+            {
+                yield return contentElement;
+            }
+
+            if (parent is Layout layout)
+            {
+                foreach (var child in layout.Children)
+                {
+                    yield return child;
+                }
+            }
+
+            if (parent is IVisualTreeElement visualTreeElement)
+            {
+                foreach (var child in visualTreeElement.GetVisualChildren())
+                {
+                    if (child is IElement elementChild)
+                    {
+                        yield return elementChild;
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/LibVLCSharp.Mac.sln b/src/LibVLCSharp.Mac.sln
index 408190644064ce6e18bea1db9d6c1ba99f416a6d..c15c0827c13ad674f2c7526a4daec274c0219d2d 100644
--- a/src/LibVLCSharp.Mac.sln
+++ b/src/LibVLCSharp.Mac.sln
@@ -11,7 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
 		global.json = global.json
 	EndProjectSection
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "..\samples", "{799A84A2-2161-4676-878B-5610E3586137}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{799A84A2-2161-4676-878B-5610E3586137}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Forms", "Forms", "{FC68D8B7-758E-4164-945B-9F922FA883F6}"
 EndProject
@@ -23,9 +23,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Avalonia", "Lib
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MediaElement", "MediaElement", "{5E512888-485B-438A-AA4A-1B1EF50FD49F}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Forms.MediaElement.Sample", "..\samples\Forms\LibVLCSharp.Forms.MediaElement\LibVLCSharp.Forms.Sample.MediaElement\LibVLCSharp.Forms.Sample.MediaElement.csproj", "{537A70A3-6565-41E2-8C65-5198E0F4EB45}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Forms.Sample.MediaElement", "..\samples\Forms\LibVLCSharp.Forms.MediaElement\LibVLCSharp.Forms.Sample.MediaElement\LibVLCSharp.Forms.Sample.MediaElement.csproj", "{537A70A3-6565-41E2-8C65-5198E0F4EB45}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibVLCSharp.Forms.MediaElement.Sample.iOS", "..\samples\Forms\LibVLCSharp.Forms.MediaElement\LibVLCSharp.Forms.Sample.MediaElement.iOS\LibVLCSharp.Forms.Sample.MediaElement.iOS.csproj", "{6C9DE381-A32F-41CB-BCDA-551BE90B5A60}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibVLCSharp.Forms.Sample.MediaElement.iOS", "..\samples\Forms\LibVLCSharp.Forms.MediaElement\LibVLCSharp.Forms.Sample.MediaElement.iOS\LibVLCSharp.Forms.Sample.MediaElement.iOS.csproj", "{6C9DE381-A32F-41CB-BCDA-551BE90B5A60}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Uno", "LibVLCSharp.Uno\LibVLCSharp.Uno.csproj", "{82AB6F00-B0CC-4B88-8D09-CD95789E6C38}"
 EndProject
@@ -33,9 +33,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Uno", "Uno", "{AF7576D5-F1E
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MediaPlayerElement", "MediaPlayerElement", "{A5558B4F-67BD-4FDC-82F5-D82A6564CD7B}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibVLCSharp.Avalonia.Sample", "..\samples\LibVLCSharp.Avalonia.Sample\LibVLCSharp.Avalonia.Sample.csproj", "{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Avalonia.Sample", "..\samples\LibVLCSharp.Avalonia.Sample\LibVLCSharp.Avalonia.Sample.csproj", "{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}"
 EndProject
-Global	
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.MAUI", "LibVLCSharp.MAUI\LibVLCSharp.MAUI.csproj", "{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}"
+EndProject
+Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
 		Ad-Hoc|ARM = Ad-Hoc|ARM
@@ -123,210 +125,6 @@ Global
 		{D1C3B7C4-713B-46B2-B33A-E9298C819921}.Release|x64.Build.0 = Release|Any CPU
 		{D1C3B7C4-713B-46B2-B33A-E9298C819921}.Release|x86.ActiveCfg = Release|Any CPU
 		{D1C3B7C4-713B-46B2-B33A-E9298C819921}.Release|x86.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|ARM64.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|ARM64.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|Any CPU.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|ARM.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|ARM.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|ARM64.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|ARM64.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|iPhone.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|x64.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|x64.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|x86.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.AppStore|x86.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|ARM.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|ARM.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|ARM64.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|ARM64.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|x64.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Debug|x86.Build.0 = Debug|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|Any CPU.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|ARM.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|ARM.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|ARM64.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|ARM64.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|iPhone.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|x64.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|x64.Build.0 = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|x86.ActiveCfg = Release|Any CPU
-		{06814458-C8B4-4D50-86E2-904E6A9E3499}.Release|x86.Build.0 = Release|Any CPU
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|ARM64.ActiveCfg = Ad-Hoc|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|ARM.ActiveCfg = AppStore|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|ARM64.ActiveCfg = AppStore|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|iPhone.Build.0 = AppStore|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|x64.ActiveCfg = AppStore|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.AppStore|x86.ActiveCfg = AppStore|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|Any CPU.ActiveCfg = Debug|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|ARM.ActiveCfg = Debug|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|ARM64.ActiveCfg = Debug|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|iPhone.ActiveCfg = Debug|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|iPhone.Build.0 = Debug|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|x64.ActiveCfg = Debug|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Debug|x86.ActiveCfg = Debug|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|Any CPU.ActiveCfg = Release|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|ARM.ActiveCfg = Release|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|ARM64.ActiveCfg = Release|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|iPhone.ActiveCfg = Release|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|iPhone.Build.0 = Release|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|x64.ActiveCfg = Release|iPhone
-		{D2486BCF-A218-4181-B1F8-E6D46DCADCDC}.Release|x86.ActiveCfg = Release|iPhone
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|ARM64.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|ARM64.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|Any CPU.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|ARM.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|ARM.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|ARM64.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|ARM64.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|iPhone.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|iPhone.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|x64.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|x64.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|x86.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.AppStore|x86.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|ARM.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|ARM.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|ARM64.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|ARM64.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|x64.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Debug|x86.Build.0 = Debug|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|Any CPU.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|ARM.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|ARM.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|ARM64.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|ARM64.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|iPhone.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|x64.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|x64.Build.0 = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|x86.ActiveCfg = Release|Any CPU
-		{AD3A4C86-1839-4C42-9EB6-24CDA0DE30F9}.Release|x86.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|ARM64.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|ARM64.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|x64.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Ad-Hoc|x86.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|Any CPU.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|ARM.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|ARM.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|ARM64.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|ARM64.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|iPhone.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|iPhone.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|x64.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|x64.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|x86.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.AppStore|x86.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|ARM.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|ARM.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|ARM64.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|ARM64.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|x64.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Debug|x86.Build.0 = Debug|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|Any CPU.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|ARM.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|ARM.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|ARM64.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|ARM64.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|iPhone.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|x64.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|x64.Build.0 = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|x86.ActiveCfg = Release|Any CPU
-		{239A82A5-19A1-4382-8F9B-4A9705648017}.Release|x86.Build.0 = Release|Any CPU
 		{3F958392-C1A0-407C-AC76-0926F8D0BCCA}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
 		{3F958392-C1A0-407C-AC76-0926F8D0BCCA}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
 		{3F958392-C1A0-407C-AC76-0926F8D0BCCA}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
@@ -439,6 +237,62 @@ Global
 		{9012B90D-A997-4E1B-B541-C824E4E6540F}.Release|x64.Build.0 = Release|Any CPU
 		{9012B90D-A997-4E1B-B541-C824E4E6540F}.Release|x86.ActiveCfg = Release|Any CPU
 		{9012B90D-A997-4E1B-B541-C824E4E6540F}.Release|x86.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM64.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM64.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM64.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM64.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhone.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x64.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x64.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x86.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x86.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhone.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x64.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x86.Build.0 = Debug|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM64.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM64.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhone.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhone.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x64.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x64.Build.0 = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x86.ActiveCfg = Release|Any CPU
+		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x86.Build.0 = Release|Any CPU
 		{537A70A3-6565-41E2-8C65-5198E0F4EB45}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
 		{537A70A3-6565-41E2-8C65-5198E0F4EB45}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
 		{537A70A3-6565-41E2-8C65-5198E0F4EB45}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
@@ -587,63 +441,6 @@ Global
 		{82AB6F00-B0CC-4B88-8D09-CD95789E6C38}.Release|x64.Build.0 = Release|Any CPU
 		{82AB6F00-B0CC-4B88-8D09-CD95789E6C38}.Release|x86.ActiveCfg = Release|Any CPU
 		{82AB6F00-B0CC-4B88-8D09-CD95789E6C38}.Release|x86.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM64.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|ARM64.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|Any CPU.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM64.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|ARM64.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhone.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x64.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x64.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x86.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.AppStore|x86.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM64.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|ARM64.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x64.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Debug|x86.Build.0 = Debug|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|Any CPU.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM64.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|ARM64.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhone.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x64.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x64.Build.0 = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x86.ActiveCfg = Release|Any CPU
-		{59184DC2-9F32-4CC3-852F-75348D14F5DA}.Release|x86.Build.0 = Release|Any CPU
-		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
 		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
 		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
 		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
@@ -700,18 +497,74 @@ Global
 		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}.Release|x64.Build.0 = Release|Any CPU
 		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}.Release|x86.ActiveCfg = Release|Any CPU
 		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2}.Release|x86.Build.0 = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|ARM64.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|ARM64.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|ARM.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|ARM.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|ARM64.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|ARM64.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|iPhone.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|x64.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|x64.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|x86.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.AppStore|x86.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|ARM.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|ARM.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|iPhone.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|x64.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Debug|x86.Build.0 = Debug|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|ARM.ActiveCfg = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|ARM.Build.0 = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|ARM64.ActiveCfg = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|ARM64.Build.0 = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|iPhone.ActiveCfg = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|iPhone.Build.0 = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|x64.ActiveCfg = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|x64.Build.0 = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|x86.ActiveCfg = Release|Any CPU
+		{5FFCADC1-AAE7-4E01-B875-0D3F8A1AC2F5}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2} = {799A84A2-2161-4676-878B-5610E3586137}
 		{FC68D8B7-758E-4164-945B-9F922FA883F6} = {799A84A2-2161-4676-878B-5610E3586137}
 		{5E512888-485B-438A-AA4A-1B1EF50FD49F} = {FC68D8B7-758E-4164-945B-9F922FA883F6}
 		{537A70A3-6565-41E2-8C65-5198E0F4EB45} = {5E512888-485B-438A-AA4A-1B1EF50FD49F}
 		{6C9DE381-A32F-41CB-BCDA-551BE90B5A60} = {5E512888-485B-438A-AA4A-1B1EF50FD49F}
 		{AF7576D5-F1E9-4E7B-93CE-538BBBB4442E} = {799A84A2-2161-4676-878B-5610E3586137}
 		{A5558B4F-67BD-4FDC-82F5-D82A6564CD7B} = {AF7576D5-F1E9-4E7B-93CE-538BBBB4442E}
+		{4B5837B1-CEA4-47F8-AB7A-1CF8704654A2} = {799A84A2-2161-4676-878B-5610E3586137}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {AB1424F9-871B-444A-9278-18227672889C}
diff --git a/src/LibVLCSharp.sln b/src/LibVLCSharp.sln
index e64e256ae3b0ee716884dd07e521970c86b4decf..367b2cadeb7dadd183160955fe7f3d8a4ec54df4 100644
--- a/src/LibVLCSharp.sln
+++ b/src/LibVLCSharp.sln
@@ -75,7 +75,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Eto", "LibVLCSh
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Eto.Sample", "..\samples\LibVLCSharp.Eto.Sample\LibVLCSharp.Eto.Sample.csproj", "{1F054095-0C60-4CFD-BAC2-77A7652DAD77}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibVLCSharp.WinUI.Sample", "..\samples\LibVLCSharp.WinUI.Sample\LibVLCSharp.WinUI.Sample.csproj", "{112D3AB4-D55A-4D32-8949-97AFA711FB6A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.WinUI.Sample", "..\samples\LibVLCSharp.WinUI.Sample\LibVLCSharp.WinUI.Sample.csproj", "{112D3AB4-D55A-4D32-8949-97AFA711FB6A}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.MAUI.Sample", "..\samples\LibVLCSharp.MAUI.Sample\LibVLCSharp.MAUI.Sample.csproj", "{9CC44799-DDB0-45C1-A7E8-5E620EEA121A}"
 EndProject
@@ -85,6 +85,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Android.AWindow
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Uno.WinUI.Sample", "..\samples\Uno\LibVLCSharp.Uno.WinUI.Sample\LibVLCSharp.Uno.WinUI.Sample.csproj", "{37E514D5-F179-4B1C-9AB6-88C7FA852C1B}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MAUI", "MAUI", "{9421ECDD-D883-447F-AF47-B45E5543AC74}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MediaElement", "MediaElement", "{6B53AD28-A5C3-4E0A-9C34-36D26A1AF51A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.MAUI.Sample.MediaElement", "..\samples\MAUI\LibVLCSharp.MAUI.Sample.MediaElement\LibVLCSharp.MAUI.Sample.MediaElement.csproj", "{60CD6576-36E7-43AD-9C1F-9E398E61D899}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -2072,6 +2078,90 @@ Global
 		{37E514D5-F179-4B1C-9AB6-88C7FA852C1B}.Release|x64.Build.0 = Release|Any CPU
 		{37E514D5-F179-4B1C-9AB6-88C7FA852C1B}.Release|x86.ActiveCfg = Release|Any CPU
 		{37E514D5-F179-4B1C-9AB6-88C7FA852C1B}.Release|x86.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|Any CPU.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|ARM.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|ARM64.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|ARM64.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|ARM64.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|iPhone.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|x64.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Ad-Hoc|x86.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|Any CPU.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|ARM.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|ARM.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|ARM.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|ARM64.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|ARM64.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|ARM64.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|iPhone.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|iPhone.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|x64.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|x64.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|x64.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|x86.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|x86.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.AppStore|x86.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|ARM.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|ARM.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|ARM.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|ARM64.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|iPhone.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|x64.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|x64.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|x86.Build.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Debug|x86.Deploy.0 = Debug|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|Any CPU.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|Any CPU.Deploy.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|ARM.ActiveCfg = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|ARM.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|ARM.Deploy.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|ARM64.ActiveCfg = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|ARM64.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|ARM64.Deploy.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|iPhone.ActiveCfg = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|iPhone.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|iPhone.Deploy.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|x64.ActiveCfg = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|x64.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|x64.Deploy.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|x86.ActiveCfg = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|x86.Build.0 = Release|Any CPU
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899}.Release|x86.Deploy.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -2100,6 +2190,9 @@ Global
 		{112D3AB4-D55A-4D32-8949-97AFA711FB6A} = {799A84A2-2161-4676-878B-5610E3586137}
 		{9CC44799-DDB0-45C1-A7E8-5E620EEA121A} = {799A84A2-2161-4676-878B-5610E3586137}
 		{37E514D5-F179-4B1C-9AB6-88C7FA852C1B} = {AF7576D5-F1E9-4E7B-93CE-538BBBB4442E}
+		{9421ECDD-D883-447F-AF47-B45E5543AC74} = {799A84A2-2161-4676-878B-5610E3586137}
+		{6B53AD28-A5C3-4E0A-9C34-36D26A1AF51A} = {9421ECDD-D883-447F-AF47-B45E5543AC74}
+		{60CD6576-36E7-43AD-9C1F-9E398E61D899} = {6B53AD28-A5C3-4E0A-9C34-36D26A1AF51A}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {AB1424F9-871B-444A-9278-18227672889C}
diff --git a/src/LibVLCSharp/Properties/AssemblyInfo.cs b/src/LibVLCSharp/Properties/AssemblyInfo.cs
index 56536501ee066e23a5830f3c71559ce9b3b3eb95..e903687d13df93ce6db403f601bbfec887a4982d 100644
--- a/src/LibVLCSharp/Properties/AssemblyInfo.cs
+++ b/src/LibVLCSharp/Properties/AssemblyInfo.cs
@@ -1,4 +1,5 @@
 using System.Runtime.CompilerServices;
 
 [assembly: InternalsVisibleTo("LibVLCSharp.Forms")]
+[assembly: InternalsVisibleTo("LibVLCSharp.MAUI")]
 [assembly: InternalsVisibleTo("LibVLCSharp.Uno")]
diff --git a/src/LibVLCSharp/Shared/MediaPlayerElement/SeekBarManager.cs b/src/LibVLCSharp/Shared/MediaPlayerElement/SeekBarManager.cs
index 223d2e0073dc246462261d5659005268868ae125..773b0b29f1643916bba37d3eeb3590af44307d01 100644
--- a/src/LibVLCSharp/Shared/MediaPlayerElement/SeekBarManager.cs
+++ b/src/LibVLCSharp/Shared/MediaPlayerElement/SeekBarManager.cs
@@ -9,6 +9,17 @@ namespace LibVLCSharp.Shared.MediaPlayerElement
     /// <remarks>the <see cref="MediaPlayerElementManagerBase.MediaPlayer"/> property needs to be set in order to work</remarks>
     internal class SeekBarManager : MediaPlayerElementManagerBase
     {
+        private bool isDragging = false;
+
+        /// <summary>
+        /// Gets or sets a value indicating whether the seek bar is being dragged by the user.
+        /// </summary>
+        public bool IsDragging
+        {
+            get => isDragging;
+            set => isDragging = value;
+        }
+
         /// <summary>
         /// Occurs when the media position changes
         /// </summary>
@@ -111,9 +122,13 @@ namespace LibVLCSharp.Shared.MediaPlayerElement
             });
         }
 
-        private Task OnPositionChangedAsync()
+        private async Task OnPositionChangedAsync()
         {
-            return DispatcherInvokeEventHandlerAsync(PositionChanged);
+            // Fire event only when not seeking manually
+            if (!isDragging)
+            {
+                await DispatcherInvokeEventHandlerAsync(PositionChanged);
+            }
         }
 
         private async Task UpdateSeekableAndPositionAsync()