diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
new file mode 100644
index 0000000..264c97c
--- /dev/null
+++ b/.github/workflows/dotnet.yml
@@ -0,0 +1,25 @@
+name: .NET
+
+on:
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+
+jobs:
+  build:
+
+    runs-on: windows-latest
+
+    steps:
+    - uses: actions/checkout@v2
+    - name: Setup .NET
+      uses: actions/setup-dotnet@v1
+      with:
+        dotnet-version: 5.0.x
+    - name: Restore dependencies
+      run: dotnet restore ComPortProxy/ComPortProxy.sln
+    - name: Build
+      run: dotnet build ComPortProxy/ComPortProxy.sln --no-restore
+    - name: Test
+      run: dotnet test ComPortProxy/ComPortProxy.sln --no-build --verbosity normal
diff --git a/ComPortProxy.sln b/ComPortProxy.sln
deleted file mode 100644
index 39182cc..0000000
--- a/ComPortProxy.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27428.2015
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPortProxy", "ComPortProxy\ComPortProxy.csproj", "{E6BC9FA3-FF5D-4DB1-8977-E1BC3030C44B}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{E6BC9FA3-FF5D-4DB1-8977-E1BC3030C44B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{E6BC9FA3-FF5D-4DB1-8977-E1BC3030C44B}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{E6BC9FA3-FF5D-4DB1-8977-E1BC3030C44B}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{E6BC9FA3-FF5D-4DB1-8977-E1BC3030C44B}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {4DA8F254-EFF5-4E65-A7E4-8FB6CB64213A}
-	EndGlobalSection
-EndGlobal
diff --git a/ComPortProxy/ComPortProxy.Ui/App.config b/ComPortProxy/ComPortProxy.Ui/App.config
index 38f8e99..640de42 100644
--- a/ComPortProxy/ComPortProxy.Ui/App.config
+++ b/ComPortProxy/ComPortProxy.Ui/App.config
@@ -1,20 +1,20 @@
-
+
 
     
-        
-            
+        
+            
         
     
      
-        
+        
     
     
         
             
-                
+                
             
             
-                
+                
             
             
                 9600
@@ -24,4 +24,4 @@
             
         
     
-
\ No newline at end of file
+
diff --git a/ComPortProxy/ComPortProxy.Ui/ComPortProxy.Ui.csproj b/ComPortProxy/ComPortProxy.Ui/ComPortProxy.Ui.csproj
index 70b470f..78db8e5 100644
--- a/ComPortProxy/ComPortProxy.Ui/ComPortProxy.Ui.csproj
+++ b/ComPortProxy/ComPortProxy.Ui/ComPortProxy.Ui.csproj
@@ -1,88 +1,29 @@
-
-
-  
+
   
-    Debug
-    AnyCPU
-    {8CE00435-832D-4F12-BFFD-8E696DD715E9}
+    net5.0-windows
     WinExe
-    ComPortProxy.Ui
-    ComPortProxy.Ui
-    v4.6.1
-    512
-    true
-  
-  
-    AnyCPU
-    true
-    full
-    false
-    bin\Debug\
-    DEBUG;TRACE
-    prompt
-    4
-  
-  
-    AnyCPU
-    pdbonly
-    true
-    bin\Release\
-    TRACE
-    prompt
-    4
+    false
+    true
   
   
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
+    
+    
+    
   
   
-    
-      Form
-    
-    
-      FormMain.cs
-    
-    
-    
-    
-      FormMain.cs
-    
-    
-      ResXFileCodeGenerator
-      Resources.Designer.cs
-      Designer
-    
-    
-      True
-      Resources.resx
-    
-    
-      SettingsSingleFileGenerator
-      Settings.Designer.cs
-    
-    
+    
+  
+  
+    
+      True
       True
       Settings.settings
-      True
     
   
   
-    
-  
-  
-    
-      {68018e31-6ee4-4357-85bc-f0ffdf23a5f3}
-      ComPortProxy
-    
+    
+      SettingsSingleFileGenerator
+      Settings.Designer.cs
+    
   
-  
 
\ No newline at end of file
diff --git a/ComPortProxy/ComPortProxy.Ui/FormMain.cs b/ComPortProxy/ComPortProxy.Ui/FormMain.cs
index 625feec..f589b34 100644
--- a/ComPortProxy/ComPortProxy.Ui/FormMain.cs
+++ b/ComPortProxy/ComPortProxy.Ui/FormMain.cs
@@ -4,7 +4,6 @@
 using System.IO.Ports;
 using System.Linq;
 using System.Text;
-using System.Threading;
 using System.Windows.Forms;
 
 namespace ComPortProxy.Ui {
diff --git a/ComPortProxy/ComPortProxy.Ui/Properties/Resources.Designer.cs b/ComPortProxy/ComPortProxy.Ui/Properties/Resources.Designer.cs
index 32c1af2..98ceee3 100644
--- a/ComPortProxy/ComPortProxy.Ui/Properties/Resources.Designer.cs
+++ b/ComPortProxy/ComPortProxy.Ui/Properties/Resources.Designer.cs
@@ -9,8 +9,9 @@
 //------------------------------------------------------------------------------
 
 namespace ComPortProxy.Ui.Properties {
-
-
+    using System;
+    
+    
     /// 
     ///   A strongly-typed resource class, for looking up localized strings, etc.
     /// 
@@ -18,48 +19,43 @@ namespace ComPortProxy.Ui.Properties {
     // 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", "4.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     internal class Resources {
-
+        
         private static global::System.Resources.ResourceManager resourceMan;
-
+        
         private static global::System.Globalization.CultureInfo resourceCulture;
-
+        
         [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
         internal Resources() {
         }
-
+        
         /// 
         ///   Returns the cached ResourceManager instance used by this class.
         /// 
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Resources.ResourceManager ResourceManager
-        {
-            get
-            {
-                if ((resourceMan == null)) {
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ComPortProxy.Ui.Properties.Resources", typeof(Resources).Assembly);
                     resourceMan = temp;
                 }
                 return resourceMan;
             }
         }
-
+        
         /// 
         ///   Overrides the current thread's CurrentUICulture property for all
         ///   resource lookups using this strongly typed resource class.
         /// 
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Globalization.CultureInfo Culture
-        {
-            get
-            {
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
                 return resourceCulture;
             }
-            set
-            {
+            set {
                 resourceCulture = value;
             }
         }
diff --git a/ComPortProxy/ComPortProxy.Ui/Properties/Settings.Designer.cs b/ComPortProxy/ComPortProxy.Ui/Properties/Settings.Designer.cs
index c7ad4e3..ce4a0d1 100644
--- a/ComPortProxy/ComPortProxy.Ui/Properties/Settings.Designer.cs
+++ b/ComPortProxy/ComPortProxy.Ui/Properties/Settings.Designer.cs
@@ -12,7 +12,7 @@ namespace ComPortProxy.Ui.Properties {
     
     
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.6.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")]
     internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
         
         private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
diff --git a/ComPortProxy/ComPortProxy/App.config b/ComPortProxy/ComPortProxy/App.config
deleted file mode 100644
index 731f6de..0000000
--- a/ComPortProxy/ComPortProxy/App.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-     
-        
-    
-
\ No newline at end of file
diff --git a/ComPortProxy/ComPortProxy/ComPortProxy.csproj b/ComPortProxy/ComPortProxy/ComPortProxy.csproj
index bdf7110..bedd51e 100644
--- a/ComPortProxy/ComPortProxy/ComPortProxy.csproj
+++ b/ComPortProxy/ComPortProxy/ComPortProxy.csproj
@@ -1,54 +1,13 @@
-
-
-  
+
   
-    Debug
-    AnyCPU
-    {68018E31-6EE4-4357-85BC-F0FFDF23A5F3}
+    net5.0-windows
     Exe
-    ComPortProxy
-    ComPortProxy
-    v4.6.1
-    512
-    true
+    false
+    true
   
-  
-    AnyCPU
-    true
-    full
-    false
-    bin\Debug\
-    DEBUG;TRACE
-    prompt
-    4
-  
-  
-    AnyCPU
-    pdbonly
-    true
-    bin\Release\
-    TRACE
-    prompt
-    4
-  
-  
-    
-    
-    
-    
-    
-    
-    
-    
-    
-  
-  
-    
-    
-    
-  
   
-    
+    
+    
+    
   
-  
 
\ No newline at end of file