diff --git a/EDSEditor.sln b/EDSEditor.sln
index 5b28768c..00abe8c3 100644
--- a/EDSEditor.sln
+++ b/EDSEditor.sln
@@ -14,6 +14,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EDSSharp", "EDSSharp\EDSSharp.csproj", "{8B7A7545-6257-44BF-8868-F429E1B72C77}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EDSEditorGUI2", "EDSEditorGUI2\EDSEditorGUI2.csproj", "{F175A47B-8BB8-480F-8D31-AF802086B8B4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUITests", "GUITests\GUITests.csproj", "{9B9B5461-1864-484D-A49D-D39422DA16E0}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -36,6 +40,14 @@ Global
{8B7A7545-6257-44BF-8868-F429E1B72C77}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8B7A7545-6257-44BF-8868-F429E1B72C77}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8B7A7545-6257-44BF-8868-F429E1B72C77}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F175A47B-8BB8-480F-8D31-AF802086B8B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F175A47B-8BB8-480F-8D31-AF802086B8B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F175A47B-8BB8-480F-8D31-AF802086B8B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F175A47B-8BB8-480F-8D31-AF802086B8B4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9B9B5461-1864-484D-A49D-D39422DA16E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9B9B5461-1864-484D-A49D-D39422DA16E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9B9B5461-1864-484D-A49D-D39422DA16E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9B9B5461-1864-484D-A49D-D39422DA16E0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/EDSEditorGUI2/.gitignore b/EDSEditorGUI2/.gitignore
new file mode 100644
index 00000000..fe7ab09c
--- /dev/null
+++ b/EDSEditorGUI2/.gitignore
@@ -0,0 +1,2 @@
+/obj/*
+/bin/*
diff --git a/EDSEditorGUI2/App.axaml b/EDSEditorGUI2/App.axaml
new file mode 100644
index 00000000..c1793b31
--- /dev/null
+++ b/EDSEditorGUI2/App.axaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EDSEditorGUI2/App.axaml.cs b/EDSEditorGUI2/App.axaml.cs
new file mode 100644
index 00000000..07140117
--- /dev/null
+++ b/EDSEditorGUI2/App.axaml.cs
@@ -0,0 +1,32 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Data.Core.Plugins;
+using Avalonia.Markup.Xaml;
+using EDSEditorGUI2.ViewModels;
+using EDSEditorGUI2.Views;
+
+namespace EDSEditorGUI2;
+
+public partial class App : Application
+{
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ // Line below is needed to remove Avalonia data validation.
+ // Without this line you will get duplicate validations from both Avalonia and CT
+ BindingPlugins.DataValidators.RemoveAt(0);
+ desktop.MainWindow = new MainWindow
+ {
+ DataContext = new MainWindowViewModel(),
+ };
+ }
+
+ base.OnFrameworkInitializationCompleted();
+ }
+}
\ No newline at end of file
diff --git a/EDSEditorGUI2/Assets/avalonia-logo.ico b/EDSEditorGUI2/Assets/avalonia-logo.ico
new file mode 100644
index 00000000..da8d49ff
Binary files /dev/null and b/EDSEditorGUI2/Assets/avalonia-logo.ico differ
diff --git a/EDSEditorGUI2/Converter/NewIndexMultiConvert.cs b/EDSEditorGUI2/Converter/NewIndexMultiConvert.cs
new file mode 100644
index 00000000..5a5b8d47
--- /dev/null
+++ b/EDSEditorGUI2/Converter/NewIndexMultiConvert.cs
@@ -0,0 +1,46 @@
+using Avalonia.Data;
+using Avalonia.Data.Converters;
+using Avalonia.Media.Immutable;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+
+namespace EDSEditorGUI2.Converter;
+
+public class NewIndexRequest(int index, string name, LibCanOpen.OdObject.Types.ObjectType type)
+{
+ public int Index { get; } = index;
+ public string Name { get; } = name;
+ public LibCanOpen.OdObject.Types.ObjectType Type { get; } = type;
+}
+
+public sealed class NewIndexMultiConvert : IMultiValueConverter
+{
+ public object? Convert(IList