diff --git a/.gitignore b/.gitignore
index 15cb0b0..5d8d82e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -192,3 +192,6 @@ ModelManifest.xml
 /.vs/slnx.sqlite
 /.vs
 /publish/Application Files/ScriptHelp_3_0_0_2/ApiHelp.shfbproj.deploy
+/VB/packages/log4net.2.0.8
+/CS/ServerActions/packages/log4net.2.0.8
+/CS/packages/log4net.2.0.8
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..9f1ab7b
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,92 @@
+# Contributing
+
+When contributing to this repository, please first discuss the change you wish to make via issue,
+email, or any other method with the owners of this repository before making a change. 
+
+Please note we have a code of conduct, please follow it in all your interactions with the project.
+
+## Pull Request Process
+
+1. Ensure any install or build dependencies are removed before the end of the layer when doing a 
+   build.
+2. Update the README.md with details of changes to the interface, this includes new environment 
+   variables, exposed ports, useful file locations and container parameters.
+3. Increase the version numbers in any examples files and the README.md to the new version that this
+   Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).
+4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you 
+   do not have permission to do that, you may request the second reviewer to merge it for you.
+
+## Code of Conduct
+
+### Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+### Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+### Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+### Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+### Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+### Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CS/AnthonyDuguid.pfx b/CS/AnthonyDuguid.pfx
new file mode 100644
index 0000000..153084e
Binary files /dev/null and b/CS/AnthonyDuguid.pfx differ
diff --git a/CS/Properties/AssemblyInfo.cs b/CS/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d82f726
--- /dev/null
+++ b/CS/Properties/AssemblyInfo.cs
@@ -0,0 +1,38 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Security;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Server Help")]
+[assembly: AssemblyDescription("Excel Addin Server Help")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Anthony Duguid")]
+[assembly: AssemblyProduct("ServerHelp")]
+[assembly: AssemblyCopyright("Anthony Duguid")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("6e6465d3-3b9d-4104-b4f9-c4efe7e12d28")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("2.0.0.2")]
+[assembly: AssemblyFileVersion("2.0.0.2")]
+
diff --git a/CS/Properties/Resources.Designer.cs b/CS/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..e593fa8
--- /dev/null
+++ b/CS/Properties/Resources.Designer.cs
@@ -0,0 +1,93 @@
+﻿//------------------------------------------------------------------------------
+// <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 ServerActions.Properties {
+    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", "4.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() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ServerActions.Properties.Resources", typeof(Resources).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)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap cmd {
+            get {
+                object obj = ResourceManager.GetObject("cmd", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap download {
+            get {
+                object obj = ResourceManager.GetObject("download", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap rdg {
+            get {
+                object obj = ResourceManager.GetObject("rdg", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
diff --git a/CS/Properties/Resources.resx b/CS/Properties/Resources.resx
new file mode 100644
index 0000000..79b89c7
--- /dev/null
+++ b/CS/Properties/Resources.resx
@@ -0,0 +1,130 @@
+﻿<?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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="cmd" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\cmd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="download" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="rdg" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\rdg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/CS/Properties/Settings.Designer.cs b/CS/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..b8e9ab5
--- /dev/null
+++ b/CS/Properties/Settings.Designer.cs
@@ -0,0 +1,205 @@
+﻿//------------------------------------------------------------------------------
+// <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 ServerActions.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("Anthony Duguid")]
+        public string App_Author {
+            get {
+                return ((string)(this["App_Author"]));
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("https://github.com/Excel-projects/Server-Help/issues/new")]
+        public string App_PathNewIssue {
+            get {
+                return ((string)(this["App_PathNewIssue"]));
+            }
+            set {
+                this["App_PathNewIssue"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("https://github.com/Excel-projects/Server-Help/blob/master/README.md")]
+        public string App_PathReadMe {
+            get {
+                return ((string)(this["App_PathReadMe"]));
+            }
+            set {
+                this["App_PathReadMe"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("11/02/2018 12:00:00")]
+        public global::System.DateTime App_ReleaseDate {
+            get {
+                return ((global::System.DateTime)(this["App_ReleaseDate"]));
+            }
+            set {
+                this["App_ReleaseDate"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("Results")]
+        public string Ping_Results {
+            get {
+                return ((string)(this["Ping_Results"]));
+            }
+            set {
+                this["Ping_Results"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("dNSHostname")]
+        public string Ping_ServerName {
+            get {
+                return ((string)(this["Ping_ServerName"]));
+            }
+            set {
+                this["Ping_ServerName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("OperatingSystem")]
+        public string Rdg_Comment {
+            get {
+                return ((string)(this["Rdg_Comment"]));
+            }
+            set {
+                this["Rdg_Comment"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("CN")]
+        public string Rdg_Description {
+            get {
+                return ((string)(this["Rdg_Description"]));
+            }
+            set {
+                this["Rdg_Description"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("C:\\Temp\\Test.rdg")]
+        public string Rdg_FileName {
+            get {
+                return ((string)(this["Rdg_FileName"]));
+            }
+            set {
+                this["Rdg_FileName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("LDAP://OU=Servers,...")]
+        public string Rdg_LdapPath {
+            get {
+                return ((string)(this["Rdg_LdapPath"]));
+            }
+            set {
+                this["Rdg_LdapPath"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("SELECT whenCreated, whenChanged, distinguishedName, OperatingSystem, OperatingSys" +
+            "temVersion, dNSHostname, Name, CN FROM \'[Rdg.LdapPath]\' WHERE objectClass = \'com" +
+            "puter\'")]
+        public string Rdg_LdapQry {
+            get {
+                return ((string)(this["Rdg_LdapQry"]));
+            }
+            set {
+                this["Rdg_LdapQry"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("ServerType")]
+        public string Rdg_ServerGroup {
+            get {
+                return ((string)(this["Rdg_ServerGroup"]));
+            }
+            set {
+                this["Rdg_ServerGroup"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("dNSHostname")]
+        public string Rdg_ServerName {
+            get {
+                return ((string)(this["Rdg_ServerName"]));
+            }
+            set {
+                this["Rdg_ServerName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("Servers")]
+        public string Rdg_SheetName {
+            get {
+                return ((string)(this["Rdg_SheetName"]));
+            }
+            set {
+                this["Rdg_SheetName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string App_PathLocalData {
+            get {
+                return ((string)(this["App_PathLocalData"]));
+            }
+            set {
+                this["App_PathLocalData"] = value;
+            }
+        }
+    }
+}
diff --git a/CS/Properties/Settings.settings b/CS/Properties/Settings.settings
new file mode 100644
index 0000000..4229245
--- /dev/null
+++ b/CS/Properties/Settings.settings
@@ -0,0 +1,51 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="ServerActions.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="App_Author" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">Anthony Duguid</Value>
+    </Setting>
+    <Setting Name="App_PathNewIssue" Type="System.String" Scope="User">
+      <Value Profile="(Default)">https://github.com/Excel-projects/Server-Help/issues/new</Value>
+    </Setting>
+    <Setting Name="App_PathReadMe" Type="System.String" Scope="User">
+      <Value Profile="(Default)">https://github.com/Excel-projects/Server-Help/blob/master/README.md</Value>
+    </Setting>
+    <Setting Name="App_ReleaseDate" Type="System.DateTime" Scope="User">
+      <Value Profile="(Default)">11/02/2018 12:00:00</Value>
+    </Setting>
+    <Setting Name="Ping_Results" Type="System.String" Scope="User">
+      <Value Profile="(Default)">Results</Value>
+    </Setting>
+    <Setting Name="Ping_ServerName" Type="System.String" Scope="User">
+      <Value Profile="(Default)">dNSHostname</Value>
+    </Setting>
+    <Setting Name="Rdg_Comment" Type="System.String" Scope="User">
+      <Value Profile="(Default)">OperatingSystem</Value>
+    </Setting>
+    <Setting Name="Rdg_Description" Type="System.String" Scope="User">
+      <Value Profile="(Default)">CN</Value>
+    </Setting>
+    <Setting Name="Rdg_FileName" Type="System.String" Scope="User">
+      <Value Profile="(Default)">C:\Temp\Test.rdg</Value>
+    </Setting>
+    <Setting Name="Rdg_LdapPath" Type="System.String" Scope="User">
+      <Value Profile="(Default)">LDAP://OU=Servers,...</Value>
+    </Setting>
+    <Setting Name="Rdg_LdapQry" Type="System.String" Scope="User">
+      <Value Profile="(Default)">SELECT whenCreated, whenChanged, distinguishedName, OperatingSystem, OperatingSystemVersion, dNSHostname, Name, CN FROM '[Rdg.LdapPath]' WHERE objectClass = 'computer'</Value>
+    </Setting>
+    <Setting Name="Rdg_ServerGroup" Type="System.String" Scope="User">
+      <Value Profile="(Default)">ServerType</Value>
+    </Setting>
+    <Setting Name="Rdg_ServerName" Type="System.String" Scope="User">
+      <Value Profile="(Default)">dNSHostname</Value>
+    </Setting>
+    <Setting Name="Rdg_SheetName" Type="System.String" Scope="User">
+      <Value Profile="(Default)">Servers</Value>
+    </Setting>
+    <Setting Name="App_PathLocalData" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+  </Settings>
+</SettingsFile>
\ No newline at end of file
diff --git a/CS/Resources/cmd.png b/CS/Resources/cmd.png
new file mode 100644
index 0000000..2996792
Binary files /dev/null and b/CS/Resources/cmd.png differ
diff --git a/CS/Resources/download.png b/CS/Resources/download.png
new file mode 100644
index 0000000..b5acacb
Binary files /dev/null and b/CS/Resources/download.png differ
diff --git a/CS/Resources/rdg.png b/CS/Resources/rdg.png
new file mode 100644
index 0000000..5f64f7e
Binary files /dev/null and b/CS/Resources/rdg.png differ
diff --git a/CS/Ribbon.xml b/CS/Ribbon.xml
new file mode 100644
index 0000000..15f2368
--- /dev/null
+++ b/CS/Ribbon.xml
@@ -0,0 +1,241 @@
+﻿<?xml version="1.0" encoding="UTF-8"?>
+<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
+	<ribbon>
+		<tabs>
+			<tab
+					id="tabServerActions"
+					getLabel="GetLabelText"
+					insertAfterMso="TabHome"
+					>
+				<group
+						id="grpFormatDataTable"
+						label="Format Data Table"
+						imageMso="FormatAsTableGallery"
+						visible="false"
+						>
+					<gallery
+							idMso="FormatAsTableGallery"
+							size="large"
+							/>
+					<gallery
+							idMso="ViewFreezePanesGallery"
+							size="large"
+							/>
+					<button
+							idMso="RemoveDuplicates"
+							size="large"
+							/>
+				</group>
+				<group
+						id="grpPing"
+						label="Ping Test"
+						imageMso="SparklineLineInsert"
+						>
+					<button
+							id="btnPing"
+							label="Ping"
+							size="large"
+							onAction="OnAction"
+							getImage="GetButtonImage"
+							screentip="Ping Servers"
+							supertip="This will ping the visible servers in the selected data table."
+							/>
+					<separator
+							id="separator2"
+							/>
+					<comboBox
+							id="cboServerName"
+							label="Server: "
+							onChange="OnChange"
+							getText="GetText"
+							getItemCount="GetItemCount"
+							getItemLabel="GetItemLabel"
+							sizeString= "XXXXXXXXXXXXXXXXXXXX"
+							screentip="Server Name"
+							supertip="This is the column name for the server column."
+							/>
+					<comboBox
+							id="cboPingName"
+							label="Ping: "
+							onChange="OnChange"
+							getText="GetText"
+							getItemCount="GetItemCount"
+							getItemLabel="GetItemLabel"
+							sizeString= "XXXXXXXXXXXXXXXXXXXX"
+							screentip="Ping Results"
+							supertip="This is the column name for the ping column. If the column doesn't exist, it will be created."
+							/>
+				</group>
+				<group
+						id="grpRdm"
+						label="Remote Desktop Manager"
+						imageMso="QueryBuilder"
+						>
+					<button
+							id="btnCreateRdgFile"
+							label="Create File"
+							size="large"
+							onAction="OnAction"
+							getImage="GetButtonImage"
+							screentip="Create A Remote Desktop Manager File"
+							supertip="This creates a Remote Desktop Manager file from the active table list of servers."
+							/>
+					<separator
+							id="separator3"
+							/>
+					<comboBox
+							id="cboRdgServer"
+							label="Server: "
+							onChange="OnChange"
+							getText="GetText"
+							getItemCount="GetItemCount"
+							getItemLabel="GetItemLabel"
+							sizeString= "XXXXXXXXXXXXXXXXXXXX"
+							screentip="Server Name"
+							supertip="This is the column name for the server column."
+							/>
+					<comboBox
+							id="cboRdgDescription"
+							label="Description: "
+							onChange="OnChange"
+							getText="GetText"
+							getItemCount="GetItemCount"
+							getItemLabel="GetItemLabel"
+							sizeString= "XXXXXXXXXXXXXXXXXXXX"
+							screentip="Server Description"
+							supertip="This is the column name for the server description column."
+							/>
+					<comboBox
+							id="cboRdgComment"
+							label="Comment: "
+							onChange="OnChange"
+							getText="GetText"
+							getItemCount="GetItemCount"
+							getItemLabel="GetItemLabel"
+							sizeString= "XXXXXXXXXXXXXXXXXXXX"
+							screentip="Server Comment"
+							supertip="This is the column name for the server comment column."
+							/>
+					<separator
+							id="separator4"
+							/>
+					<comboBox
+							id="cboRdgGroup"
+							label="Group: "
+							onChange="OnChange"
+							getText="GetText"
+							getItemCount="GetItemCount"
+							getItemLabel="GetItemLabel"
+							sizeString= "XXXXXXXXXXXXXXXXXXXX"
+							screentip="Server Group"
+							supertip="This is the column name for the server group column."
+							/>
+					<editBox
+							id="txtFileName"
+							label="File Name: "
+							onChange="OnChange"
+							getText="GetText"
+							sizeString= "XXXXXXXXXXXXXXXXXXXXXX"
+							screentip="Find Date Format"
+							supertip="This is the file path for the Remote Desktop Manager file."
+							/>
+				</group>
+				<group
+						label="Options"
+						id="grpOptions"
+						imageMso="PropertySheet"
+						>
+					<button
+							id="btnRefreshServerList"
+							label="Rebuild Server List"
+							size="large"
+							onAction="OnAction"
+							imageMso="GetExternalDataFromOtherSources"
+							screentip="Rebuild Server List"
+							supertip="This will recreate the list of servers from Active Directory using a LDAP query."
+							/>
+					<button
+							id="btnRefreshCombobox"
+							label="Refresh Dropdowns"
+							size="large"
+							onAction="OnAction"
+							imageMso="RefreshAll"
+							screentip="Refresh Dropdowns"
+							supertip="This will refresh all of the dropdowns in the ribbon with the active table column names."
+							/>
+				</group>
+				<group
+						id="grpHelp"
+						label="Help"
+						imageMso="Help">
+					<button
+							id="btnOpenReadMe"
+							label="How To...   "
+							onAction="OnAction"
+							imageMso="Help"
+							size="normal"
+							screentip="How To..."
+							supertip="This opens the read me page in GitHub with detailed instructions of the Add-In functionality."
+              keytip="HLP"
+							/>
+					<button
+							id="btnOpenNewIssue"
+							label="Report Issue"
+							onAction="OnAction"
+							imageMso="MacroSecurity"
+							size="normal"
+							screentip="Report An Issue"
+							supertip="This will open a new issue page in GitHub. The user will need to login to raise an issue."
+              keytip="RPT"
+							/>
+					<button
+							id="btnSettings"
+							label="Settings"
+							onAction="OnAction"
+							imageMso="PropertySheet"
+							size="normal"
+							screentip="Add-In Settings Form"
+							supertip="This opens a user form with a list of custom properties stored in the file."
+              keytip="SET"
+							/>
+				</group>
+				<group
+						id="grpAbout"
+						label="About"
+						imageMso="Info">
+					<labelControl
+							id="lblDescription"
+							label="Add-In Name:"
+							enabled="false"
+							/>
+					<labelControl
+							id="lblReleaseDate"
+							label="Release Date: "
+							enabled="false"
+							/>
+					<labelControl
+							id="lblCopyright"
+							label="Copyright: "
+							enabled="false"
+							/>
+					<labelControl
+							id="txtDescription"
+							getLabel="GetLabelText"
+							enabled="false"
+							/>
+					<labelControl
+							id="txtReleaseDate"
+							getLabel="GetLabelText"
+							enabled="false"
+							/>
+					<labelControl
+							id="txtCopyright"
+							getLabel="GetLabelText"
+							enabled="false"
+							/>
+				</group>
+
+			</tab>
+		</tabs>
+	</ribbon>
+</customUI>
\ No newline at end of file
diff --git a/CS/Scripts/AssemblyInfo.cs b/CS/Scripts/AssemblyInfo.cs
new file mode 100644
index 0000000..0f636d2
--- /dev/null
+++ b/CS/Scripts/AssemblyInfo.cs
@@ -0,0 +1,410 @@
+﻿using System;
+using System.IO;
+using System.Reflection;
+using System.Diagnostics;
+using System.Windows.Forms;
+using System.Deployment.Application;
+using Microsoft.Win32;
+
+// <summary> 
+// This namespaces if for generic application classes
+// </summary>
+namespace ServerActions.Scripts
+{
+    /// <summary> 
+    /// Used to get the assembly information 
+    /// </summary>
+    /// <remarks>
+    /// http://danielsaidi.wordpress.com/2009/05/25/c-get-assembly-information/
+    /// </remarks>
+    public static class AssemblyInfo
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public static string versionFolderNumber;
+
+        /// <summary> 
+        /// Title
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string Title
+        {
+            get
+            {
+                string result = string.Empty;
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+
+                if (assembly != null)
+                {
+                    object[] customAttributes = assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
+                    if ((customAttributes != null) && (customAttributes.Length > 0))
+                        result = ((AssemblyTitleAttribute)customAttributes[0]).Title;
+                }
+
+                return result;
+            }
+        }
+
+        /// <summary> 
+        /// Description
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string Description
+        {
+            get
+            {
+                string result = string.Empty;
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+
+                if (assembly != null)
+                {
+                    object[] customAttributes = assembly.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
+                    if ((customAttributes != null) && (customAttributes.Length > 0))
+                        result = ((AssemblyDescriptionAttribute)customAttributes[0]).Description;
+                }
+                return result;
+            }
+        }
+
+        /// <summary> 
+        /// Company
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string Company
+        {
+            get
+            {
+                string result = string.Empty;
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+
+                if (assembly != null)
+                {
+                    object[] customAttributes = assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
+                    if ((customAttributes != null) && (customAttributes.Length > 0))
+                        result = ((AssemblyCompanyAttribute)customAttributes[0]).Company;
+                }
+
+                return result;
+            }
+        }
+
+        /// <summary> 
+        /// Product
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string Product
+        {
+            get
+            {
+                string result = string.Empty;
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+
+                if (assembly != null)
+                {
+                    object[] customAttributes = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+                    if ((customAttributes != null) && (customAttributes.Length > 0))
+                        result = ((AssemblyProductAttribute)customAttributes[0]).Product;
+                }
+                return result;
+            }
+        }
+
+        /// <summary> 
+        /// Copyright
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string Copyright
+        {
+            get
+            {
+                string result = string.Empty;
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+
+                if (assembly != null)
+                {
+                    object[] customAttributes = assembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
+                    if ((customAttributes != null) && (customAttributes.Length > 0))
+                        result = ((AssemblyCopyrightAttribute)customAttributes[0]).Copyright;
+                }
+                return result;
+            }
+        }
+
+        /// <summary> 
+        /// Trademark
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string Trademark
+        {
+            get
+            {
+                string result = string.Empty;
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+
+                if (assembly != null)
+                {
+                    object[] customAttributes = assembly.GetCustomAttributes(typeof(AssemblyTrademarkAttribute), false);
+                    if ((customAttributes != null) && (customAttributes.Length > 0))
+                        result = ((AssemblyTrademarkAttribute)customAttributes[0]).Trademark;
+                }
+                return result;
+            }
+        }
+
+        /// <summary> 
+        /// AssemblyVersion
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string AssemblyVersion
+        {
+            get
+            {
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+                return assembly.GetName().Version.ToString();
+            }
+        }
+
+        /// <summary> 
+        /// FileVersion
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string FileVersion
+        {
+            get
+            {
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+                FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
+                return fvi.FileVersion;
+            }
+        }
+
+        /// <summary> 
+        /// Guid
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string Guid
+        {
+            get
+            {
+                string result = string.Empty;
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+
+                if (assembly != null)
+                {
+                    object[] customAttributes = assembly.GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false);
+                    if ((customAttributes != null) && (customAttributes.Length > 0))
+                        result = ((System.Runtime.InteropServices.GuidAttribute)customAttributes[0]).Value;
+                }
+                return result;
+            }
+        }
+
+        /// <summary> 
+        /// FileName
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string FileName
+        {
+            get
+            {
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+                FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
+                return fvi.OriginalFilename;
+            }
+        }
+
+        /// <summary> 
+        /// FilePath
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        public static string FilePath
+        {
+            get
+            {
+                Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+                FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
+                return fvi.FileName;
+            }
+        }
+
+        /// <summary> 
+        /// Return the current file name (used for error logging)
+        /// </summary>
+        /// <returns>A method that returns a string of the current file name </returns> 
+        /// <remarks></remarks>
+        public static string GetCurrentFileName()
+        {
+            try
+            {
+                return Globals.ThisAddIn.Application.ActiveWorkbook.Path + @"\" + Globals.ThisAddIn.Application.ActiveWorkbook.Name;
+            }
+            catch (Exception)
+            {
+                return string.Empty;
+            }
+        }
+
+        /// <summary> 
+        /// Returns the ClickOnce location
+        /// </summary>
+        /// <returns>A method that returns a string of the current location </returns> 
+        /// <remarks></remarks>
+        public static string GetClickOnceLocation()
+        {
+            try
+            {
+                System.Reflection.Assembly assemblyInfo = System.Reflection.Assembly.GetExecutingAssembly();
+                Uri uriCodeBase = new Uri(assemblyInfo.CodeBase);
+                return Path.GetDirectoryName(uriCodeBase.LocalPath.ToString());
+
+            }
+            catch (Exception)
+            {
+                return string.Empty;
+
+            }
+
+        }
+
+        /// <summary> 
+        /// Returns the assembly location 
+        /// </summary>
+        /// <returns>A method that returns a string of the current location </returns> 
+        /// <remarks></remarks>
+        public static string GetAssemblyLocation()
+        {
+            try
+            {
+                System.Reflection.Assembly assemblyInfo = System.Reflection.Assembly.GetExecutingAssembly();
+                return assemblyInfo.Location;
+
+            }
+            catch (Exception)
+            {
+                return string.Empty;
+
+            }
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public static void SetAssemblyFolderVersion()
+        {
+            try
+            {
+                if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
+                {
+                    Version ver = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
+                    string versionNumber = string.Format("{0}.{1}.{2}.{3}", ver.Major, ver.Minor, ver.Build, ver.Revision);
+                    versionFolderNumber = "_" + versionNumber.Replace(".", "_");
+                }
+                else
+                {
+                    versionFolderNumber = "_" + FileVersion.Replace(".", "_");
+                }
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+
+            }
+        }
+
+        /// <summary>
+        /// set the icon in add/remove programs
+        /// </summary>
+        /// <param name="iconName">The referenced icon name for the application.</param>
+        /// <remarks>
+        /// only run if deployed 
+        /// </remarks>
+        public static void SetAddRemoveProgramsIcon(string iconName)
+        {
+            if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed
+                 && ApplicationDeployment.CurrentDeployment.IsFirstRun)
+            {
+                try
+                {
+                    Assembly code = Assembly.GetExecutingAssembly();
+                    AssemblyDescriptionAttribute asdescription =
+                        (AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(code, typeof(AssemblyDescriptionAttribute));
+                    string assemblyDescription = asdescription.Description;
+
+                    //Get the assembly information
+                    System.Reflection.Assembly assemblyInfo = System.Reflection.Assembly.GetExecutingAssembly();
+
+                    //CodeBase is the location of the ClickOnce deployment files
+                    Uri uriCodeBase = new Uri(assemblyInfo.CodeBase);
+                    string clickOnceLocation = Path.GetDirectoryName(uriCodeBase.LocalPath.ToString());
+
+                    //the icon is included in this program
+                    string iconSourcePath = Path.Combine(clickOnceLocation, @"Resources\" + iconName);
+                    if (!File.Exists(iconSourcePath))
+                        return;
+
+                    RegistryKey myUninstallKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall");
+                    string[] mySubKeyNames = myUninstallKey.GetSubKeyNames();
+                    for (int i = 0; i < mySubKeyNames.Length; i++)
+                    {
+                        RegistryKey myKey = myUninstallKey.OpenSubKey(mySubKeyNames[i], true);
+                        object myValue = myKey.GetValue("DisplayName");
+                        if (myValue != null && myValue.ToString() == assemblyDescription)
+                        {
+                            myKey.SetValue("DisplayIcon", iconSourcePath);
+                            break;
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    ErrorHandler.DisplayMessage(ex);
+                }
+            }
+        }
+
+        /// <summary> 
+        /// Open a file as read only
+        /// </summary>
+        /// <param name="filePath">Represents the file path string </param>
+        /// <remarks></remarks>
+        public static void OpenFile(string filePath)
+        {
+            try
+            {
+                if (filePath == string.Empty)
+                    return;
+                var attributes = File.GetAttributes(filePath);
+                File.SetAttributes(filePath, attributes | FileAttributes.ReadOnly);
+                System.Diagnostics.Process.Start(filePath);
+
+            }
+            catch (System.ComponentModel.Win32Exception)
+            {
+                MessageBox.Show("No application is assicated to this file type." + Environment.NewLine + Environment.NewLine + filePath, "No action taken.", MessageBoxButtons.OK, MessageBoxIcon.Information);
+                return;
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+
+            }
+
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/CS/Scripts/ErrorHandler.cs b/CS/Scripts/ErrorHandler.cs
new file mode 100644
index 0000000..ce377f4
--- /dev/null
+++ b/CS/Scripts/ErrorHandler.cs
@@ -0,0 +1,393 @@
+﻿using System;
+using System.Linq;
+using System.Text;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+using Excel = Microsoft.Office.Interop.Excel;
+using log4net;
+using log4net.Config;
+
+[assembly: log4net.Config.XmlConfigurator(Watch = true)]
+
+// <summary> 
+// This namespaces if for generic application classes
+// </summary>
+namespace ServerActions.Scripts
+{
+    /// <summary> 
+    /// Used to handle exceptions
+    /// </summary>
+    public class ErrorHandler
+    {
+        private static readonly ILog log = LogManager.GetLogger(typeof(ErrorHandler));
+
+        /// <summary>
+        /// Applies a new path for the log file by FileAppender name
+        /// </summary>
+        public static void SetLogPath()
+        {
+            XmlConfigurator.Configure();
+            log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
+            string logFileName = System.IO.Path.Combine(Properties.Settings.Default.App_PathLocalData, AssemblyInfo.Product + ".log");
+
+            foreach (var a in h.Root.Appenders)
+            {
+                if (a is log4net.Appender.FileAppender)
+                {
+                    if (a.Name.Equals("FileAppender"))
+                    {
+                        log4net.Appender.FileAppender fa = (log4net.Appender.FileAppender)a;
+                        fa.File = logFileName;
+                        fa.ActivateOptions();
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// Create a log record to track which methods are being used.
+        /// </summary>
+        public static void CreateLogRecord()
+        {
+            try
+            {
+                // gather context
+                var sf = new System.Diagnostics.StackFrame(1);
+                var caller = sf.GetMethod();
+                var currentProcedure = caller.Name.Trim();
+
+                // handle log record
+                var logMessage = string.Concat(new Dictionary<string, string>
+                {
+                    ["PROCEDURE"] = currentProcedure,
+                    ["USER NAME"] = Environment.UserName,
+                    ["MACHINE NAME"] = Environment.MachineName
+                }.Select(x => $"[{x.Key}]=|{x.Value}|"));
+                log.Info(logMessage);
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+
+            }
+        }
+
+        /// <summary> 
+        /// Used to produce an error message and create a log record
+        /// <example>
+        /// <code lang="C#">
+        /// ErrorHandler.DisplayMessage(ex);
+        /// </code>
+        /// </example> 
+        /// </summary>
+        /// <param name="ex">Represents errors that occur during application execution.</param>
+        /// <param name="isSilent">Used to show a message to the user and log an error record or just log a record.</param>
+        /// <remarks></remarks>
+        public static void DisplayMessage(Exception ex, Boolean isSilent = false)
+        {
+            // gather context
+            var sf = new System.Diagnostics.StackFrame(1);
+            var caller = sf.GetMethod();
+            var errorDescription = ex.ToString().Replace("\r\n", " "); // the carriage returns were messing up my log file
+            var currentProcedure = caller.Name.Trim();
+            var currentFileName = AssemblyInfo.GetCurrentFileName();
+
+            // handle log record
+            var logMessage = string.Concat(new Dictionary<string, string>
+            {
+                ["PROCEDURE"] = currentProcedure,
+                ["USER NAME"] = Environment.UserName,
+                ["MACHINE NAME"] = Environment.MachineName,
+                ["FILE NAME"] = currentFileName,
+                ["DESCRIPTION"] = errorDescription,
+            }.Select(x => $"[{x.Key}]=|{x.Value}|"));
+            log.Error(logMessage);
+
+            // format message
+            var userMessage = new StringBuilder()
+                .AppendLine("Contact your system administrator. A record has been created in the log file.")
+                .AppendLine("Procedure: " + currentProcedure)
+                .AppendLine("Description: " + errorDescription)
+                .ToString();
+
+            // handle message
+            if (isSilent == false)
+            {
+                MessageBox.Show(userMessage, "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        /// <summary> 
+        /// Check to see if there is an active document
+        /// </summary>
+        /// <param name="showMsg">To show a message </param>
+        /// <returns>A method that returns true or false if there is an active document </returns> 
+        /// <remarks></remarks>
+        public static bool IsActiveDocument(bool showMsg = false)
+        {
+            try
+            {
+                if (Globals.ThisAddIn.Application.ActiveWorkbook == null)
+                {
+                    if (showMsg == true)
+                    {
+                        MessageBox.Show("The command could not be completed.  Please open a document and select a range.", AssemblyInfo.Description, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                    }
+                    return false;
+                }
+                else
+                {
+                    return true;
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return false;
+            }
+        }
+
+        /// <summary> 
+        /// Check to see if there is an active selection
+        /// </summary>
+        /// <param name="showMsg">To show a message </param>
+        /// <returns>A method that returns true or false if there is an active selection </returns> 
+        /// <remarks></remarks>
+        public static bool IsActiveSelection(bool showMsg = false)
+        {
+            Excel.Range checkRange = null;
+            try
+            {
+                checkRange = Globals.ThisAddIn.Application.Selection as Excel.Range; //must cast the selection as range or errors
+                if (null == checkRange)
+                {
+                    if (showMsg == true)
+                    {
+                        MessageBox.Show("The command could not be completed by using the range specified.  Select a single cell within the range and try the command again. [Range]", AssemblyInfo.Description, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                    }
+                    return false;
+                }
+                else
+                {
+                    return true;
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return false;
+            }
+            finally
+            {
+                if (checkRange != null)
+                    Marshal.ReleaseComObject(checkRange);
+            }
+        }
+
+        /// <summary> 
+        /// Check to see if there is an named range selected
+        /// </summary>
+        /// <param name="showMsg">To show a message </param>
+        /// <returns>A method that returns true or false if there is a valid list object </returns> 
+        /// <remarks></remarks>
+        public static bool IsValidListObject(bool showMsg = false)
+        {
+            Excel.ListObject tbl = null;
+            try
+            {
+                tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject;  // directly after the table is created this is not true
+                if ((tbl == null))
+                {
+                    if (showMsg == true)
+                    {
+                        MessageBox.Show("The command could not be completed by using the range specified.  Select a single cell within the range and try the command again. [ListObject]", AssemblyInfo.Description, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                    }
+                    return false;
+                }
+                else
+                {
+                    return true;
+                }
+            }
+            catch (Exception)
+            {
+                return false;
+            }
+            finally
+            {
+                if (tbl != null)
+                    Marshal.ReleaseComObject(tbl);
+            }
+        }
+
+        /// <summary>
+        /// Check to see if there is a column in the table
+        /// </summary>
+        /// <param name="tbl"></param>
+        /// <param name="columnName"></param>
+        /// <returns></returns>
+        public static bool IsValidListColumn(Excel.ListObject tbl, string columnName)
+        {
+            try
+            {
+                Excel.ListColumn col = tbl.ListColumns[columnName];
+                return true;
+
+            }
+            catch (Exception)
+            {
+                return false;
+            }
+
+        }
+
+        /// <summary>
+        /// This method check whether Excel is in Cell Editing mode or not
+        /// There are few ways to check this (eg. check to see if a standard menu item is disabled etc.)
+        /// I know in cell editing mode app.DisplayAlerts throws an Exception, so here I'm relying on that behaviour
+        /// </summary>
+        /// <param name="showMsg">To show a message </param>
+        /// <returns>true if Excel is in cell editing mode</returns>
+        private static bool IsInCellEditingMode(bool showMsg = false)
+        {
+            bool flag = false;
+            try
+            {
+                Globals.ThisAddIn.Application.DisplayAlerts = false; //This will throw an Exception if Excel is in Cell Editing Mode
+            }
+            catch (Exception)
+            {
+                if (showMsg == true)
+                {
+                    MessageBox.Show("The procedure can not run while you are editing a cell.", "No action taken.", MessageBoxButtons.OK, MessageBoxIcon.Information);
+                }
+                flag = true;
+            }
+            return flag;
+        }
+
+        /// <summary> 
+        /// Can an object be inserted
+        /// </summary>
+        /// <param name="showMsg">To show a message </param>
+        /// <returns>A method that returns true or false if an object can be enabled </returns> 
+        /// <remarks></remarks>
+        public static bool IsEnabled(bool showMsg = false)
+        {
+            try
+            {
+                if (IsActiveDocument(showMsg) == false)
+                {
+                    return false;
+                }
+                else
+                {
+                    if (IsActiveSelection(showMsg) == false)
+                    {
+                        return false;
+                    }
+                    else
+                    {
+                        if (IsInCellEditingMode(showMsg) == true)
+                        {
+                            return false;
+                        }
+                        else
+                        {
+                            return true;
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return false;
+            }
+        }
+
+        /// <summary> 
+        /// Can an object be inserted
+        /// </summary>
+        /// <param name="showMsg">To show a message </param>
+        /// <returns>A method that returns true or false if an object can be used </returns> 
+        /// <remarks></remarks>
+        public static bool IsAvailable(bool showMsg = false)
+        {
+            try
+            {
+                if (IsEnabled(showMsg) == false)
+                {
+                    return false;
+                }
+                else
+                {
+                    if (IsValidListObject(showMsg) == false)
+                    {
+                        return false;
+                    }
+                    else
+                    {
+                        return true;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return false;
+            }
+        }
+
+        /// <summary> 
+        /// Check if the object is a date     
+        /// </summary>
+        /// <param name="expression">Represents the cell value </param>
+        /// <returns>A method that returns true or false if there is a valid date </returns> 
+        /// <remarks></remarks>
+        public static bool IsDate(object expression)
+        {
+            if (expression != null)
+            {
+                if (expression is DateTime)
+                {
+                    return true;
+                }
+                if (expression is string)
+                {
+                    DateTime time1;
+                    return DateTime.TryParse((string)expression, out time1);
+                }
+            }
+            return false;
+        }
+
+        /// <summary> 
+        /// Check if the object is a time     
+        /// </summary>
+        /// <param name="expression">Represents the cell value </param>
+        /// <returns>A method that returns true or false if there is a valid time </returns> 
+        /// <remarks></remarks>
+        public static bool IsTime(object expression)
+        {
+            try
+            {
+                string timeValue = Convert.ToString(expression);
+                //timeValue = String.Format("{0:" + Properties.Settings.Default.Table_ColumnFormatTime + "}", expression);
+                //timeValue = timeValue.ToString(Properties.Settings.Default.Table_ColumnFormatTime, System.Globalization.CultureInfo.InvariantCulture);
+                //timeValue = timeValue.ToString(Properties.Settings.Default.Table_ColumnFormatTime);
+                //string timeValue = expression.ToString().Format(Properties.Settings.Default.Table_ColumnFormatTime);
+                TimeSpan time1;
+                //return TimeSpan.TryParse((string)expression, out time1);
+                return TimeSpan.TryParse(timeValue, out time1);
+            }
+            catch (Exception)
+            {
+                return false;
+            }
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/CS/Scripts/Ribbon.cs b/CS/Scripts/Ribbon.cs
new file mode 100644
index 0000000..11f4e83
--- /dev/null
+++ b/CS/Scripts/Ribbon.cs
@@ -0,0 +1,925 @@
+﻿using ADODB;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Management;
+using System.Windows.Forms;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Text;
+using Office = Microsoft.Office.Core;
+using Excel = Microsoft.Office.Interop.Excel;
+
+namespace ServerActions.Scripts
+{
+    [ComVisible(true)]
+    public class Ribbon : Office.IRibbonExtensibility
+    {
+        private Office.IRibbonUI ribbon;
+
+        /// <summary>
+        /// Used to reference the ribbon object
+        /// </summary>
+        public static Ribbon ribbonref;
+
+        #region | Task Panes |
+
+        /// <summary>
+        /// Settings TaskPane
+        /// </summary>
+        public Taskpane.Settings mySettings;
+
+        /// <summary>
+        /// Settings Custom Task Pane
+        /// </summary>
+        public Microsoft.Office.Tools.CustomTaskPane myTaskPaneSettings;
+
+        #endregion
+
+        #region | Ribbon Events |
+
+        /// <summary> 
+        /// The ribbon
+        /// </summary>
+        public Ribbon()
+        {
+        }
+
+        /// <summary> 
+        /// Loads the XML markup, either from an XML customization file or from XML markup embedded in the procedure, that customizes the Ribbon user interface.
+        /// </summary>
+        /// <param name="ribbonID">Represents the XML customization file </param>
+        /// <returns>A method that returns a bitmap image for the control id. </returns> 
+        /// <remarks></remarks>
+        public string GetCustomUI(string ribbonID)
+        {
+            return GetResourceText("ServerActions.Ribbon.xml");
+        }
+
+        /// <summary>
+        /// Called by the GetCustomUI method to obtain the contents of the Ribbon XML file.
+        /// </summary>
+        /// <param name="resourceName">name of  the XML file</param>
+        /// <returns>the contents of the XML file</returns>
+        private static string GetResourceText(string resourceName)
+        {
+            Assembly asm = Assembly.GetExecutingAssembly();
+            string[] resourceNames = asm.GetManifestResourceNames();
+            for (int i = 0; i < resourceNames.Length; ++i)
+            {
+                if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
+                {
+                    using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
+                    {
+                        if (resourceReader != null)
+                        {
+                            return resourceReader.ReadToEnd();
+                        }
+                    }
+                }
+            }
+            return null;
+        }
+
+        /// <summary> 
+        /// loads the ribbon UI and creates a log record
+        /// </summary>
+        /// <param name="ribbonUI">Represents the IRibbonUI instance that is provided by the Microsoft Office application to the Ribbon extensibility code. </param>
+        /// <remarks></remarks>
+        public void Ribbon_Load(Office.IRibbonUI ribbonUI)
+        {
+            try
+            {
+                this.ribbon = ribbonUI;
+                ribbonref = this;
+                AssemblyInfo.SetAddRemoveProgramsIcon("ExcelAddin.ico");
+                AssemblyInfo.SetAssemblyFolderVersion();
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        /// <summary> 
+        /// Assigns an image to a button on the ribbon in the xml file
+        /// </summary>
+        /// <param name="control">Represents the object passed into the callback procedure of a control in a ribbon or another user interface that can be customized by using Office Fluent ribbon extensibility. </param>
+        /// <returns>A method that returns a bitmap image for the control id. </returns> 
+        public System.Drawing.Bitmap GetButtonImage(Office.IRibbonControl control)
+        {
+            try
+            {
+                switch (control.Id)
+                {
+                    case "btnPing":
+                        return Properties.Resources.cmd;
+                    case "btnCreateRdgFile":
+                        return Properties.Resources.rdg;
+                    default:
+                        return null;
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return null;
+            }
+        }
+
+        /// <summary> 
+        /// Assigns text to a label on the ribbon from the xml file
+        /// </summary>
+        /// <param name="control">Represents the object passed into the callback procedure of a control in a ribbon or another user interface that can be customized by using Office Fluent ribbon extensibility. </param>
+        /// <returns>A method that returns a string for a label. </returns> 
+        public string GetLabelText(Office.IRibbonControl control)
+        {
+            try
+            {
+                switch (control.Id)
+                {
+                    case "tabServerActions":
+                        if (Application.ProductVersion.Substring(0, 2) == "15") //for Excel 2013
+                        {
+                            return AssemblyInfo.Title.ToUpper();
+                        }
+                        else
+                        {
+                            return AssemblyInfo.Title;
+                        }
+                    case "txtCopyright":
+                        return "© " + AssemblyInfo.Copyright;
+                    case "txtDescription":
+                        return AssemblyInfo.Title.Replace("&", "&&") + " " + AssemblyInfo.AssemblyVersion;
+                    case "txtReleaseDate":
+                        DateTime dteCreateDate = Properties.Settings.Default.App_ReleaseDate;
+                        return dteCreateDate.ToString("dd-MMM-yyyy hh:mm tt");
+
+
+
+
+
+                    default:
+                        return string.Empty;
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return string.Empty;
+            }
+        }
+
+        /// <summary> 
+        /// Assigns the number of items for a combobox or dropdown
+        /// </summary>
+        /// <param name="control">Represents the object passed into the callback procedure of a control in a ribbon or another user interface that can be customized by using Office Fluent ribbon extensibility. </param>
+        /// <returns>A method that returns an integer of total count of items used for a combobox or dropdown </returns> 
+        public int GetItemCount(Office.IRibbonControl control)
+        {
+            Excel.ListObject tbl = null;
+            try
+            {
+
+                if (ErrorHandler.IsValidListObject())
+                {
+                    tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject;
+                }
+
+                if (tbl == null)
+                {
+                    return 1;
+                }
+
+                return tbl.ListColumns.Count;
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return 0;
+            }
+        }
+
+        /// <summary> 
+        /// Assigns the values to a combobox or dropdown based on an index
+        /// </summary>
+        /// <param name="control">Represents the object passed into the callback procedure of a control in a ribbon or another user interface that can be customized by using Office Fluent ribbon extensibility. </param>
+        /// <param name="index">Represents the index of the combobox or dropdown value </param>
+        /// <returns>A method that returns a string per index of a combobox or dropdown </returns> 
+        public string GetItemLabel(Office.IRibbonControl control, int index)
+        {
+            Excel.ListObject tbl = null;
+            try
+            {
+
+                if (ErrorHandler.IsValidListObject())
+                {
+                    tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject;
+                }
+
+                if (tbl == null)
+                {
+                    return String.Empty;
+                }
+
+                return tbl.ListColumns[index + 1].Name;
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return string.Empty;
+            }
+        }
+
+        /// <summary> 
+        /// Assigns default values to comboboxes
+        /// </summary>
+        /// <param name="control">Represents the object passed into the callback procedure of a control in a ribbon or another user interface that can be customized by using Office Fluent ribbon extensibility. </param>
+        /// <returns>A method that returns a string for the default value of a combobox </returns> 
+        public string GetText(Office.IRibbonControl control)
+        {
+            try
+            {
+                switch (control.Id)
+                {
+                    case "cboServerName":
+                        return Properties.Settings.Default.Ping_ServerName;
+                    case "cboPingName":
+                        return Properties.Settings.Default.Ping_Results;
+                    case "cboRdgGroup":
+                        return Properties.Settings.Default.Rdg_ServerGroup;
+                    case "cboRdgServer":
+                        return Properties.Settings.Default.Rdg_ServerName;
+                    case "cboRdgDescription":
+                        return Properties.Settings.Default.Rdg_Description;
+                    case "cboRdgComment":
+                        return Properties.Settings.Default.Rdg_Comment;
+                    case "txtFileName":
+                        return Properties.Settings.Default.Rdg_FileName;
+                    default:
+                        return string.Empty;
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return string.Empty;
+            }
+        }
+
+        /// <summary>
+        /// Assigns the value to an application setting
+        /// </summary>
+        /// <param name="control">Represents the object passed into the callback procedure of a control in a ribbon or another user interface that can be customized by using Office Fluent ribbon extensibility. </param>
+        /// <returns>A method that returns true or false if the control is enabled </returns> 
+        public void OnAction(Office.IRibbonControl control)
+        {
+            try
+            {
+                switch (control.Id)
+                {
+                    case "btnPing":
+                        AddPingColumn();
+                        break;
+                    case "btnCreateRdgFile":
+                        CreateRdgFile();
+                        break;
+                    case "btnDownloadNewVersion":
+                        //DownloadNewVersion();
+                        break;
+                    case "btnOpenNewIssue":
+                        OpenNewIssue();
+                        break;
+                    case "btnOpenReadMe":
+                        OpenReadMe();
+                        break;
+                    case "btnSettings":
+                        OpenSettings();
+                        break;
+                    case "btnRefreshCombobox":
+                        RefreshCombobox();
+                        break;
+                    case "btnRefreshServerList":
+                        RefreshServerList();
+                        break;
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+
+        }
+
+        /// <summary> 
+        /// Return the updated value from the comboxbox
+        /// </summary>
+        /// <param name="control">Represents the object passed into the callback procedure of a control in a ribbon or another user interface that can be customized by using Office Fluent ribbon extensibility. </param>
+        /// <param name="text">Represents the text from the combobox value </param>
+        public void OnChange(Office.IRibbonControl control, string text)
+        {
+            try
+            {
+                switch (control.Id)
+                {
+                    case "cboServerName":
+                        Properties.Settings.Default.Ping_ServerName = text;
+                        break;
+                    case "cboPingName":
+                        Properties.Settings.Default.Ping_Results = text;
+                        break;
+                    case "cboRdgServer":
+                        Properties.Settings.Default.Rdg_ServerName = text;
+                        break;
+                    case "cboRdgDescription":
+                        Properties.Settings.Default.Rdg_Description = text;
+                        break;
+                    case "cboRdgComment":
+                        Properties.Settings.Default.Rdg_Comment = text;
+                        break;
+                    case "cboRdgGroup":
+                        Properties.Settings.Default.Rdg_ServerGroup = text;
+                        break;
+                    case "txtFileName":
+                        Properties.Settings.Default.Rdg_FileName = text;
+                        break;
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+            finally
+            {
+                Properties.Settings.Default.Save();
+                ribbon.InvalidateControl(control.Id);
+            }
+        }
+
+        #endregion
+
+        #region | Ribbon Buttons |
+
+        public void AddPingColumn()
+        {
+            try
+            {
+                Excel.ListColumn colResults;
+
+                if (ErrorHandler.IsValidListObject())
+                {
+                    Excel.ListObject tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject;
+
+                    if (ErrorHandler.IsValidListColumn(tbl, Properties.Settings.Default.Ping_Results))
+                    {
+                        colResults = tbl.ListColumns[Properties.Settings.Default.Ping_Results];
+                    }
+                    else
+                    {
+                        colResults = tbl.ListColumns.Add();
+                        colResults.Name = Properties.Settings.Default.Ping_Results;
+                    }
+                    
+                    if (ErrorHandler.IsValidListColumn(tbl, Properties.Settings.Default.Ping_ServerName))
+                    {
+                        Excel.ListColumn colServer = tbl.ListColumns[Properties.Settings.Default.Ping_ServerName];
+                        for (int r = 1; r <= tbl.ListRows.Count; r++)
+                        {
+                            if (colServer.DataBodyRange.Rows[r].EntireRow.Hidden == false)
+                            {
+                                Excel.Range cellResult = colResults.DataBodyRange.Cells[1].Offset(r - 1, 0);
+                                Excel.Range cellServer = colServer.DataBodyRange.Cells[1].Offset(r - 1, 0);
+                                cellResult.Value = Ribbon.GetPingResult(cellServer.Value.ToString());
+                            }
+                        }
+                    }
+
+                }
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        public void CreateRdgFile()
+        {
+            try
+            {
+                string quote = ((char)34).ToString();
+                string previousGroup = string.Empty;
+                string currentGroup = string.Empty;
+                if (ErrorHandler.IsValidListObject())
+                {
+                    var script = new StringBuilder()
+                        .AppendLine("<?xml version=" + quote + "1.0" + quote + " encoding=" + quote + "UTF-8" + quote + "?>")
+                        .AppendLine("<RDCMan programVersion=" + quote + "2.7" + quote + " schemaVersion=" + quote + "3" + quote + ">")
+                        .AppendLine("<file>")
+                        .AppendLine("<credentialsProfiles />")
+                        .AppendLine("<properties>")
+                        .AppendLine("<expanded>True</expanded>")
+                        .AppendLine("<name>" + Scripts.AssemblyInfo.Title + "</name>")
+                        .AppendLine("</properties>");
+
+                    Excel.ListObject tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject;
+                    Excel.ListColumn colServer = tbl.ListColumns[Properties.Settings.Default.Rdg_ServerName];
+                    Excel.ListColumn colDesc = tbl.ListColumns[Properties.Settings.Default.Rdg_Description];
+                    Excel.ListColumn colComment = tbl.ListColumns[Properties.Settings.Default.Rdg_Comment];
+                    Excel.ListColumn colServerGroup = tbl.ListColumns[Properties.Settings.Default.Rdg_ServerGroup];
+
+                    for (int r = 1; r <= tbl.ListRows.Count; r++)
+                    {
+                        if (colServer.DataBodyRange.Rows[r].EntireRow.Hidden == false)
+                        {
+                            Excel.Range cellServer = colServer.DataBodyRange.Cells[1].Offset(r - 1, 0);
+                            Excel.Range cellDesc = colDesc.DataBodyRange.Cells[1].Offset(r - 1, 0);
+                            Excel.Range cellComment = colComment.DataBodyRange.Cells[1].Offset(r - 1, 0);
+                            Excel.Range cellServerGroup = colServerGroup.DataBodyRange.Cells[1].Offset(r - 1, 0);
+                            currentGroup = cellServerGroup.Value;
+
+                            if (currentGroup != previousGroup)
+                            {
+                                script.AppendLine("<group>");
+                                script.AppendLine("<properties>");
+                                script.AppendLine("<expanded>True</expanded>");
+                                script.AppendLine("<name>" + currentGroup + "</name>");
+                                script.AppendLine("</properties>");
+                            }
+
+                            script.AppendLine("<server>");
+                            script.AppendLine("<properties>");
+                            script.AppendLine("<name>" + cellServer.Value + "</name>");
+                            script.AppendLine("<displayName>" + cellServer.Value + " (" + cellDesc.Value + ")</displayName>");
+                            script.AppendLine("<comment>" & cellComment.Value & "</comment>");
+                            script.AppendLine("</properties>");
+                            script.AppendLine("</server>");
+
+                            if (currentGroup != colServerGroup.DataBodyRange.Cells[1].Offset(r, 0))
+                            {
+                                script.AppendLine("</group>");
+                            }
+
+                        }
+                        previousGroup = currentGroup;
+                    }
+
+                    script.AppendLine("</file>");
+                    script.AppendLine("<connected />");
+                    script.AppendLine("<favorites />");
+                    script.AppendLine("<recentlyUsed />");
+                    script.AppendLine("</RDCMan>");
+
+                    System.IO.File.WriteAllText(Properties.Settings.Default.Rdg_FileName, script.ToString());
+
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        public void RefreshServerList()
+        {
+            ADODB.Connection cn = new ADODB.Connection();
+            ADODB.Recordset rs = new ADODB.Recordset();
+            ADODB.Command cmd = new ADODB.Command();
+            Excel.Workbook wb = Globals.ThisAddIn.Application.ActiveWorkbook;
+            Excel.Worksheet ws;
+            string ldapQry = Properties.Settings.Default.Rdg_LdapQry;
+            try
+            {
+                cn.Open("Provider=ADsDSOObject;");
+                ldapQry = ldapQry.Replace("[Rdg.LdapPath]", Properties.Settings.Default.Rdg_LdapPath);
+                cmd.ActiveConnection = cn;
+                object recs;
+                rs = cn.Execute(ldapQry, out recs, 0);
+
+                //bool sheetExists;
+                //For Each ws In wb.Sheets
+                //    If My.Settings.Rdg_SheetName = ws.Name Then
+                //        sheetExists = True
+                //        ws.Activate()
+                //    End If
+                //Next ws
+
+                //If sheetExists = False Then
+                //    ws = wb.ActiveSheet
+                //    Dim answer As Integer
+                //    string msg = "The sheet named '" & My.Settings.Rdg_SheetName & "' does not exist."
+                //    msg = msg & vbCrLf & "Would you like to use the current sheet?"
+                //    answer = MsgBox(msg, vbYesNo + vbQuestion, "Sheet Not Found")
+                //  'MessageBox.Show(msg, "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
+                //    If answer = vbYes Then
+                //        ws = wb.ActiveSheet
+                //        My.Settings.Rdg_SheetName = wb.ActiveSheet.Name
+                //    Else
+                //        Exit Try
+                //    End If
+                //Else
+                //ws = wb.Worksheets[Properties.Settings.Default.Rdg_SheetName];
+                ws = wb.ActiveSheet;
+                //End If
+
+                ws.Activate();
+                Ribbon.ClearSheetContents();
+                for (int i = 0; i <= rs.Fields.Count - 1; i++)
+                {
+                    ws.Cells[1, i + 1].Value = rs.Fields[i].Name;
+                }
+                ws.Range[ws.Cells[1, 1], ws.Cells[1, rs.Fields.Count]].Font.Bold = true;
+                ws.Range["A2"].CopyFromRecordset(rs);
+
+                Ribbon.FormatTableFromRange();
+                Excel.ListObject tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject;
+                Ribbon.UpdateZeroStringToNull(tbl);
+                Ribbon.FormatDateColumns();
+
+                //'create server type column from the first 2 characters of the server name
+                //'If (My.Settings.Rdg_ServerGroup = "ServerType" Then
+                //'    tbl.ListColumns.Add(3).Name = My.Settings.Rdg_ServerGroup
+                //'    tbl.ListColumns(My.Settings.Rdg_ServerGroup).DataBodyRange.FormulaR1C1 = "=UPPER(IFERROR(IF(SEARCH(""-"", [@Name]) > 0, LEFT([@Name], 2), """"), ""(NONE)""))"
+                //'    Globals.ThisAddIn.Application.Columns.AutoFit()
+                //'End If
+
+                Ribbon.ribbonref.InvalidateRibbon(); //'reset dropdown lists
+                Ribbon.ActivateTab();
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        public void RefreshCombobox()
+        {
+            try
+            {
+                if (ErrorHandler.IsValidListObject())
+                {
+                    ribbon.Invalidate();
+                }
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        public void OpenSettings()
+        {
+            try
+            {
+                if (myTaskPaneSettings != null)
+                {
+                    if (myTaskPaneSettings.Visible == true)
+                    {
+                        myTaskPaneSettings.Visible = false;
+                    }
+                    else
+                    {
+                        myTaskPaneSettings.Visible = true;
+                    }
+                }
+                else
+                {
+                    mySettings = new Taskpane.Settings();
+                    myTaskPaneSettings = Globals.ThisAddIn.CustomTaskPanes.Add(mySettings, "Settings for " + Scripts.AssemblyInfo.Title);
+                    myTaskPaneSettings.DockPosition = Office.MsoCTPDockPosition.msoCTPDockPositionRight;
+                    myTaskPaneSettings.DockPositionRestrict = Office.MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
+                    myTaskPaneSettings.Width = 675;
+                    myTaskPaneSettings.Visible = true;
+                }
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        public void OpenReadMe()
+        {
+            try
+            {
+                ErrorHandler.CreateLogRecord();
+                System.Diagnostics.Process.Start(Properties.Settings.Default.App_PathReadMe);
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        public void OpenNewIssue()
+        {
+            try
+            {
+                ErrorHandler.CreateLogRecord();
+                System.Diagnostics.Process.Start(Properties.Settings.Default.App_PathNewIssue);
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        public void ShowServerStatus()
+        {
+            string FullComputerName = "<Name of Remote Computer>";
+            ConnectionOptions options = new ConnectionOptions();
+            ManagementScope scope = new ManagementScope("\\\\" + FullComputerName + "\\root\\cimv2", options);
+            scope.Connect();
+            ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_TerminalService");
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
+            ManagementObjectCollection queryCollection = searcher.Get();
+            foreach (ManagementObject queryObj in queryCollection)
+            {
+                Console.WriteLine("-----------------------------------");
+                Console.WriteLine("Win32_TerminalService instance");
+                Console.WriteLine("-----------------------------------");
+                Console.WriteLine("Started: {0}", queryObj["Started"]);
+                Console.WriteLine("State: {0}", queryObj["State"]);
+                Console.WriteLine("Status: {0}", queryObj["Status"]);
+            }
+
+        }
+
+        #endregion
+
+        #region | Subroutines |
+
+        public static void ActivateTab()
+        {
+            try
+            {
+                ribbonref.ribbon.ActivateTab("tabServerActions");
+            }
+
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+
+            }
+
+        }
+
+        /// <summary>
+        /// Used to update/reset the ribbon values
+        /// </summary>
+        public void InvalidateRibbon()
+        {
+            ribbon.Invalidate();
+        }
+
+        public static void ClearSheetContents()
+        {
+            try
+            {
+                Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;
+                ws.Cells.Clear(); //To clear only content (no formats) use
+                ws.Cells.ClearContents(); //To Clear only formats use
+                ws.Cells.ClearFormats(); //To clear only cell comments use
+                ws.Cells.ClearComments();
+                ws.Cells.ClearNotes();
+                ws.Cells.ClearOutline();
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="hostName"></param>
+        /// <returns></returns>
+        public static string GetPingResult(string hostName)
+        {
+            string resultText = string.Empty;
+            string dateFormat = "dd-MMM-yyyy HH:mm:ss";
+            try
+            {
+                SelectQuery query = new SelectQuery("Win32_PingStatus", "Address='" + hostName + "'");
+                ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
+                foreach (ManagementObject result in searcher.Get())
+                {
+                    if (result["StatusCode"] != null)
+                    {
+                        switch ((UInt32)result["StatusCode"])
+                        {
+                            case 0: { resultText = "Connected"; break; }
+                            case 11001: { resultText = "Buffer too small"; break; }
+                            case 11002: { resultText = "Destination net unreachable"; break; }
+                            case 11003: { resultText = "Destination host unreachable"; break; }
+                            case 11004: { resultText = "Destination protocol unreachable"; break; }
+                            case 11005: { resultText = "Destination port unreachable"; break; }
+                            case 11006: { resultText = "No resources"; break; }
+                            case 11007: { resultText = "Bad option"; break; }
+                            case 11008: { resultText = "Hardware error"; break; }
+                            case 11009: { resultText = "Packet too big"; break; }
+                            case 11011: { resultText = "Bad request"; break; }
+                            case 11012: { resultText = "Bad route"; break; }
+                            case 11013: { resultText = "Time-To-Live (TTL) expired transit"; break; }
+                            case 11014: { resultText = "Time-To-Live (TTL) expired reassembly"; break; }
+                            case 11015: { resultText = "Parameter problem"; break; }
+                            case 11016: { resultText = "Source quench"; break; }
+                            case 11017: { resultText = "Option too big"; break; }
+                            case 11018: { resultText = "Bad destination"; break; }
+                            case 11032: { resultText = "Negotiating IPSEC"; break; }
+                            case 11050: { resultText = "General failure"; break; }
+                            default: { resultText = "Unknown host"; break; }
+                        }
+                    }
+                    else
+                    {
+                        resultText = "Unknown host";
+                    }
+                }
+                return resultText + " : " + DateTime.Now.ToString(dateFormat);
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return "Error: " + ex.ToString();
+            }
+        }
+
+        /// <summary> 
+        /// Finds dates columns with the paste format settings or date specific columns and updates with date format setting
+        /// </summary>
+        /// <remarks></remarks>
+        public static void FormatDateColumns()
+        {
+            Excel.ListObject tbl = null;
+            Excel.Range cell = null;
+            string dateFormat = "dd-MMM-yyyy HH:mm:ss";
+            try
+            {
+                if (ErrorHandler.IsAvailable(true) == false)
+                {
+                    return;
+                }
+                ErrorHandler.CreateLogRecord();
+                tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject;
+                cell = default(Excel.Range);
+                Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
+                foreach (Excel.ListColumn col in tbl.ListColumns)
+                {
+                    cell = FirstNotNullCellInColumn(col.DataBodyRange);
+                    col.DataBodyRange.NumberFormat = dateFormat;
+                    col.DataBodyRange.HorizontalAlignment = Excel.Constants.xlLeft;
+                }
+            }
+            catch (System.Runtime.InteropServices.COMException ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+            finally
+            {
+                Cursor.Current = System.Windows.Forms.Cursors.Arrow;
+                if (tbl != null)
+                    Marshal.ReleaseComObject(tbl);
+                if (cell != null)
+                    Marshal.ReleaseComObject(cell);
+            }
+        }
+
+        /// <summary>
+        /// Convert a range of cells to a table with a specific table format
+        /// </summary>
+        public static void FormatTableFromRange()
+        {
+            string FirstCellName = "A1";
+            string tableName = AssemblyInfo.Title + " " + DateTime.Now.ToString("yyyy-MM-ddThh:mm:ss:fffzzz");
+            string tableStyle = "TableStyleMedium15";
+            try
+            {
+                if (ErrorHandler.IsValidListObject(false) == true)
+                {
+                    return;
+                }
+                Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
+                ErrorHandler.CreateLogRecord();
+
+                //create the table
+                Excel.Range rng = Globals.ThisAddIn.Application.ActiveSheet.Range(Globals.ThisAddIn.Application.ActiveSheet.Range(FirstCellName), Globals.ThisAddIn.Application.ActiveSheet.Range(FirstCellName).SpecialCells(Excel.Constants.xlLastCell));
+                rng.Worksheet.ListObjects.Add(Excel.XlListObjectSourceType.xlSrcRange, rng, System.Type.Missing, Excel.XlYesNoGuess.xlYes, System.Type.Missing).Name = tableName;
+                Excel.ListObject tbl = rng.Worksheet.ListObjects[tableName];
+                tbl.TableStyle = tableStyle;
+                tbl.Name = tableName;
+
+                //format the table
+                Globals.ThisAddIn.Application.Columns.AutoFit();
+                Globals.ThisAddIn.Application.ActiveSheet.Activate();
+                Globals.ThisAddIn.Application.ActiveSheet.Application.ActiveWindow.FreezePanes = false;
+                Globals.ThisAddIn.Application.ActiveSheet.Application.ActiveWindow.ScrollRow = 1;
+                Globals.ThisAddIn.Application.ActiveSheet.Application.ActiveWindow.SplitRow = 1;
+                Globals.ThisAddIn.Application.ActiveSheet.Application.ActiveWindow.ScrollColumn = 1;
+                Globals.ThisAddIn.Application.ActiveSheet.Application.ActiveWindow.SplitColumn = 1;
+                Globals.ThisAddIn.Application.ActiveSheet.Application.ActiveWindow.FreezePanes = true;
+
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+            finally
+            {
+                Cursor.Current = System.Windows.Forms.Cursors.Arrow;
+            }
+        }
+
+        /// <summary> 
+        /// Get the first not null cell
+        /// </summary>   
+        /// <param name="rng">Represents the cell range </param>
+        /// <returns>A method that returns a range </returns> 
+        /// <remarks> 
+        /// TODO: find a way to do this without looping.
+        /// NOTE: SpecialCells is unreliable when called from VBA UDFs (Odd ??!)               
+        ///</remarks> 
+        public static Excel.Range FirstNotNullCellInColumn(Excel.Range rng)
+        {
+            try
+            {
+                if ((rng == null))
+                {
+                    return null;
+                }
+
+                foreach (Excel.Range row in rng.Rows)
+                {
+                    Excel.Range cell = row.Cells[1, 1];
+                    if ((cell.Value != null))
+                    {
+                        string cellValue = cell.Value2.ToString();
+                        if (String.Compare(cellValue, "NULL", true) != 0)
+                        {
+                            return cell;
+                        }
+                    }
+                }
+                return null;
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+                return null;
+            }
+        }
+
+        /// <summary> 
+        /// Change zero string cell values to string "NULL"
+        /// </summary>
+        /// <remarks></remarks>
+        public static void UpdateZeroStringToNull(Excel.ListObject tbl)
+        {
+            try
+            {
+                if (ErrorHandler.IsAvailable(true) == false)
+                {
+                    return;
+                }
+
+                Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
+                ErrorHandler.CreateLogRecord();
+
+                Excel.Range cell = default(Excel.Range);
+                Excel.Range usedRange = tbl.Range;
+
+                for (int r = 0; r <= tbl.ListRows.Count; r++) 
+                {
+                    for (int c = 1; c <= tbl.ListColumns.Count; c++)
+                    {
+                        if (usedRange[r + 1, c].Value2 == null)
+                        {
+                            cell = tbl.Range.Cells[r + 1, c];
+                            cell.Value = "NULL";
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+
+        }
+
+        #endregion
+
+    }
+}
diff --git a/CS/ServerHelp.csproj b/CS/ServerHelp.csproj
new file mode 100644
index 0000000..e808034
--- /dev/null
+++ b/CS/ServerHelp.csproj
@@ -0,0 +1,281 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <!--
+    This section defines project-level properties.
+
+    AssemblyName
+      Name of the output assembly.
+    Configuration
+      Specifies a default value for debug.
+    OutputType
+      Must be "Library" for VSTO.
+    Platform
+      Specifies what CPU the output of this project can run on.
+    NoStandardLibraries
+      Set to "false" for VSTO.
+    RootNamespace
+      In C#, this specifies the namespace given to new files. In VB, all objects are
+      wrapped in this namespace at runtime.
+  -->
+  <PropertyGroup>
+    <ProjectTypeGuids>{BAA0C2D2-18E2-41B9-852F-F413020CAA33};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{49DC4E9F-F164-4B20-A834-254831D2D20B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <NoStandardLibraries>false</NoStandardLibraries>
+    <RootNamespace>ServerActions</RootNamespace>
+    <AssemblyName>ServerHelp</AssemblyName>
+    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
+    <DefineConstants>VSTO40</DefineConstants>
+    <IsWebBootstrapper>True</IsWebBootstrapper>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <PublishUrl>publish\</PublishUrl>
+    <InstallUrl>https://github.com/Excel-projects/Server-Help/master/CS/publish/</InstallUrl>
+    <TargetCulture>en</TargetCulture>
+    <ApplicationVersion>2.0.0.2</ApplicationVersion>
+    <AutoIncrementApplicationRevision>true</AutoIncrementApplicationRevision>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateInterval>0</UpdateInterval>
+    <UpdateIntervalUnits>days</UpdateIntervalUnits>
+    <ProductName>Excel Addin Server Help</ProductName>
+    <PublisherName>Anthony Duguid</PublisherName>
+    <SupportUrl>https://github.com/Office-projects/Server-Help/blob/master/README.md</SupportUrl>
+    <FriendlyName>Excel Addin Server Help</FriendlyName>
+    <OfficeApplicationDescription>This Add-In pings a list of servers from an Excel table and creates a file for Microsoft Remote Desktop Manager.</OfficeApplicationDescription>
+    <LoadBehavior>3</LoadBehavior>
+  </PropertyGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4.5.2 %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.VSTORuntime.4.0">
+      <Visible>False</Visible>
+      <ProductName>Microsoft Visual Studio 2010 Tools for Office Runtime %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.4.5">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 4.5</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <PropertyGroup>
+    <!--
+      OfficeApplication
+        Add-in host application
+    -->
+    <OfficeApplication>Excel</OfficeApplication>
+  </PropertyGroup>
+  <!--
+    This section defines properties that are set when the "Debug" configuration is selected.
+
+    DebugSymbols
+      If "true", create symbols (.pdb). If "false", do not create symbols.
+    DefineConstants
+      Constants defined for the preprocessor.
+    EnableUnmanagedDebugging
+      If "true", starting the debugger will attach both managed and unmanaged debuggers.
+    Optimize
+      If "true", optimize the build output. If "false", do not optimize.
+    OutputPath
+      Output path of project relative to the project file.
+    WarningLevel
+      Warning level for the compiler.
+  -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
+    <DefineConstants>$(DefineConstants);DEBUG;TRACE</DefineConstants>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <!--
+    This section defines properties that are set when the "Release" configuration is selected.
+
+    DebugSymbols
+      If "true", create symbols (.pdb). If "false", do not create symbols.
+    DefineConstants
+      Constants defined for the preprocessor.
+    EnableUnmanagedDebugging
+      If "true", starting the debugger will attach both managed and unmanaged debuggers.
+    Optimize
+      If "true", optimize the build output. If "false", do not optimize.
+    OutputPath
+      Output path of project relative to the project file.
+    WarningLevel
+      Warning level for the compiler.
+  -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
+    <DefineConstants>$(DefineConstants);TRACE</DefineConstants>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <!--
+    This section specifies references for the project.
+  -->
+  <ItemGroup>
+    <Reference Include="Accessibility" />
+    <Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
+      <HintPath>packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Management" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Office.Tools.v4.0.Framework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.VisualStudio.Tools.Applications.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Office.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Office.Tools.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Office.Tools.Excel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Office.Tools.Common.v4.0.Utilities, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <Private>True</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="Office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
+      <Private>False</Private>
+      <EmbedInteropTypes>true</EmbedInteropTypes>
+    </Reference>
+    <Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
+      <Private>False</Private>
+      <EmbedInteropTypes>true</EmbedInteropTypes>
+    </Reference>
+    <Reference Include="stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <!--
+    This section defines the user source files that are part of the project.
+     
+    A "Compile" element specifies a source file to compile.
+    An "EmbeddedResource" element specifies an .resx file for embedded resources.
+    A "None" element specifies a file that is not to be passed to the compiler (for instance, 
+    a text file or XML file).
+    The "AppDesigner" element specifies the directory where the application properties files
+    can be found.
+  -->
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <EmbeddedResource Include="Taskpane\Settings.resx">
+      <DependentUpon>Settings.cs</DependentUpon>
+    </EmbeddedResource>
+    <None Include="AnthonyDuguid.pfx" />
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="packages.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="Scripts\Ribbon.cs" />
+    <Compile Include="Scripts\AssemblyInfo.cs" />
+    <Compile Include="Scripts\ErrorHandler.cs" />
+    <Compile Include="Taskpane\Settings.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Taskpane\Settings.Designer.cs">
+      <DependentUpon>Settings.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ThisAddIn.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <None Include="ThisAddIn.Designer.xml">
+      <DependentUpon>ThisAddIn.cs</DependentUpon>
+    </None>
+    <Compile Include="ThisAddIn.Designer.cs">
+      <DependentUpon>ThisAddIn.Designer.xml</DependentUpon>
+    </Compile>
+    <AppDesigner Include="Properties\" />
+  </ItemGroup>
+  <ItemGroup>
+    <COMReference Include="ADODB">
+      <Guid>{B691E011-1797-432E-907A-4D8C69339129}</Guid>
+      <VersionMajor>6</VersionMajor>
+      <VersionMinor>1</VersionMinor>
+      <Lcid>0</Lcid>
+      <WrapperTool>tlbimp</WrapperTool>
+      <Isolated>False</Isolated>
+      <EmbedInteropTypes>True</EmbedInteropTypes>
+    </COMReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Ribbon.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Resources\cmd.png" />
+    <Content Include="Resources\download.png" />
+    <Content Include="Resources\rdg.png" />
+  </ItemGroup>
+  <PropertyGroup>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignManifests>true</SignManifests>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ManifestKeyFile>AnthonyDuguid.pfx</ManifestKeyFile>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ManifestCertificateThumbprint>93965FE7740536E96E341C481EEBCAF9BF3BD295</ManifestCertificateThumbprint>
+  </PropertyGroup>
+  <!-- Include the build rules for a C# project. -->
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- Include additional build rules for an Office application add-in. -->
+  <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
+  <!-- This section defines VSTO properties that describe the host-changeable project properties. -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{BAA0C2D2-18E2-41B9-852F-F413020CAA33}">
+        <ProjectProperties HostName="Excel" HostPackage="{29A7B9D7-A7F1-4328-8EF0-6B2D1A56B2C1}" OfficeVersion="15.0" VstxVersion="4.0" ApplicationType="Excel" Language="cs" TemplatesPath="" DebugInfoExeName="#Software\Microsoft\Office\16.0\Excel\InstallRoot\Path#excel.exe" DebugInfoCommandLine="/x" AddItemTemplatesGuid="{51063C3A-E220-4D12-8922-BDA915ACD783}" />
+        <Host Name="Excel" GeneratedCodeNamespace="ServerActions" IconIndex="0">
+          <HostItem Name="ThisAddIn" Code="ThisAddIn.cs" CanonicalName="AddIn" CanActivate="false" IconIndex="1" Blueprint="ThisAddIn.Designer.xml" GeneratedCode="ThisAddIn.Designer.cs" />
+        </Host>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>
\ No newline at end of file
diff --git a/CS/ServerHelp.sln b/CS/ServerHelp.sln
new file mode 100644
index 0000000..76350e8
--- /dev/null
+++ b/CS/ServerHelp.sln
@@ -0,0 +1,22 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerHelp", "ServerHelp.csproj", "{49DC4E9F-F164-4B20-A834-254831D2D20B}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{49DC4E9F-F164-4B20-A834-254831D2D20B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{49DC4E9F-F164-4B20-A834-254831D2D20B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{49DC4E9F-F164-4B20-A834-254831D2D20B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{49DC4E9F-F164-4B20-A834-254831D2D20B}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/CS/Taskpane/Settings.Designer.cs b/CS/Taskpane/Settings.Designer.cs
new file mode 100644
index 0000000..6a92cfa
--- /dev/null
+++ b/CS/Taskpane/Settings.Designer.cs
@@ -0,0 +1,58 @@
+﻿namespace ServerActions.Taskpane
+{
+    partial class Settings
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.pgdSettings = new System.Windows.Forms.PropertyGrid();
+            this.SuspendLayout();
+            // 
+            // pgdSettings
+            // 
+            this.pgdSettings.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.pgdSettings.LineColor = System.Drawing.SystemColors.ControlDark;
+            this.pgdSettings.Location = new System.Drawing.Point(0, 0);
+            this.pgdSettings.Name = "pgdSettings";
+            this.pgdSettings.Size = new System.Drawing.Size(650, 750);
+            this.pgdSettings.TabIndex = 3;
+            // 
+            // Settings
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.pgdSettings);
+            this.Name = "Settings";
+            this.Size = new System.Drawing.Size(650, 750);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        internal System.Windows.Forms.PropertyGrid pgdSettings;
+    }
+}
diff --git a/CS/Taskpane/Settings.cs b/CS/Taskpane/Settings.cs
new file mode 100644
index 0000000..ed53611
--- /dev/null
+++ b/CS/Taskpane/Settings.cs
@@ -0,0 +1,78 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using System.Reflection;
+using ServerActions.Scripts;
+
+namespace ServerActions.Taskpane
+{
+    public partial class Settings : UserControl
+    {
+        /// <summary>
+        /// Initialize the controls in the object
+        /// </summary>
+        public Settings()
+        {
+            try
+            {
+                InitializeComponent();
+                this.pgdSettings.SelectedObject = Properties.Settings.Default;
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        /// <summary> 
+        /// Sets the column width of a property grid 
+        /// </summary>
+        /// <param name="grid">Represents the property grid object. </param>
+        /// <param name="width">Represents the width of the column. </param>
+        /// <remarks></remarks>
+        public static void SetLabelColumnWidth(PropertyGrid grid, int width)
+        {
+            try
+            {
+                if (grid == null)
+                    return;
+
+                FieldInfo fi = grid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
+                if (fi == null)
+                    return;
+
+                Control view = fi.GetValue(grid) as Control;
+                if (view == null)
+                    return;
+
+                MethodInfo mi = view.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic);
+                if (mi == null)
+                    return;
+                mi.Invoke(view, new object[] { width });
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+        /// <summary>
+        /// Update the ribbon with the changed settings values
+        /// </summary>
+        /// <param name="s">contains the sender of the event, so if you had one method bound to multiple controls, you can distinguish them.</param>
+        /// <param name="e">refers to the event arguments for the used event, they usually come in the form of properties/functions/methods that get to be available on it.</param>
+        private void pgdSettings_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
+        {
+            try
+            {
+                Properties.Settings.Default.Save();
+                Scripts.Ribbon.ribbonref.InvalidateRibbon();
+            }
+            catch (Exception ex)
+            {
+                ErrorHandler.DisplayMessage(ex);
+            }
+        }
+
+    }
+}
diff --git a/CS/Taskpane/Settings.resx b/CS/Taskpane/Settings.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/CS/Taskpane/Settings.resx
@@ -0,0 +1,120 @@
+﻿<?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>
+</root>
\ No newline at end of file
diff --git a/CS/ThisAddIn.Designer.cs b/CS/ThisAddIn.Designer.cs
new file mode 100644
index 0000000..d23b77a
--- /dev/null
+++ b/CS/ThisAddIn.Designer.cs
@@ -0,0 +1,237 @@
+﻿//------------------------------------------------------------------------------
+// <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>
+//------------------------------------------------------------------------------
+
+#pragma warning disable 414
+namespace ServerActions {
+    
+    
+    /// 
+    [Microsoft.VisualStudio.Tools.Applications.Runtime.StartupObjectAttribute(0)]
+    [global::System.Security.Permissions.PermissionSetAttribute(global::System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
+    public sealed partial class ThisAddIn : Microsoft.Office.Tools.AddInBase {
+        
+        internal Microsoft.Office.Tools.CustomTaskPaneCollection CustomTaskPanes;
+        
+        internal Microsoft.Office.Tools.SmartTagCollection VstoSmartTags;
+        
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        private global::System.Object missing = global::System.Type.Missing;
+        
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        internal Microsoft.Office.Interop.Excel.Application Application;
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        public ThisAddIn(global::Microsoft.Office.Tools.Excel.ApplicationFactory factory, global::System.IServiceProvider serviceProvider) : 
+                base(factory, serviceProvider, "AddIn", "ThisAddIn") {
+            Globals.Factory = factory;
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        protected override void Initialize() {
+            base.Initialize();
+            this.Application = this.GetHostItem<Microsoft.Office.Interop.Excel.Application>(typeof(Microsoft.Office.Interop.Excel.Application), "Application");
+            Globals.ThisAddIn = this;
+            global::System.Windows.Forms.Application.EnableVisualStyles();
+            this.InitializeCachedData();
+            this.InitializeControls();
+            this.InitializeComponents();
+            this.InitializeData();
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        protected override void FinishInitialization() {
+            this.InternalStartup();
+            this.OnStartup();
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        protected override void InitializeDataBindings() {
+            this.BeginInitialization();
+            this.BindToData();
+            this.EndInitialization();
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        private void InitializeCachedData() {
+            if ((this.DataHost == null)) {
+                return;
+            }
+            if (this.DataHost.IsCacheInitialized) {
+                this.DataHost.FillCachedData(this);
+            }
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        private void InitializeData() {
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        private void BindToData() {
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        private void StartCaching(string MemberName) {
+            this.DataHost.StartCaching(this, MemberName);
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        private void StopCaching(string MemberName) {
+            this.DataHost.StopCaching(this, MemberName);
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        private bool IsCached(string MemberName) {
+            return this.DataHost.IsCached(this, MemberName);
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        private void BeginInitialization() {
+            this.BeginInit();
+            this.CustomTaskPanes.BeginInit();
+            this.VstoSmartTags.BeginInit();
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        private void EndInitialization() {
+            this.VstoSmartTags.EndInit();
+            this.CustomTaskPanes.EndInit();
+            this.EndInit();
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        private void InitializeControls() {
+            this.CustomTaskPanes = Globals.Factory.CreateCustomTaskPaneCollection(null, null, "CustomTaskPanes", "CustomTaskPanes", this);
+            this.VstoSmartTags = Globals.Factory.CreateSmartTagCollection(null, null, "VstoSmartTags", "VstoSmartTags", this);
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        private void InitializeComponents() {
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        private bool NeedsFill(string MemberName) {
+            return this.DataHost.NeedsFill(this, MemberName);
+        }
+        
+        /// 
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
+        protected override void OnShutdown() {
+            this.VstoSmartTags.Dispose();
+            this.CustomTaskPanes.Dispose();
+            base.OnShutdown();
+        }
+    }
+    
+    /// 
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+    internal sealed partial class Globals {
+        
+        /// 
+        private Globals() {
+        }
+        
+        private static ThisAddIn _ThisAddIn;
+        
+        private static global::Microsoft.Office.Tools.Excel.ApplicationFactory _factory;
+        
+        private static ThisRibbonCollection _ThisRibbonCollection;
+        
+        internal static ThisAddIn ThisAddIn {
+            get {
+                return _ThisAddIn;
+            }
+            set {
+                if ((_ThisAddIn == null)) {
+                    _ThisAddIn = value;
+                }
+                else {
+                    throw new System.NotSupportedException();
+                }
+            }
+        }
+        
+        internal static global::Microsoft.Office.Tools.Excel.ApplicationFactory Factory {
+            get {
+                return _factory;
+            }
+            set {
+                if ((_factory == null)) {
+                    _factory = value;
+                }
+                else {
+                    throw new System.NotSupportedException();
+                }
+            }
+        }
+        
+        internal static ThisRibbonCollection Ribbons {
+            get {
+                if ((_ThisRibbonCollection == null)) {
+                    _ThisRibbonCollection = new ThisRibbonCollection(_factory.GetRibbonFactory());
+                }
+                return _ThisRibbonCollection;
+            }
+        }
+    }
+    
+    /// 
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
+    internal sealed partial class ThisRibbonCollection : Microsoft.Office.Tools.Ribbon.RibbonCollectionBase {
+        
+        /// 
+        internal ThisRibbonCollection(global::Microsoft.Office.Tools.Ribbon.RibbonFactory factory) : 
+                base(factory) {
+        }
+    }
+}
diff --git a/CS/ThisAddIn.Designer.xml b/CS/ThisAddIn.Designer.xml
new file mode 100644
index 0000000..bbd725a
--- /dev/null
+++ b/CS/ThisAddIn.Designer.xml
@@ -0,0 +1,5 @@
+﻿<hostitem:hostItem hostitem:baseType="Microsoft.Office.Tools.AddInBase" hostitem:namespace="ServerActions" hostitem:className="ThisAddIn" hostitem:identifier="ThisAddIn" hostitem:primaryCookie="AddIn" hostitem:master="true" hostitem:factoryType="Microsoft.Office.Tools.Excel.ApplicationFactory" hostitem:startupIndex="0" xmlns:hostitem="http://schemas.microsoft.com/2004/VisualStudio/Tools/Applications/HostItem.xsd">
+  <hostitem:hostObject hostitem:name="Application" hostitem:identifier="Application" hostitem:type="Microsoft.Office.Interop.Excel.Application" hostitem:cookie="Application" hostitem:modifier="Internal" />
+  <hostitem:hostControl hostitem:name="CustomTaskPanes" hostitem:identifier="CustomTaskPanes" hostitem:type="Microsoft.Office.Tools.CustomTaskPaneCollection" hostitem:primaryCookie="CustomTaskPanes" hostitem:modifier="Internal" />
+  <hostitem:hostControl hostitem:name="VstoSmartTags" hostitem:identifier="VstoSmartTags" hostitem:type="Microsoft.Office.Tools.SmartTagCollection" hostitem:primaryCookie="VstoSmartTags" hostitem:modifier="Internal" />
+</hostitem:hostItem>
\ No newline at end of file
diff --git a/CS/ThisAddIn.cs b/CS/ThisAddIn.cs
new file mode 100644
index 0000000..5095c69
--- /dev/null
+++ b/CS/ThisAddIn.cs
@@ -0,0 +1,42 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Linq;
+using Excel = Microsoft.Office.Interop.Excel;
+using Office = Microsoft.Office.Core;
+using Microsoft.Office.Tools.Excel;
+using ServerActions.Scripts;
+
+namespace ServerActions
+{
+    public partial class ThisAddIn
+    {
+        protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
+        {
+            return new Ribbon();
+        }
+
+        private void ThisAddIn_Startup(object sender, System.EventArgs e)
+        {
+        }
+
+        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
+        {
+        }
+
+        #region VSTO generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InternalStartup()
+        {
+            this.Startup += new System.EventHandler(ThisAddIn_Startup);
+            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
+        }
+        
+        #endregion
+    }
+}
diff --git a/CS/app.config b/CS/app.config
new file mode 100644
index 0000000..1cc915e
--- /dev/null
+++ b/CS/app.config
@@ -0,0 +1,64 @@
+﻿<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="ServerActions.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="ServerActions.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <ServerActions.Properties.Settings>
+            <setting name="App_PathNewIssue" serializeAs="String">
+                <value>https://github.com/Excel-projects/Server-Help/issues/new</value>
+            </setting>
+            <setting name="App_PathReadMe" serializeAs="String">
+                <value>https://github.com/Excel-projects/Server-Help/blob/master/README.md</value>
+            </setting>
+            <setting name="App_ReleaseDate" serializeAs="String">
+                <value>11/02/2018 12:00:00</value>
+            </setting>
+            <setting name="Ping_Results" serializeAs="String">
+                <value>Results</value>
+            </setting>
+            <setting name="Ping_ServerName" serializeAs="String">
+                <value>dNSHostname</value>
+            </setting>
+            <setting name="Rdg_Comment" serializeAs="String">
+                <value>OperatingSystem</value>
+            </setting>
+            <setting name="Rdg_Description" serializeAs="String">
+                <value>CN</value>
+            </setting>
+            <setting name="Rdg_FileName" serializeAs="String">
+                <value>C:\Temp\Test.rdg</value>
+            </setting>
+            <setting name="Rdg_LdapPath" serializeAs="String">
+                <value>LDAP://OU=Servers,...</value>
+            </setting>
+            <setting name="Rdg_LdapQry" serializeAs="String">
+                <value>SELECT whenCreated, whenChanged, distinguishedName, OperatingSystem, OperatingSystemVersion, dNSHostname, Name, CN FROM '[Rdg.LdapPath]' WHERE objectClass = 'computer'</value>
+            </setting>
+            <setting name="Rdg_ServerGroup" serializeAs="String">
+                <value>ServerType</value>
+            </setting>
+            <setting name="Rdg_ServerName" serializeAs="String">
+                <value>dNSHostname</value>
+            </setting>
+            <setting name="Rdg_SheetName" serializeAs="String">
+                <value>Servers</value>
+            </setting>
+            <setting name="App_PathLocalData" serializeAs="String">
+                <value />
+            </setting>
+        </ServerActions.Properties.Settings>
+    </userSettings>
+    <applicationSettings>
+        <ServerActions.Properties.Settings>
+            <setting name="App_Author" serializeAs="String">
+                <value>Anthony Duguid</value>
+            </setting>
+        </ServerActions.Properties.Settings>
+    </applicationSettings>
+</configuration>
\ No newline at end of file
diff --git a/CS/packages.config b/CS/packages.config
new file mode 100644
index 0000000..0ffe6c6
--- /dev/null
+++ b/CS/packages.config
@@ -0,0 +1,4 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="log4net" version="2.0.10" targetFramework="net452" />
+</packages>
\ No newline at end of file
diff --git a/CS/test b/CS/test
deleted file mode 100644
index 8b13789..0000000
--- a/CS/test
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..f8b8ed9
--- /dev/null
+++ b/ISSUE_TEMPLATE.md
@@ -0,0 +1,17 @@
+## Expected Behavior
+
+
+## Actual Behavior
+
+
+## Steps to Reproduce the Problem
+
+  1.
+  1.
+  1.
+
+## Specifications
+
+  - Version:
+  - Platform:
+  - Subsystem:
diff --git a/Images/ReadMe/App.png b/Images/ReadMe/App.png
deleted file mode 100644
index 06623c3..0000000
Binary files a/Images/ReadMe/App.png and /dev/null differ
diff --git a/Images/ReadMe/excel.ribbon.gif b/Images/ReadMe/excel.ribbon.gif
new file mode 100644
index 0000000..be83e72
Binary files /dev/null and b/Images/ReadMe/excel.ribbon.gif differ
diff --git a/Images/ReadMe/header.png b/Images/ReadMe/header.png
new file mode 100644
index 0000000..4ba7fd3
Binary files /dev/null and b/Images/ReadMe/header.png differ
diff --git a/Images/ReadMe/header.pptx b/Images/ReadMe/header.pptx
new file mode 100644
index 0000000..d81fc87
Binary files /dev/null and b/Images/ReadMe/header.pptx differ
diff --git a/Images/ReadMe/ribbon.example.gif b/Images/ReadMe/ribbon.example.gif
deleted file mode 100644
index 5d1b99d..0000000
Binary files a/Images/ReadMe/ribbon.example.gif and /dev/null differ
diff --git a/Images/ReadMe/settings2.0.png b/Images/ReadMe/settings2.0.png
deleted file mode 100644
index ccc951a..0000000
Binary files a/Images/ReadMe/settings2.0.png and /dev/null differ
diff --git a/Images/ReadMe/vba.ribbon.settings.png b/Images/ReadMe/vba.ribbon.settings.png
new file mode 100644
index 0000000..f6c0b19
Binary files /dev/null and b/Images/ReadMe/vba.ribbon.settings.png differ
diff --git a/Images/ReadMe/vsto.ribbon.settings.png b/Images/ReadMe/vsto.ribbon.settings.png
new file mode 100644
index 0000000..7fe5fe1
Binary files /dev/null and b/Images/ReadMe/vsto.ribbon.settings.png differ
diff --git a/LICENSE b/LICENSE
index 44760dc..ae2e17f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2017 Anthony Duguid
+Copyright (c) 2019 Anthony Duguid
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 5ff6572..541d86c 100644
--- a/README.md
+++ b/README.md
@@ -2,25 +2,20 @@
 <head>
 </head>
 
-<img align="left" src="Images/ReadMe/App.png" width="64px" >
+<img align="left" src="Images/ReadMe/header.png">
 
-# Server Actions  <span class="Application_Version">2.0.0.0</span> 
-[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © 2017 Anthony Duguid")
-![current_build Office_2013](https://img.shields.io/badge/current_build-Office_2013-red.svg)
-<!---
-[![download VBA](https://img.shields.io/badge/download-VBA-brightgreen.svg)](https://github.com/aduguid/ServerActions/raw/master/VBA/ServerActions.xlsm?raw=true "Download the VBA Add-In")
---->
-This is an Excel Add-In written in Microsoft Visual Studio Community 2017 C#/VB.NET and VBA. It allows the user to use an Excel table to ping a list of servers and create a file for Microsoft Remote Desktop Manager. This is used for quickly determining which servers are offline in a list. This has now been tested on Windows (7, 8.1, 10) & Excel (2010, 2013, 2016).
-<!---
-[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © 2017 Anthony Duguid")
-[![star this repo](http://githubbadges.com/star.svg?user=aduguid&repo=ServerActions&style=flat&color=fff&background=007ec6)](http://github.com/aduguid/ServerActions)
-[![fork this repo](http://githubbadges.com/fork.svg?user=aduguid&repo=ServerActions&style=flat&color=fff&background=007ec6)](http://github.com/aduguid/ServerActions/fork)
+This Add-In allows the user to ping a list of servers and creates a file for [Microsoft Remote Desktop Manager](https://www.microsoft.com/en-au/download/details.aspx?id=44989) from an Excel table. This is used for quickly determining which servers are offline in a list. It is written in 3 different versions as a VSTO Add-In in C# and VB.NET as well as a VBA Add-In.
 
-<br>
+<!--[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/AnthonyDuguid/1.00)-->
+[![Join the chat at https://gitter.im/ServerActions/Lobby](https://badges.gitter.im/ServerActions/Lobby.svg)](https://gitter.im/ServerActions/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © Anthony Duguid")
+[![Latest Release](https://img.shields.io/github/release/Excel-projects/Server-Help.svg?label=latest%20release)](https://github.com/Excel-projects/Server-Help/releases)
+[![Github commits (since latest release)](https://img.shields.io/github/commits-since/Excel-projects/Server-Help/latest.svg)](https://github.com/Excel-projects/Server-Help/commits/master)
+[![GitHub issues](https://img.shields.io/github/issues/Excel-projects/Server-Help.svg)](https://github.com/Excel-projects/Server-Help/issues)
+<!--[![Github All Releases](https://img.shields.io/github/downloads/Excel-projects/Server-Help/total.svg)](https://github.com/Excel-projects/Server-Help/releases)-->
 
---->
 <h1 align="center">
-  <img src="Images/ReadMe/ribbon.example.gif" alt="vbaping" />
+  <img src="Images/ReadMe/excel.ribbon.gif" />
 </h1>
 
 ## Table of Contents
@@ -67,17 +62,15 @@ Instructions for installation of VBA and VSTO versions.
 
 ### VBA
 How to install the VBA version
-1. Download the VBA Add-In file [![download VBA](https://img.shields.io/badge/download-VBA-brightgreen.svg)](https://github.com/aduguid/ServerActions/raw/master/VBA/ServerActions.xlam?raw=true "Download the VBA Add-In").
-2. Copy the file to the XLSTART ```%AppData%\Microsoft\Excel\XLSTART\``` folder on your computer.
+1. Download the VBA Add-In file [![download VBA](https://img.shields.io/badge/download-VBA-brightgreen.svg)](https://github.com/Excel-projects/Server-Help/raw/master/VBA/ServerHelp.xlam?raw=true "Download the VBA Add-In").
+2. Copy the file to the XLSTART folder on your computer. ```%AppData%\Microsoft\Excel\XLSTART\```
 3. Close all open instances of Excel and then launch Excel. The new ribbon should appear.
 
 ### VSTO
 How to install the VSTO version
-1. Download AnthonyDuguid.pfx And Install At Root Level [![download Key](https://img.shields.io/badge/download-Key-brightgreen.svg)](https://github.com/aduguid/ServerActions/VB/blob/master/AnthonyDuguid.pfx?raw=true "Download AnthonyDuguid.pfx And Install At Root Level For VSTO")
-2. Download and run the setup.exe file. ```TODO: publish .NET to GitHub```
-<!---
-[![download VSTO](https://img.shields.io/badge/download-VSTO-brightgreen.svg)](https://github.com/aduguid/ServerActions/VB/blob/master/publish/setup.exe?raw=true "Download Setup.exe Install File")
---->
+1. Download AnthonyDuguid.pfx And Install At Root Level [![download Key](https://img.shields.io/badge/download-Key-brightgreen.svg)](https://github.com/Excel-projects/Server-Help/blob/master/VB/AnthonyDuguid.pfx?raw=true "Download AnthonyDuguid.pfx And Install At Root Level For VSTO")
+2. Download and run the setup.exe file.
+[![download VSTO](https://img.shields.io/badge/download-VSTO-brightgreen.svg)](https://github.com/Excel-projects/Server-Help/blob/master/VB/publish/setup.exe?raw=true "Download Setup.exe Install File")
 
 <br>
 
@@ -85,9 +78,9 @@ How to install the VSTO version
 ## Dependencies
 |Software                        |Dependency                 |Project                    |
 |:-------------------------------|:--------------------------|:--------------------------|
-|[Microsoft Visual Studio Community 2017](https://www.visualstudio.com/vs/whatsnew/)|Solution|VSTO|
-|[Microsoft Office Developer Tools](https://blogs.msdn.microsoft.com/visualstudio/2015/11/23/latest-microsoft-office-developer-tools-for-visual-studio-2015/)|Solution|VSTO|
-|[Microsoft Excel 2010 (or later)](https://www.microsoft.com/en-au/software-download/office)|Project|VBA, VSTO|
+|[Microsoft Visual Studio](https://www.visualstudio.com/vs/whatsnew/)|Solution|VSTO|
+|[Microsoft Office Developer Tools](https://visualstudio.microsoft.com/vs/features/office-tools/)|Solution|VSTO|
+|[Microsoft Excel](https://www.microsoft.com/en-au/software-download/office)|Project|VBA, VSTO|
 |[Visual Basic for Applications](https://msdn.microsoft.com/en-us/vba/vba-language-reference)|Code|VBA|
 |[Extensible Markup Language (XML)](https://www.rondebruin.nl/win/s2/win001.htm)|Ribbon|VBA, VSTO|
 |[Remote Desktop Manager](https://www.microsoft.com/en-au/download/details.aspx?id=44989)|Export File|VBA, VSTO|
@@ -178,19 +171,9 @@ This Excel ribbon is inserted after the “Home” tab when Excel opens. Listed
 ####	Refresh Dropdowns (Button)
 * Refreshes all the dropdown values from the active table column names.
 
-<a id="user-content-settings" class="anchor" href="#settings" aria-hidden="true"> </a>
-####	Add-In Settings (Button)
-* Opens the settings form
-
-<h1 align="left">
-  <img src="Images/ReadMe/settings2.0.png" alt="settings" />
-</h1>
-
 <a id="user-content-help" class="anchor" href="#help" aria-hidden="true"> </a>
 ###	Help (Group)
-<h1 align="left">
-  <img src="Images/ReadMe/ribbon.group.help.png" alt="help" />
-</h1>
+
 
 <a id="user-content-how-to" class="anchor" href="#how-to" aria-hidden="true"> </a>
 ####	How To... (Button)
@@ -200,9 +183,48 @@ This Excel ribbon is inserted after the “Home” tab when Excel opens. Listed
 ####	Report Issue (Button)
 * Opens the new issue page in a browser
 
-<a id="user-content-new-version" class="anchor" href="#new-version" aria-hidden="true"> </a>
-####	New Version Is Available (Button)
-* This button is visible if the version of the Add-In is different from the one in the Read Me page. It will download a new version from the site when pressed.
+<a id="user-content-settings" class="anchor" href="#settings" aria-hidden="true"> </a>
+####	Add-In Settings (Button)
+* Opens the settings form/taskpane
+
+<kbd>
+VSTO
+<br>
+  <img align="left" src="Images/ReadMe/vsto.ribbon.settings.png" />
+</kbd>
+
+- Types of VSTO Settings
+  - Application Settings
+    - These settings can only be changed in the project and need to be redeployed
+    - They will appear disabled in the form
+  - User Settings
+    - These settings can be changed by the end-user
+    - They will appear enabled in the form
+    
+<kbd>
+VBA
+<br>
+  <img align="left" src="Images/ReadMe/vba.ribbon.settings.png" />
+</kbd>
+
+- VBA Settings
+  - To add a new setting
+    ```vbnet
+    ThisWorkbook.CustomDocumentProperties.Add _
+    Name:="App_ReleaseDate" _
+    , LinkToContent:=False _
+    , Type:=msoPropertyTypeDate _
+    , Value:="31-Jul-2017 1:05pm"
+    ```
+  - To update a setting
+    ```vbnet
+    ThisWorkbook.CustomDocumentProperties.Item("App_ReleaseDate").Value = "31-Jul-2017 1:05pm"
+    ```
+  - To delete a setting
+    ```vbnet
+    ThisWorkbook.CustomDocumentProperties.Item("App_ReleaseDate").Delete
+    ```
+    
 
 <a id="user-content-about" class="anchor" href="#about" aria-hidden="true"> </a>
 ###	About (Group)
diff --git a/VB/My Project/AssemblyInfo.vb b/VB/My Project/AssemblyInfo.vb
index 75e3cb4..4d6dbf2 100644
--- a/VB/My Project/AssemblyInfo.vb	
+++ b/VB/My Project/AssemblyInfo.vb	
@@ -9,10 +9,10 @@ Imports System.Security
 
 ' Review the values of the assembly attributes
 
-<Assembly: AssemblyTitle("Server Actions")>
-<Assembly: AssemblyDescription("Excel Addin Server Actions")>
+<Assembly: AssemblyTitle("Server Help")>
+<Assembly: AssemblyDescription("Excel Addin Server Help")>
 <Assembly: AssemblyCompany("Anthony Duguid")>
-<Assembly: AssemblyProduct("ServerActions")>
+<Assembly: AssemblyProduct("ServerHelp")>
 <Assembly: AssemblyCopyright("Anthony Duguid")>
 <Assembly: AssemblyTrademark("")> 
 
@@ -35,8 +35,8 @@ Imports System.Security
 ' by using the '*' as shown below:
 ' <Assembly: AssemblyVersion("1.0.*")> 
 
-<Assembly: AssemblyVersion("2.0.0.0")>
-<Assembly: AssemblyFileVersion("2.0.0.0")>
+<Assembly: AssemblyVersion("2.0.0.2")>
+<Assembly: AssemblyFileVersion("2.0.0.2")>
 
 Friend Module DesignTimeConstants
     Public Const RibbonTypeSerializer As String = "Microsoft.VisualStudio.Tools.Office.Ribbon.Serialization.RibbonTypeCodeDomSerializer, Microsoft.VisualStudio.Tools.Office.Designer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
diff --git a/VB/My Project/Settings.Designer.vb b/VB/My Project/Settings.Designer.vb
index a2b8fae..f47bb8e 100644
--- a/VB/My Project/Settings.Designer.vb	
+++ b/VB/My Project/Settings.Designer.vb	
@@ -64,7 +64,7 @@ Partial Friend NotInheritable Class MySettings
     
     <Global.System.Configuration.UserScopedSettingAttribute(),  _
      Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
-     Global.System.Configuration.DefaultSettingValueAttribute("https://github.com/aduguid/ServerActions/blob/master/README.md")>  _
+     Global.System.Configuration.DefaultSettingValueAttribute("https://github.com/Excel-projects/Server-Help/blob/master/README.md")>  _
     Public Property App_PathReadMe() As String
         Get
             Return CType(Me("App_PathReadMe"),String)
@@ -136,7 +136,7 @@ Partial Friend NotInheritable Class MySettings
     
     <Global.System.Configuration.UserScopedSettingAttribute(),  _
      Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
-     Global.System.Configuration.DefaultSettingValueAttribute("https://github.com/aduguid/ServerActions/issues/new")>  _
+     Global.System.Configuration.DefaultSettingValueAttribute("https://github.com/Excel-projects/Server-Help/issues/new")>  _
     Public Property App_PathNewIssue() As String
         Get
             Return CType(Me("App_PathNewIssue"),String)
@@ -148,7 +148,7 @@ Partial Friend NotInheritable Class MySettings
     
     <Global.System.Configuration.UserScopedSettingAttribute(),  _
      Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
-     Global.System.Configuration.DefaultSettingValueAttribute("07/31/2017 12:00:00")>  _
+     Global.System.Configuration.DefaultSettingValueAttribute("11/02/2018 12:00:00")>  _
     Public Property App_ReleaseDate() As Date
         Get
             Return CType(Me("App_ReleaseDate"),Date)
@@ -172,7 +172,7 @@ Partial Friend NotInheritable Class MySettings
     
     <Global.System.Configuration.UserScopedSettingAttribute(),  _
      Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
-     Global.System.Configuration.DefaultSettingValueAttribute("LDAP://OU=Servers,OU=FT,DC=federationtraining,DC=edu,DC=au")>  _
+     Global.System.Configuration.DefaultSettingValueAttribute("LDAP://OU=Servers,...")>  _
     Public Property Rdg_LdapPath() As String
         Get
             Return CType(Me("Rdg_LdapPath"),String)
diff --git a/VB/My Project/Settings.settings b/VB/My Project/Settings.settings
index 7805b60..d67a366 100644
--- a/VB/My Project/Settings.settings	
+++ b/VB/My Project/Settings.settings	
@@ -6,7 +6,7 @@
       <Value Profile="(Default)">Anthony Duguid</Value>
     </Setting>
     <Setting Name="App_PathReadMe" Type="System.String" Scope="User">
-      <Value Profile="(Default)">https://github.com/aduguid/ServerActions/blob/master/README.md</Value>
+      <Value Profile="(Default)">https://github.com/Excel-projects/Server-Help/blob/master/README.md</Value>
     </Setting>
     <Setting Name="Ping_ServerName" Type="System.String" Scope="User">
       <Value Profile="(Default)">dNSHostname</Value>
@@ -24,16 +24,16 @@
       <Value Profile="(Default)">C:\Temp\Test.rdg</Value>
     </Setting>
     <Setting Name="App_PathNewIssue" Type="System.String" Scope="User">
-      <Value Profile="(Default)">https://github.com/aduguid/ServerActions/issues/new</Value>
+      <Value Profile="(Default)">https://github.com/Excel-projects/Server-Help/issues/new</Value>
     </Setting>
     <Setting Name="App_ReleaseDate" Type="System.DateTime" Scope="User">
-      <Value Profile="(Default)">07/31/2017 12:00:00</Value>
+      <Value Profile="(Default)">11/02/2018 12:00:00</Value>
     </Setting>
     <Setting Name="Rdg_Comment" Type="System.String" Scope="User">
       <Value Profile="(Default)">OperatingSystem</Value>
     </Setting>
     <Setting Name="Rdg_LdapPath" Type="System.String" Scope="User">
-      <Value Profile="(Default)">LDAP://OU=Servers,OU=FT,DC=federationtraining,DC=edu,DC=au</Value>
+      <Value Profile="(Default)">LDAP://OU=Servers,...</Value>
     </Setting>
     <Setting Name="Rdg_LdapQry" Type="System.String" Scope="User">
       <Value Profile="(Default)">SELECT whenCreated, whenChanged, distinguishedName, OperatingSystem, OperatingSystemVersion, dNSHostname, Name, CN FROM '[Rdg.LdapPath]' WHERE objectClass = 'computer'</Value>
diff --git a/VB/Ribbon.xml b/VB/Ribbon.xml
index 87e796a..c0aec25 100644
--- a/VB/Ribbon.xml
+++ b/VB/Ribbon.xml
@@ -25,7 +25,6 @@
 							idMso="RemoveDuplicates"
 							size="large"
 							/>
-
 				</group>
 				<group
 						id="grpPing"
@@ -146,15 +145,6 @@
 						id="grpOptions"
 						imageMso="PropertySheet"
 						>
-					<button
-							id="btnSettings"
-							label="Add-In Settings"
-							onAction="OnAction"
-							imageMso="PropertySheet"
-							size="large"
-							screentip="Setting Form"
-							supertip="This opens the settings form. The settings are stored as custom properties and can be changed by double-clicking the item or using the update button."
-							/>
 					<button 
 							id="btnRefreshServerList" 
 							label="Rebuild Server List" 
@@ -183,18 +173,30 @@
 							label="How To...   "
 							onAction="OnAction"
 							imageMso="Help"
-							size="large"
+							size="normal"
 							screentip="How To..."
 							supertip="This opens the read me page in GitHub with detailed instructions of the Add-In functionality."
+              keytip="HLP"
 							/>
 					<button
 							id="btnOpenNewIssue"
 							label="Report Issue"
 							onAction="OnAction"
 							imageMso="MacroSecurity"
-							size="large"
+							size="normal"
 							screentip="Report An Issue"
 							supertip="This will open a new issue page in GitHub. The user will need to login to raise an issue."
+              keytip="RPT"
+							/>
+					<button
+							id="btnSettings"
+							label="Settings"
+							onAction="OnAction"
+							imageMso="PropertySheet"
+							size="normal"
+							screentip="Add-In Settings Form"
+							supertip="This opens a user form with a list of custom properties stored in the file."
+              keytip="SET"
 							/>
 				</group>
 				<group
@@ -204,26 +206,32 @@
 					<labelControl
 							id="lblDescription"
 							label="Add-In Name:"
+							enabled="false"
 							/>
 					<labelControl
 							id="lblReleaseDate"
 							label="Release Date: "
+							enabled="false"
 							/>
 					<labelControl
 							id="lblCopyright"
 							label="Copyright: "
+							enabled="false"
 							/>
 					<labelControl
 							id="txtDescription"
 							getLabel="GetLabelText"
+							enabled="false"
 							/>
 					<labelControl
 							id="txtReleaseDate"
 							getLabel="GetLabelText"
+							enabled="false"
 							/>
 					<labelControl
 							id="txtCopyright"
 							getLabel="GetLabelText"
+							enabled="false"
 							/>
 				</group>
 
diff --git a/VB/Scripts/AssemblyInfo.vb b/VB/Scripts/AssemblyInfo.vb
index 7a94750..82e9b51 100644
--- a/VB/Scripts/AssemblyInfo.vb
+++ b/VB/Scripts/AssemblyInfo.vb
@@ -16,7 +16,7 @@ Namespace Scripts
                 currentForm.Icon = Icon.FromHandle(bmp.GetHicon)
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 Exit Try
 
             End Try
@@ -54,7 +54,7 @@ Namespace Scripts
                         End If
                     Next
                 Catch ex As Exception
-                    Call ErrorHandler.DisplayMessage(ex)
+                    ErrorHandler.DisplayMessage(ex)
                 End Try
             End If
         End Sub
diff --git a/VB/Scripts/ErrorHandler.vb b/VB/Scripts/ErrorHandler.vb
index cff1994..ecda6f8 100644
--- a/VB/Scripts/ErrorHandler.vb
+++ b/VB/Scripts/ErrorHandler.vb
@@ -4,7 +4,6 @@ Option Explicit On
 Imports System.Environment
 Imports System.Windows.Forms
 Imports log4net
-'Imports log4net.Config 'needed if you want to change the path of the log file at runtime
 
 <Assembly: log4net.Config.XmlConfigurator(Watch:=True)>
 
@@ -27,16 +26,18 @@ Namespace Scripts
 
         End Sub
 
-        Public Shared Sub DisplayMessage(ex As Exception, Optional isSilent As [Boolean] = False)
+        Public Shared Sub DisplayMessage(ex As Exception, Optional isSilent As Boolean = False)
             Dim sf As New System.Diagnostics.StackFrame(1)
             Dim caller As System.Reflection.MethodBase = sf.GetMethod()
             Dim currentProcedure As String = (caller.Name).Trim()
             Dim currentFileName As String = "" 'AssemblyInfo.GetCurrentFileName()
             Dim errorMessageDescription As String = ex.ToString()
             errorMessageDescription = System.Text.RegularExpressions.Regex.Replace(errorMessageDescription, "\r\n+", " ")
+
             Dim msg As String = "Contact your system administrator. A record has been created in the log file." + Environment.NewLine
             msg += (Convert.ToString("Procedure: ") & currentProcedure) + Environment.NewLine
             msg += "Description: " + ex.ToString() + Environment.NewLine
+
             log.Error("[PROCEDURE]=|" + currentProcedure + "|[USER NAME]=|" + Environment.UserName + "|[MACHINE NAME]=|" + Environment.MachineName + "|[DESCRIPTION]=|" + errorMessageDescription)
             If isSilent = False Then
                 MessageBox.Show(msg, "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
diff --git a/VB/Scripts/Ribbon.vb b/VB/Scripts/Ribbon.vb
index b84cdd9..b212a33 100644
--- a/VB/Scripts/Ribbon.vb
+++ b/VB/Scripts/Ribbon.vb
@@ -2,13 +2,10 @@
 Option Explicit On
 
 Imports System.Windows.Forms
+Imports System.Management
 
 Namespace Scripts
 
-    ''' <summary>
-    ''' The ribbon code used for the addin
-    ''' </summary>
-    ''' <remarks></remarks>
     <Runtime.InteropServices.ComVisible(True)>
     Public Class Ribbon
         Implements Office.IRibbonExtensibility
@@ -41,7 +38,7 @@ Namespace Scripts
                 ribbonref = Me
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
@@ -69,8 +66,11 @@ Namespace Scripts
         End Function
 
         Public Function GetItemLabel(control As Office.IRibbonControl, index As Integer) As String
-            Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveCell.ActiveCell.ListObject
+            Dim tbl As Excel.ListObject = Nothing
             Try
+                If ErrorHandler.IsValidListObject Then
+                    tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject
+                End If
                 If (tbl Is Nothing) Or index = 0 Then
                     ErrorHandler.CreateLogRecord("EMPTY")
                     Return String.Empty
@@ -79,7 +79,7 @@ Namespace Scripts
                 Return tbl.ListColumns(index).Name
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 Return "ERROR"
 
             Finally
@@ -90,8 +90,11 @@ Namespace Scripts
         End Function
 
         Public Function GetItemCount(control As Office.IRibbonControl) As Integer
-            Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveCell.ListObject
+            Dim tbl As Excel.ListObject = Nothing
             Try
+                If ErrorHandler.IsValidListObject Then
+                    tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject
+                End If
                 If (tbl Is Nothing) Then
                     Return 2
                 Else
@@ -99,7 +102,7 @@ Namespace Scripts
                 End If
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 Return 0
 
             Finally
@@ -112,38 +115,38 @@ Namespace Scripts
         Public Function GetLabelText(ByVal control As Office.IRibbonControl) As String
             Try
                 Select Case control.Id.ToString
-                    Case Is = "tabServerActions"
+                    Case "tabServerActions"
                         If Application.ProductVersion.Substring(0, 2) = "15" Then
                             Return My.Application.Info.Title.ToUpper()
                         Else
                             Return My.Application.Info.Title
                         End If
-                    Case Is = "txtCopyright"
+                    Case "txtCopyright"
                         Return "© " & My.Application.Info.Copyright.ToString
-                    Case Is = "txtDescription"
+                    Case "txtDescription"
                         Dim version As String = My.Application.Info.Version.Major & "." & My.Application.Info.Version.Minor & "." & My.Application.Info.Version.Build & "." & My.Application.Info.Version.Revision
                         Return My.Application.Info.Title.ToString.Replace("&", "&&") & Space(1) & version
-                    Case Is = "txtReleaseDate"
+                    Case "txtReleaseDate"
                         Return My.Settings.App_ReleaseDate.ToString("dd-MMM-yyyy hh:mm tt")
-                    Case Is = "cboServerName"
+                    Case "cboServerName"
                         Return My.Settings.Ping_ServerName
-                    Case Is = "cboRdgServer"
+                    Case "cboRdgServer"
                         Return My.Settings.Rdg_ServerName
-                    Case Is = "cboPingName"
+                    Case "cboPingName"
                         Return My.Settings.Ping_Results
-                    Case Is = "cboRdgDescription"
+                    Case "cboRdgDescription"
                         Return My.Settings.Rdg_Description
-                    Case Is = "cboRdgComment"
+                    Case "cboRdgComment"
                         Return My.Settings.Rdg_Comment
-                    Case Is = "cboRdgGroup"
+                    Case "cboRdgGroup"
                         Return My.Settings.Rdg_ServerGroup
-                    Case Is = "txtFileName"
+                    Case "txtFileName"
                         Return My.Settings.Rdg_FileName
                 End Select
                 Return String.Empty
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 Return String.Empty
 
             End Try
@@ -175,34 +178,17 @@ Namespace Scripts
         Public Sub OnAction(ByVal control As Office.IRibbonControl)
             Try
                 Select Case control.Id
-                    Case "btnPing"
-                        Call Ribbon_Button.AddPingColumn()
-
-                    Case "btnCreateRdgFile"
-                        Call Ribbon_Button.CreateRdgFile()
-
-                    Case "btnDownloadNewVersion"
-                        Call Ribbon_Button.DownloadNewVersion()
-
-                    Case "btnOpenNewIssue"
-                        Call Ribbon_Button.OpenNewIssue()
-
-                    Case "btnOpenReadMe"
-                        Call Ribbon_Button.OpenReadMe()
-
-                    Case "btnSettings"
-                        Call Ribbon_Button.OpenSettings()
-
-                    Case "btnRefreshCombobox"
-                        Call Ribbon_Button.RefreshCombobox()
-
-                    Case "btnRefreshServerList"
-                        Call Ribbon_Button.RefreshServerList()
-
+                    Case "btnPing" : Ribbon_Button.AddPingColumn()
+                    Case "btnCreateRdgFile" : Ribbon_Button.CreateRdgFile()
+                    Case "btnOpenNewIssue" : Ribbon_Button.OpenNewIssue()
+                    Case "btnOpenReadMe" : Ribbon_Button.OpenReadMe()
+                    Case "btnSettings" : Ribbon_Button.OpenSettings()
+                    Case "btnRefreshCombobox" : Ribbon_Button.RefreshCombobox()
+                    Case "btnRefreshServerList" : Ribbon_Button.RefreshServerList()
                 End Select
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
@@ -210,23 +196,16 @@ Namespace Scripts
 
         Private Sub OnChange(ByVal control As Office.IRibbonControl, ByRef text As String)
             Try
-
                 Select Case control.Id
-                    Case Is = "cboServerName"
-                        My.Settings.Ping_ServerName = text
-                    Case Is = "cboPingName"
-                        My.Settings.Ping_Results = text
-                    Case Is = "cboRdgServer"
-                        My.Settings.Rdg_ServerName = text
-                    Case Is = "cboRdgDescription"
-                        My.Settings.Rdg_Description = text
-                    Case Is = "txtFileName"
-                        My.Settings.Rdg_FileName = text
+                    Case "cboServerName" : My.Settings.Ping_ServerName = text
+                    Case "cboPingName" : My.Settings.Ping_Results = text
+                    Case "cboRdgServer" : My.Settings.Rdg_ServerName = text
+                    Case "cboRdgDescription" : My.Settings.Rdg_Description = text
+                    Case "txtFileName" : My.Settings.Rdg_FileName = text
                 End Select
 
-
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
@@ -237,7 +216,7 @@ Namespace Scripts
                 GetItem = col(key)
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 GetItem = Nothing
 
             End Try
@@ -245,9 +224,8 @@ Namespace Scripts
         End Function
 
         Public Shared Sub ClearSheetContents()
-            Dim wb As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
-            Dim ws As Excel.Worksheet = wb.ActiveSheet
             Try
+                Dim ws As Excel.Worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet, Excel.Worksheet)
                 ws.Cells.Clear() 'To clear only content (no formats) use;
                 ws.Cells.ClearContents() 'To Clear only formats use;
                 ws.Cells.ClearFormats() 'To clear only cell comments use
@@ -257,27 +235,21 @@ Namespace Scripts
                 'ws.UsedRange 'resets the last cell reference
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
-
-            Finally
-                ws = Nothing
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
         End Sub
 
-        Public Shared Sub CreateTableFromRange(Optional ByVal FirstCellName As String = "A1", Optional ByVal TableStyleName As String = "TableStyleMedium15")
-            Dim tbl As Excel.ListObject
-            Dim rng As Excel.Range
+        Public Shared Sub FormatTableFromRange(Optional ByVal FirstCellName As String = "A1", Optional ByVal TableStyleName As String = "TableStyleMedium15")
             Try
-                rng = Globals.ThisAddIn.Application.ActiveSheet.Range(Globals.ThisAddIn.Application.ActiveSheet.Range(FirstCellName), Globals.ThisAddIn.Application.ActiveSheet.Range(FirstCellName).SpecialCells(Excel.Constants.xlLastCell))
-                tbl = Globals.ThisAddIn.Application.ActiveSheet.ListObjects.Add(Excel.XlListObjectSourceType.xlSrcRange, rng, , Excel.XlYesNoGuess.xlYes)
+                Dim rng As Excel.Range = Globals.ThisAddIn.Application.ActiveSheet.Range(Globals.ThisAddIn.Application.ActiveSheet.Range(FirstCellName), Globals.ThisAddIn.Application.ActiveSheet.Range(FirstCellName).SpecialCells(Excel.Constants.xlLastCell))
+                Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveSheet.ListObjects.Add(Excel.XlListObjectSourceType.xlSrcRange, rng, , Excel.XlYesNoGuess.xlYes)
                 tbl.TableStyle = TableStyleName
                 tbl.Name = My.Settings.Rdg_SheetName
                 Globals.ThisAddIn.Application.Columns.AutoFit()
 
-                Dim r As Excel.Range
-                r = Globals.ThisAddIn.Application.ActiveCell
+                Dim r As Excel.Range = Globals.ThisAddIn.Application.ActiveCell
                 Globals.ThisAddIn.Application.ActiveSheet.Range("C2").Select
                 With Globals.ThisAddIn.Application.ActiveWindow
                     .FreezePanes = False
@@ -289,117 +261,107 @@ Namespace Scripts
                 r.Select()
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
-
-            Finally
-                tbl = Nothing
-                rng = Nothing
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
         End Sub
 
-        Public Shared Function GetPingResult(hostName As String) As String
-            Dim ping As Object
-            Dim status As Object
-            Dim result As String = String.Empty
+        Public Shared Function GetPingResult(ByVal hostName As String) As String
+            Dim resultText As String = String.Empty
             Dim dateFormat As String = "dd-MMM-yyyy HH:mm:ss"
+
             Try
-                ping = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("Select * from Win32_PingStatus Where Address = '" & hostName & "'")
-
-                For Each status In ping
-                    Select Case status.StatusCode
-                        Case 0 : result = "Connected"
-                        Case 11001 : result = "Buffer too small"
-                        Case 11002 : result = "Destination net unreachable"
-                        Case 11003 : result = "Destination host unreachable"
-                        Case 11004 : result = "Destination protocol unreachable"
-                        Case 11005 : result = "Destination port unreachable"
-                        Case 11006 : result = "No resources"
-                        Case 11007 : result = "Bad option"
-                        Case 11008 : result = "Hardware error"
-                        Case 11009 : result = "Packet too big"
-                        Case 11010 : result = "Request timed out"
-                        Case 11011 : result = "Bad request"
-                        Case 11012 : result = "Bad route"
-                        Case 11013 : result = "Time-To-Live (TTL) expired transit"
-                        Case 11014 : result = "Time-To-Live (TTL) expired reassembly"
-                        Case 11015 : result = "Parameter problem"
-                        Case 11016 : result = "Source quench"
-                        Case 11017 : result = "Option too big"
-                        Case 11018 : result = "Bad destination"
-                        Case 11032 : result = "Negotiating IPSEC"
-                        Case 11050 : result = "General failure"
-                        Case Else : result = "Unknown host"
-                    End Select
+                Dim query As SelectQuery = New SelectQuery("Win32_PingStatus", "Address='" & hostName & "'")
+                Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher(query)
+
+                For Each result As ManagementObject In searcher.[Get]()
+                    If result("StatusCode") IsNot Nothing Then
+                        Select Case CType(result("StatusCode"), UInt32)
+                            Case 0 : resultText = "Connected"
+                            Case 11001 : resultText = "Buffer too small"
+                            Case 11002 : resultText = "Destination net unreachable"
+                            Case 11003 : resultText = "Destination host unreachable"
+                            Case 11004 : resultText = "Destination protocol unreachable"
+                            Case 11005 : resultText = "Destination port unreachable"
+                            Case 11006 : resultText = "No resources"
+                            Case 11007 : resultText = "Bad option"
+                            Case 11008 : resultText = "Hardware error"
+                            Case 11009 : resultText = "Packet too big"
+                            Case 11011 : resultText = "Bad request"
+                            Case 11012 : resultText = "Bad route"
+                            Case 11013 : resultText = "Time-To-Live (TTL) expired transit"
+                            Case 11014 : resultText = "Time-To-Live (TTL) expired reassembly"
+                            Case 11015 : resultText = "Parameter problem"
+                            Case 11016 : resultText = "Source quench"
+                            Case 11017 : resultText = "Option too big"
+                            Case 11018 : resultText = "Bad destination"
+                            Case 11032 : resultText = "Negotiating IPSEC"
+                            Case 11050 : resultText = "General failure"
+                            Case Else : resultText = "Unknown host"
+                        End Select
+
+                    Else
+                        resultText = "Unknown host"
+
+                    End If
                 Next
-                Return result & " : " & Format(Now(), dateFormat)
+
+                Return resultText & " : " & DateTime.Now.ToString(dateFormat)
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 Return "Error: " & ex.ToString()
 
-            Finally
-                ping = Nothing
-                status = Nothing
-
             End Try
 
         End Function
 
         Public Shared Sub OpenFile(ByVal fileName As String)
-            Dim pStart As New System.Diagnostics.Process
+            Dim myProcess As New System.Diagnostics.Process
             Try
                 If fileName = String.Empty Then Exit Try
-                pStart.StartInfo.FileName = fileName
-                pStart.Start()
+                myProcess.StartInfo.FileName = fileName
+                myProcess.Start()
 
             Catch ex As System.ComponentModel.Win32Exception
                 'MessageBox.Show("No application is assicated to this file type." & vbCrLf & vbCrLf & pstrFile, "No action taken.", MessageBoxButtons.OK, MessageBoxIcon.Information)
                 Exit Try
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 Exit Try
 
             Finally
-                pStart.Dispose()
+                myProcess.Dispose()
 
             End Try
 
         End Sub
 
-        Public Shared Sub UpdateBlankCells()
-            Dim tbl As Excel.ListObject = Nothing
-            Dim cell As Excel.Range = Nothing
-            Dim usedRange As Excel.Range = Nothing
+        Public Shared Sub UpdateZeroStringToNull()
             Try
-                If ErrorHandler.IsAvailable(True) = False Then
-                    Return
-                End If
-                tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject
-                cell = Nothing
-                Dim cnt As Integer = 0
-                Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
-                usedRange = tbl.Range
-                Dim n As Integer = tbl.ListColumns.Count
-                Dim m As Integer = tbl.ListRows.Count
-                For i As Integer = 0 To m
-                    For j As Integer = 1 To n
-                        If usedRange(i + 1, j).Value2 Is Nothing Then
-                            cell = tbl.Range.Cells(i + 1, j)
-                            cell.Value = "NULL"
-                            cnt = cnt + 1
-                        End If
+                If ErrorHandler.IsAvailable(True) Then
+                    Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
+                    Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveCell.ListObject
+                    Dim usedRange As Excel.Range = tbl.Range
+
+                    For r As Integer = 0 To tbl.ListRows.Count
+                        For c As Integer = 1 To tbl.ListColumns.Count
+                            If usedRange(r + 1, c).Value2 Is Nothing Then
+                                Dim cell As Excel.Range = tbl.Range.Cells(r + 1, c)
+                                cell.Value = "NULL"
+                            End If
+                        Next
                     Next
-                Next
+
+                End If
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             Finally
-                tbl = Nothing
-                cell = Nothing
+                Cursor.Current = System.Windows.Forms.Cursors.Arrow
 
             End Try
 
@@ -422,7 +384,7 @@ Namespace Scripts
                 Return Nothing
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
                 Return Nothing
 
             End Try
@@ -430,26 +392,25 @@ Namespace Scripts
         End Function
 
         Public Shared Sub FormatDateColumns()
-            Dim tbl As Excel.ListObject = Nothing
-            Dim cell As Excel.Range = Nothing
             Dim dateFormat As String = "dd-MMM-yyyy HH:mm:ss"
             Try
-                If ErrorHandler.IsAvailable(True) = False Then
-                    Return
-                End If
-                ErrorHandler.CreateLogRecord()
-                tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject
-                cell = Nothing
-                Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
-                For Each col As Excel.ListColumn In tbl.ListColumns
-                    cell = FirstNotNullCellInColumn(col.DataBodyRange)
-                    If ((cell IsNot Nothing)) Then
-                        If ErrorHandler.IsDate(cell.Value) Then
-                            col.DataBodyRange.NumberFormat = dateFormat
-                            col.DataBodyRange.HorizontalAlignment = Excel.Constants.xlCenter
+                If ErrorHandler.IsAvailable(True) Then
+                    Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
+                    ErrorHandler.CreateLogRecord()
+                    Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveCell.ListObject
+                    Dim cell As Excel.Range = Nothing
+
+                    For Each col As Excel.ListColumn In tbl.ListColumns
+                        cell = FirstNotNullCellInColumn(col.DataBodyRange)
+                        If ((cell IsNot Nothing)) Then
+                            If ErrorHandler.IsDate(cell.Value) Then
+                                col.DataBodyRange.NumberFormat = dateFormat
+                                col.DataBodyRange.HorizontalAlignment = Excel.Constants.xlCenter
+                            End If
                         End If
-                    End If
-                Next
+                    Next
+
+                End If
 
             Catch ex As System.Runtime.InteropServices.COMException
                 ErrorHandler.DisplayMessage(ex)
@@ -459,12 +420,7 @@ Namespace Scripts
 
             Finally
                 Cursor.Current = System.Windows.Forms.Cursors.Arrow
-                If tbl IsNot Nothing Then
-                    'Marshal.ReleaseComObject(tbl)
-                End If
-                If cell IsNot Nothing Then
-                    'Marshal.ReleaseComObject(cell)
-                End If
+
             End Try
 
         End Sub
diff --git a/VB/Scripts/Ribbon_Button.vb b/VB/Scripts/Ribbon_Button.vb
index 290561a..22b3309 100644
--- a/VB/Scripts/Ribbon_Button.vb
+++ b/VB/Scripts/Ribbon_Button.vb
@@ -13,158 +13,102 @@ Namespace Scripts
         Public Shared myTaskPaneSettings As Microsoft.Office.Tools.CustomTaskPane
 
         Public Shared Sub AddPingColumn()
-            Dim lstCol As Excel.ListColumn
-            Dim tbl As Excel.ListObject
-            Dim col As Excel.ListColumn
-            'Dim qt As String
-            Dim a As Object
-            Dim c As Object
-            'Dim cc As Object
-            Dim cnt As Integer
-            Dim i As Integer
-            Dim colServer As String
-            Dim colPing As String
-            Dim cellServer As Excel.Range
-            Dim cellPing As Excel.Range
             Try
+                If ErrorHandler.IsValidListObject Then
+                    Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveCell.ListObject
+                    Dim colResults As Excel.ListColumn = tbl.ListColumns(tbl.Range.Columns.Count)
 
-                colServer = My.Settings.Ping_ServerName
-                colPing = My.Settings.Ping_Results
+                    If colResults.Name <> My.Settings.Ping_Results Then
+                        colResults = tbl.ListColumns.Add
+                        colResults.Name = My.Settings.Ping_Results
+                    End If
 
-                tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject
-                If (tbl Is Nothing) Then
-                    MessageBox.Show("Please select a table.", "No action taken.", MessageBoxButtons.OK, MessageBoxIcon.Information)
-                    Exit Try
-                End If
+                    Dim colServer As Excel.ListColumn = tbl.ListColumns(My.Settings.Ping_ServerName)
 
-                lstCol = Ribbon.GetItem(tbl.ListColumns, colPing)
-                If lstCol Is Nothing Then
-                    lstCol = tbl.ListColumns.Add
-                    lstCol.Name = colPing
-                End If
+                    For r = 1 To tbl.ListRows.Count
+                        If colServer.DataBodyRange.Rows(r).EntireRow.Hidden = False Then
+                            Dim cellServer As Excel.Range = colServer.DataBodyRange.Cells(1).Offset(r - 1, 0)
+                            Dim cellPing As Excel.Range = colResults.DataBodyRange.Cells(1).Offset(r - 1, 0)
+                            cellPing.Value = Ribbon.GetPingResult(cellServer.Value.ToString)
+                        End If
+                    Next
 
-                For Each col In tbl.ListColumns
-                    If col.Name = colServer Then
-                        a = col.DataBodyRange.Value2
-                        For i = LBound(a) To UBound(a)
-                            c = a(i, 1)
-                            cellServer = col.DataBodyRange.Cells(1).Offset(i - 1, 0)
-                            cellPing = lstCol.DataBodyRange.Cells(1).Offset(i - 1, 0)
-                            If col.DataBodyRange.Rows(i).EntireRow.Hidden = False Then
-                                cellPing.Value = Ribbon.GetPingResult(cellServer.Value)
-                            End If
-                            cnt = cnt + 1
-                        Next
-                    End If
-                Next
+                End If
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
-
-            Finally
-                lstCol = Nothing
-                tbl = Nothing
-                col = Nothing
-                cellServer = Nothing
-                cellPing = Nothing
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
         End Sub
 
         Public Shared Sub CreateRdgFile()
-            Dim lstCol As Excel.ListColumn
-            Dim tbl As Excel.ListObject
             Dim col As Excel.ListColumn
+            Dim quote As String : quote = Chr(34)
             Dim a As Object
             Dim c As Object
-            Dim cnt As Integer
             Dim i As Integer
-            Dim colServer As String
-            Dim colDesc As String
-            Dim cellServer As Excel.Range
-            Dim cellDesc As Excel.Range
-            Dim FileName As String
-            Dim script As String
-            Dim Q As String
             Try
-                FileName = My.Settings.Rdg_FileName
-                colServer = My.Settings.Rdg_ServerName
-                colDesc = My.Settings.Rdg_Description
-
-                Q = Chr(34)
-                script = "<?xml version=" & Q & "1.0" & Q & " encoding=" & Q & "UTF-8" & Q & "?>"
-                script += vbCrLf & "<RDCMan programVersion=" & Q & "2.7" & Q & " schemaVersion=" & Q & "3" & Q & ">"
-                script += vbCrLf & "<file>"
-                script += vbCrLf & "<credentialsProfiles />"
-                script += vbCrLf & "<properties>"
-                script += vbCrLf & "<expanded>True</expanded>"
-                script += vbCrLf & "<name>" & My.Application.Info.Title & "</name>"
-                script += vbCrLf & "</properties>"
-
-                tbl = Globals.ThisAddIn.Application.ActiveCell.ListObject
-                If (tbl Is Nothing) Then
-                    MessageBox.Show("Please select a table.", "No action taken.", MessageBoxButtons.OK, MessageBoxIcon.Information)
-                    Exit Try
-                End If
+                If ErrorHandler.IsValidListObject Then
+                    Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveCell.ListObject
+                    Dim script As String = "<?xml version=" + quote + "1.0" + quote + " encoding=" + quote + "UTF-8" + quote + "?>"
+                    script += vbCrLf + "<RDCMan programVersion=" + quote + " 2.7" + quote + " schemaVersion=" + quote + " 3" + quote + ">"
+                    script += vbCrLf + "<file>"
+                    script += vbCrLf + "<credentialsProfiles/>"
+                    script += vbCrLf + "<properties>"
+                    script += vbCrLf + "<expanded>True</expanded>"
+                    script += vbCrLf + "<name>" + My.Application.Info.Title + "</name>"
+                    script += vbCrLf + "</properties>"
+
+                    Dim lstCol As Excel.ListColumn = Ribbon.GetItem(tbl.ListColumns, My.Settings.Rdg_Description)
+
+                    For Each col In tbl.ListColumns
+                        If col.Name = My.Settings.Rdg_ServerName Then
+                            a = col.DataBodyRange.Value2
+                            For i = LBound(a) To UBound(a)
+                                c = a(i, 1)
+                                Dim cellServer As Excel.Range = col.DataBodyRange.Cells(1).Offset(i - 1, 0)
+                                Dim cellDesc As Excel.Range = lstCol.DataBodyRange.Cells(1).Offset(i - 1, 0)
+                                If col.DataBodyRange.Rows(i).EntireRow.Hidden = False Then
+                                    script += vbCrLf + "<server>"
+                                    script += vbCrLf + "<properties>"
+                                    script += vbCrLf + "<displayName>" + cellServer.Value.ToString + " (" + cellDesc.Value.ToString + ")</displayName>"
+                                    script += vbCrLf + "<name>" + cellServer.Value.ToString + "</name>"
+                                    script += vbCrLf + "</properties>"
+                                    script += vbCrLf + "</server>"
+                                End If
+                            Next
+                        End If
+                    Next
+
+                    script += vbCrLf + "</file>"
+                    script += vbCrLf + "<connected/>"
+                    script += vbCrLf + "<favorites/>"
+                    script += vbCrLf + "<recentlyUsed/>"
+                    script += vbCrLf + "</RDCMan>"
+
+                    System.IO.File.WriteAllText(My.Settings.Rdg_FileName, script)
 
-                lstCol = Ribbon.GetItem(tbl.ListColumns, colDesc)
-
-                For Each col In tbl.ListColumns
-                    If col.Name = colServer Then
-                        a = col.DataBodyRange.Value2
-                        For i = LBound(a) To UBound(a)
-                            c = a(i, 1)
-                            cellServer = col.DataBodyRange.Cells(1).Offset(i - 1, 0)
-                            cellDesc = lstCol.DataBodyRange.Cells(1).Offset(i - 1, 0)
-                            If col.DataBodyRange.Rows(i).EntireRow.Hidden = False Then
-                                script += vbCrLf & "<server>"
-                                script += vbCrLf & "<properties>"
-                                script += vbCrLf & "<displayName>" & cellServer.Value & " (" & cellDesc.Value & ")</displayName>"
-                                script += vbCrLf & "<name>" & cellServer.Value & "</name>"
-                                script += vbCrLf & "</properties>"
-                                script += vbCrLf & "</server>"
-                            End If
-                            cnt = cnt + 1
-                        Next
-                    End If
-                Next
-                script += vbCrLf & "</file>"
-                script += vbCrLf & "<connected />"
-                script += vbCrLf & "<favorites />"
-                script += vbCrLf & "<recentlyUsed />"
-                script += vbCrLf & "</RDCMan>"
-
-                System.IO.File.WriteAllText(FileName, script)
+                End If
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             Finally
-                lstCol = Nothing
-                tbl = Nothing
                 col = Nothing
-                cellServer = Nothing
-                cellDesc = Nothing
 
             End Try
 
         End Sub
 
         Public Shared Sub RefreshCombobox()
-            Dim tbl As Excel.ListObject = Globals.ThisAddIn.Application.ActiveCell.ListObject
             Try
-                If (tbl Is Nothing) Then
-                    MessageBox.Show("Please select a table.", "No action taken.", MessageBoxButtons.OK, MessageBoxIcon.Information)
-                    Exit Try
+                If ErrorHandler.IsValidListObject Then
+                    Ribbon.InvalidateRibbon()
                 End If
-                Ribbon.InvalidateRibbon()
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
-
-            Finally
-                tbl = Nothing
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
@@ -189,7 +133,7 @@ Namespace Scripts
                 End If
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
@@ -197,10 +141,10 @@ Namespace Scripts
 
         Public Shared Sub OpenNewIssue()
             Try
-                Call Ribbon.OpenFile(My.Settings.App_PathNewIssue)
+                Ribbon.OpenFile(My.Settings.App_PathNewIssue)
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
@@ -208,24 +152,23 @@ Namespace Scripts
 
         Public Shared Sub OpenReadMe()
             Try
-                Call Ribbon.OpenFile(My.Settings.App_PathReadMe)
+                Ribbon.OpenFile(My.Settings.App_PathReadMe)
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             End Try
 
         End Sub
 
         Public Shared Sub RefreshServerList()
-
             Dim cn As ADODB.Connection
             Dim rs As ADODB.Recordset
             Dim cmd As ADODB.Command
             Dim wb As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
             Dim ws As Excel.Worksheet
             Dim tbl As Excel.ListObject
-            Dim iCols As Integer = 0
+            Dim i As Integer = 0
             Dim msg As String = String.Empty
             Dim ldapQry As String = My.Settings.Rdg_LdapQry
             Try
@@ -248,32 +191,32 @@ Namespace Scripts
                 Next ws
 
                 If sheetExists = False Then
-                    ws = wb.ActiveSheet
+                    ws = CType(wb.ActiveSheet, Excel.Worksheet)
                     Dim answer As Integer
                     msg = "The sheet named '" & My.Settings.Rdg_SheetName & "' does not exist."
                     msg = msg & vbCrLf & "Would you like to use the current sheet?"
                     answer = MsgBox(msg, vbYesNo + vbQuestion, "Sheet Not Found")
                     'MessageBox.Show(msg, "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
                     If answer = vbYes Then
-                        ws = wb.ActiveSheet
-                        My.Settings.Rdg_SheetName = wb.ActiveSheet.Name
+                        ws = CType(wb.ActiveSheet, Excel.Worksheet)
+                        My.Settings.Rdg_SheetName = ws.Name
                     Else
                         Exit Try
                     End If
                 Else
-                    ws = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(My.Settings.Rdg_SheetName)
+                    ws = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(My.Settings.Rdg_SheetName), Excel.Worksheet)
                 End If
 
-                Globals.ThisAddIn.Application.Sheets(My.Settings.Rdg_SheetName).Activate
-                Call Ribbon.ClearSheetContents()
-                For iCols = 0 To rs.Fields.Count - 1
-                    ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
+                ws.Activate()
+                Ribbon.ClearSheetContents()
+                For i = 0 To rs.Fields.Count - 1
+                    ws.Cells(1, i + 1).Value = rs.Fields(i).Name
                 Next
                 ws.Range(ws.Cells(1, 1), ws.Cells(1, rs.Fields.Count)).Font.Bold = True
                 ws.Range("A2").CopyFromRecordset(rs)
 
-                Ribbon.CreateTableFromRange()
-                Ribbon.UpdateBlankCells()
+                Ribbon.FormatTableFromRange()
+                Ribbon.UpdateZeroStringToNull()
                 Ribbon.FormatDateColumns()
 
                 'create server type column from the first 2 characters of the server name
@@ -287,7 +230,7 @@ Namespace Scripts
                 Ribbon.ActivateTab()
 
             Catch ex As Exception
-                Call ErrorHandler.DisplayMessage(ex)
+                ErrorHandler.DisplayMessage(ex)
 
             Finally
                 wb = Nothing
@@ -300,10 +243,6 @@ Namespace Scripts
 
         End Sub
 
-        Public Shared Sub DownloadNewVersion()
-
-        End Sub
-
     End Class
 
 End Namespace
\ No newline at end of file
diff --git a/VB/ServerActions.vbproj.user b/VB/ServerActions.vbproj.user
deleted file mode 100644
index dae5fa4..0000000
--- a/VB/ServerActions.vbproj.user
+++ /dev/null
@@ -1,8 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <PublishUrlHistory>publish\</PublishUrlHistory>
-    <InstallUrlHistory />
-    <SupportUrlHistory />
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/VB/ServerActions.sln b/VB/ServerHelp.sln
similarity index 82%
rename from VB/ServerActions.sln
rename to VB/ServerHelp.sln
index aea0ec8..6c59cc6 100644
--- a/VB/ServerActions.sln
+++ b/VB/ServerHelp.sln
@@ -1,9 +1,9 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
+VisualStudioVersion = 14.0.25420.1
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ServerActions", "ServerActions.vbproj", "{925B6443-C5D3-4E3C-A454-50B7C20F9364}"
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ServerHelp", "ServerHelp.vbproj", "{925B6443-C5D3-4E3C-A454-50B7C20F9364}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/VB/ServerActions.vbproj b/VB/ServerHelp.vbproj
similarity index 88%
rename from VB/ServerActions.vbproj
rename to VB/ServerHelp.vbproj
index cb03c46..faa74c7 100644
--- a/VB/ServerActions.vbproj
+++ b/VB/ServerHelp.vbproj
@@ -25,26 +25,26 @@
     <ProjectGuid>{925B6443-C5D3-4E3C-A454-50B7C20F9364}</ProjectGuid>
     <OutputType>Library</OutputType>
     <RootNamespace>ServerActions</RootNamespace>
-    <AssemblyName>ServerActions</AssemblyName>
+    <AssemblyName>ServerHelp</AssemblyName>
     <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
     <DefineConstants>VSTO40</DefineConstants>
     <StartupObject>
     </StartupObject>
-    <IsWebBootstrapper>False</IsWebBootstrapper>
+    <IsWebBootstrapper>True</IsWebBootstrapper>
     <BootstrapperEnabled>true</BootstrapperEnabled>
     <PublishUrl>publish\</PublishUrl>
-    <InstallUrl />
+    <InstallUrl>https://github.com/Excel-projects/Server-Help/master/VB/publish/</InstallUrl>
     <TargetCulture>en</TargetCulture>
-    <ApplicationVersion>1.0.0.0</ApplicationVersion>
-    <AutoIncrementApplicationRevision>true</AutoIncrementApplicationRevision>
+    <ApplicationVersion>2.0.0.2</ApplicationVersion>
+    <AutoIncrementApplicationRevision>false</AutoIncrementApplicationRevision>
     <UpdateEnabled>true</UpdateEnabled>
-    <UpdateInterval>7</UpdateInterval>
+    <UpdateInterval>0</UpdateInterval>
     <UpdateIntervalUnits>days</UpdateIntervalUnits>
-    <ProductName>Excel Addin Server Actions</ProductName>
+    <ProductName>Excel Addin Server Help</ProductName>
     <PublisherName>Anthony Duguid</PublisherName>
-    <SupportUrl />
-    <FriendlyName>Excel Addin Server Actions</FriendlyName>
-    <OfficeApplicationDescription />
+    <SupportUrl>https://github.com/Office-projects/Server-Help/blob/master/README.md</SupportUrl>
+    <FriendlyName>Excel Addin Server Help</FriendlyName>
+    <OfficeApplicationDescription>This Add-In pings a list of servers from an Excel table and creates a file for Microsoft Remote Desktop Manager.</OfficeApplicationDescription>
     <LoadBehavior>3</LoadBehavior>
   </PropertyGroup>
   <ItemGroup>
@@ -63,11 +63,6 @@
       <ProductName>Microsoft Visual Studio 2010 Tools for Office Runtime %28x86 and x64%29</ProductName>
       <Install>true</Install>
     </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Windows.Installer.4.5">
-      <Visible>False</Visible>
-      <ProductName>Windows Installer 4.5</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
   </ItemGroup>
   <PropertyGroup>
     <!--
@@ -103,7 +98,7 @@
     <DebugSymbols>true</DebugSymbols>
     <Optimize>false</Optimize>
     <OutputPath>bin\Debug\</OutputPath>
-    <DocumentationFile>ServerActions.xml</DocumentationFile>
+    <DocumentationFile>ServerHelp.xml</DocumentationFile>
     <RegisterForComInterop>false</RegisterForComInterop>
     <RemoveIntegerChecks>false</RemoveIntegerChecks>
     <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
@@ -132,7 +127,7 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>bin\Release\</OutputPath>
-    <DocumentationFile>ServerActions.xml</DocumentationFile>
+    <DocumentationFile>ServerHelp.xml</DocumentationFile>
     <RegisterForComInterop>false</RegisterForComInterop>
     <RemoveIntegerChecks>false</RemoveIntegerChecks>
     <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
@@ -150,6 +145,7 @@
     <Reference Include="System.Data" />
     <Reference Include="System.Deployment" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Management" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
     <Reference Include="System.Core" />
@@ -222,7 +218,9 @@
       <DependentUpon>Settings.vb</DependentUpon>
     </EmbeddedResource>
     <None Include="AnthonyDuguid.pfx" />
-    <None Include="app.config" />
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
     <None Include="packages.config" />
     <None Include="ThisAddIn.Designer.xml">
       <DependentUpon>ThisAddIn.vb</DependentUpon>
@@ -253,7 +251,9 @@
     </Compile>
   </ItemGroup>
   <ItemGroup>
-    <EmbeddedResource Include="Ribbon.xml" />
+    <EmbeddedResource Include="Ribbon.xml">
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <Service Include="{94E38DFF-614B-4CBD-B67C-F211BB35CE8B}" />
@@ -269,11 +269,11 @@
   </ItemGroup>
   <ItemGroup>
     <COMReference Include="ADODB">
-      <Guid>{00000205-0000-0010-8000-00AA006D2EA4}</Guid>
-      <VersionMajor>2</VersionMajor>
-      <VersionMinor>5</VersionMinor>
+      <Guid>{B691E011-1797-432E-907A-4D8C69339129}</Guid>
+      <VersionMajor>6</VersionMajor>
+      <VersionMinor>1</VersionMinor>
       <Lcid>0</Lcid>
-      <WrapperTool>primary</WrapperTool>
+      <WrapperTool>tlbimp</WrapperTool>
       <Isolated>False</Isolated>
       <EmbedInteropTypes>True</EmbedInteropTypes>
     </COMReference>
@@ -308,9 +308,9 @@
   <ProjectExtensions>
     <VisualStudio>
       <FlavorProperties GUID="{BAA0C2D2-18E2-41B9-852F-F413020CAA33}">
-        <ProjectProperties HostName="Excel" HostPackage="{29A7B9D7-A7F1-4328-8EF0-6B2D1A56B2C1}" OfficeVersion="15.0" VstxVersion="4.0" ApplicationType="Excel" Language="vb" TemplatesPath="" DebugInfoExeName="#Software\Microsoft\Office\15.0\Excel\InstallRoot\Path#excel.exe" DebugInfoCommandLine="/x" AddItemTemplatesGuid="{DCFE8D25-4715-4C33-9EAB-A34A9EBC9544}" />
-        <Host Name="Excel" IconIndex="0">
-          <HostItem Name="ThisAddIn" Code="ThisAddIn.vb" CanonicalName="AddIn" CanActivate="false" IconIndex="1" Blueprint="ThisAddIn.Designer.xml" GeneratedCode="ThisAddIn.Designer.vb" />
+        <ProjectProperties HostName="Excel" HostPackage="{29A7B9D7-A7F1-4328-8EF0-6B2D1A56B2C1}" OfficeVersion="15.0" VstxVersion="4.0" ApplicationType="Excel" Language="vb" TemplatesPath="" DebugInfoExeName="#Software\Microsoft\Office\16.0\Excel\InstallRoot\Path#excel.exe" DebugInfoCommandLine="/x" AddItemTemplatesGuid="{DCFE8D25-4715-4C33-9EAB-A34A9EBC9544}" />
+        <Host Name="Excel" PublishedHash="69C324AB27932AA2FBF2B7EA72250886FF164DE6" IconIndex="0">
+          <HostItem Name="ThisAddIn" Code="ThisAddIn.vb" CanonicalName="AddIn" PublishedHash="501F60F3B8BAF1916C7D50AECC5342A51A6B73BE" CanActivate="false" IconIndex="1" Blueprint="ThisAddIn.Designer.xml" GeneratedCode="ThisAddIn.Designer.vb" />
         </Host>
       </FlavorProperties>
     </VisualStudio>
diff --git a/VB/Taskpane/Settings.vb b/VB/Taskpane/Settings.vb
index 4dde8b0..da86678 100644
--- a/VB/Taskpane/Settings.vb
+++ b/VB/Taskpane/Settings.vb
@@ -1,4 +1,4 @@
-﻿'Option Strict On
+﻿Option Strict On
 Option Explicit On
 
 Imports System.Windows.Forms
@@ -74,8 +74,9 @@ Namespace TaskPane
 
         End Sub
 
-        Private Sub pgdSettings_PropertyValueChanged(s As Object, e As PropertyValueChangedEventArgs)
+        Private Sub pgdSettings_PropertyValueChanged(s As Object, e As PropertyValueChangedEventArgs) Handles pgdSettings.PropertyValueChanged
             Try
+                My.Settings.Save()
                 Scripts.Ribbon.InvalidateRibbon()
 
             Catch ex As Exception
diff --git a/VB/ThisAddIn.vb b/VB/ThisAddIn.vb
index f45da1e..eb25a64 100644
--- a/VB/ThisAddIn.vb
+++ b/VB/ThisAddIn.vb
@@ -1,4 +1,7 @@
-﻿Imports ServerActions.Scripts
+﻿Option Strict On
+Option Explicit On
+
+Imports ServerActions.Scripts
 
 Public Class ThisAddIn
 
diff --git a/VB/app.config b/VB/app.config
index 0a19caa..096c965 100644
--- a/VB/app.config
+++ b/VB/app.config
@@ -34,7 +34,7 @@
     <userSettings>
         <ServerActions.MySettings>
             <setting name="App_PathReadMe" serializeAs="String">
-                <value>https://github.com/aduguid/ServerActions/blob/master/README.md</value>
+                <value>https://github.com/Excel-projects/Server-Help/blob/master/README.md</value>
             </setting>
             <setting name="Ping_ServerName" serializeAs="String">
                 <value>dNSHostname</value>
@@ -52,16 +52,16 @@
                 <value>C:\Temp\Test.rdg</value>
             </setting>
             <setting name="App_PathNewIssue" serializeAs="String">
-                <value>https://github.com/aduguid/ServerActions/issues/new</value>
+                <value>https://github.com/Excel-projects/Server-Help/issues/new</value>
             </setting>
             <setting name="App_ReleaseDate" serializeAs="String">
-                <value>07/31/2017 12:00:00</value>
+                <value>11/02/2018 12:00:00</value>
             </setting>
             <setting name="Rdg_Comment" serializeAs="String">
                 <value>OperatingSystem</value>
             </setting>
             <setting name="Rdg_LdapPath" serializeAs="String">
-                <value>LDAP://OU=Servers,OU=FT,DC=federationtraining,DC=edu,DC=au</value>
+                <value>LDAP://OU=Servers,...</value>
             </setting>
             <setting name="Rdg_LdapQry" serializeAs="String">
                 <value>SELECT whenCreated, whenChanged, distinguishedName, OperatingSystem, OperatingSystemVersion, dNSHostname, Name, CN FROM '[Rdg.LdapPath]' WHERE objectClass = 'computer'</value>
diff --git a/VB/packages.config b/VB/packages.config
index a390949..0ffe6c6 100644
--- a/VB/packages.config
+++ b/VB/packages.config
@@ -1,4 +1,4 @@
 ﻿<?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="log4net" version="2.0.8" targetFramework="net452" />
+  <package id="log4net" version="2.0.10" targetFramework="net452" />
 </packages>
\ No newline at end of file
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Common.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Common.dll.deploy
new file mode 100644
index 0000000..f4c9623
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Common.dll.deploy differ
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Common.v4.0.Utilities.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Common.v4.0.Utilities.dll.deploy
new file mode 100644
index 0000000..03a6ef8
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Common.v4.0.Utilities.dll.deploy differ
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Excel.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Excel.dll.deploy
new file mode 100644
index 0000000..4364d5d
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.Excel.dll.deploy differ
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.dll.deploy
new file mode 100644
index 0000000..953f14f
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.dll.deploy differ
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.v4.0.Framework.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.v4.0.Framework.dll.deploy
new file mode 100644
index 0000000..41763d1
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.Office.Tools.v4.0.Framework.dll.deploy differ
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.VisualStudio.Tools.Applications.Runtime.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.VisualStudio.Tools.Applications.Runtime.dll.deploy
new file mode 100644
index 0000000..d0e714b
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/Microsoft.VisualStudio.Tools.Applications.Runtime.dll.deploy differ
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.config.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.config.deploy
new file mode 100644
index 0000000..f62b1d2
--- /dev/null
+++ b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.config.deploy	
@@ -0,0 +1,103 @@
+﻿<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="ServerActions.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="ServerActions.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+        </sectionGroup>
+			<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
+    </configSections>
+    <system.diagnostics>
+        <sources>
+            <!-- This section defines the logging configuration for My.Application.Log -->
+            <source name="DefaultSource" switchName="DefaultSwitch">
+                <listeners>
+                    <add name="FileLog"/>
+                    <!-- Uncomment the below section to write to the Application Event Log -->
+                    <!--<add name="EventLog"/>-->
+                </listeners>
+            </source>
+        </sources>
+        <switches>
+            <add name="DefaultSwitch" value="Information" />
+        </switches>
+        <sharedListeners>
+            <add name="FileLog"
+                 type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+                 initializeData="FileLogWriter"/>
+            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
+            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
+        </sharedListeners>
+    </system.diagnostics>
+    <userSettings>
+        <ServerActions.MySettings>
+            <setting name="App_PathReadMe" serializeAs="String">
+                <value>https://github.com/aduguid/ServerActions/blob/master/README.md</value>
+            </setting>
+            <setting name="Ping_ServerName" serializeAs="String">
+                <value>dNSHostname</value>
+            </setting>
+            <setting name="Ping_Results" serializeAs="String">
+                <value>Results</value>
+            </setting>
+            <setting name="Rdg_ServerName" serializeAs="String">
+                <value>dNSHostname</value>
+            </setting>
+            <setting name="Rdg_Description" serializeAs="String">
+                <value>CN</value>
+            </setting>
+            <setting name="Rdg_FileName" serializeAs="String">
+                <value>C:\Temp\Test.rdg</value>
+            </setting>
+            <setting name="App_PathNewIssue" serializeAs="String">
+                <value>https://github.com/aduguid/ServerActions/issues/new</value>
+            </setting>
+            <setting name="App_ReleaseDate" serializeAs="String">
+                <value>07/31/2017 12:00:00</value>
+            </setting>
+            <setting name="Rdg_Comment" serializeAs="String">
+                <value>OperatingSystem</value>
+            </setting>
+            <setting name="Rdg_LdapPath" serializeAs="String">
+                <value>LDAP://OU=Servers,...</value>
+            </setting>
+            <setting name="Rdg_LdapQry" serializeAs="String">
+                <value>SELECT whenCreated, whenChanged, distinguishedName, OperatingSystem, OperatingSystemVersion, dNSHostname, Name, CN FROM '[Rdg.LdapPath]' WHERE objectClass = 'computer'</value>
+            </setting>
+            <setting name="Rdg_ServerGroup" serializeAs="String">
+                <value>ServerType</value>
+            </setting>
+            <setting name="Rdg_SheetName" serializeAs="String">
+                <value>Servers</value>
+            </setting>
+        </ServerActions.MySettings>
+    </userSettings>
+    <applicationSettings>
+        <ServerActions.MySettings>
+            <setting name="App_Author" serializeAs="String">
+                <value>Anthony Duguid</value>
+            </setting>
+        </ServerActions.MySettings>
+    </applicationSettings>
+	<log4net>
+		<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
+			<layout type="log4net.Layout.PatternLayout">
+				<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline"/>
+			</layout>
+		</appender>
+		<appender name="FileAppender" type="log4net.Appender.FileAppender">
+			<file value="C:\Temp\excel_addin.server_actions.log"/>
+			<appendToFile value="true"/>
+			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
+			<layout type="log4net.Layout.PatternLayout">
+				<conversionPattern value="%date|%-5level|%message%newline"/>
+			</layout>
+		</appender>
+		<root>
+			<level value="ALL"/>
+			<appender-ref ref="FileAppender"/>
+		</root>
+	</log4net>
+</configuration>
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.deploy
new file mode 100644
index 0000000..05f8c87
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.deploy differ
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.manifest b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.manifest
new file mode 100644
index 0000000..c475bdc
--- /dev/null
+++ b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.dll.manifest	
@@ -0,0 +1,175 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
+  <asmv1:assemblyIdentity name="ServerActions.dll" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" type="win32" />
+  <description xmlns="urn:schemas-microsoft-com:asm.v1">This is an Excel VSTO Add-In written in Microsoft Visual Studio Community 2017 .NET. It allows the user to use an Excel table to ping a list of servers and create a file for Microsoft Remote Desktop Manager.</description>
+  <application />
+  <entryPoint>
+    <co.v1:customHostSpecified />
+  </entryPoint>
+  <trustInfo>
+    <security>
+      <applicationRequestMinimum>
+        <PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
+        <defaultAssemblyRequest permissionSetReference="Custom" />
+      </applicationRequestMinimum>
+      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+        <!--
+          UAC Manifest Options
+          If you want to change the Windows User Account Control level replace the 
+          requestedExecutionLevel node with one of the following.
+
+        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
+        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
+        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
+
+         If you want to utilize File and Registry Virtualization for backward 
+         compatibility then delete the requestedExecutionLevel node.
+    -->
+        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  <dependency>
+    <dependentOS>
+      <osVersionInfo>
+        <os majorVersion="5" minorVersion="1" buildNumber="2600" servicePackMajor="0" />
+      </osVersionInfo>
+    </dependentOS>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
+      <assemblyIdentity name="Microsoft.Windows.CommonLanguageRuntime" version="4.0.30319.0" />
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
+      <assemblyIdentity name="stdole" version="7.0.3300.0" publicKeyToken="B03F5F7F11D50A3A" language="neutral" />
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="log4net.dll" size="276480">
+      <assemblyIdentity name="log4net" version="2.0.8.0" publicKeyToken="669E0DDF0BB1AA2A" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>r1YQxRXSJE25jGYmNiZMgXfomxr+QH+I/RikHWb25+I=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Microsoft.Office.Tools.dll" size="16048">
+      <assemblyIdentity name="Microsoft.Office.Tools" version="10.0.0.0" publicKeyToken="B03F5F7F11D50A3A" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>Vgvc0uYwZVUc7LUY2JZ9KAzZj7xIADwUKXmP0lBdgwU=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Microsoft.Office.Tools.Common.dll" size="92344">
+      <assemblyIdentity name="Microsoft.Office.Tools.Common" version="10.0.0.0" publicKeyToken="B03F5F7F11D50A3A" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>9ksp+/YUo4Q2xUje3aOMuS2A+gI7SsBRbCG78UDZKa4=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Microsoft.Office.Tools.Common.v4.0.Utilities.dll" size="32664">
+      <assemblyIdentity name="Microsoft.Office.Tools.Common.v4.0.Utilities" version="10.0.0.0" publicKeyToken="B03F5F7F11D50A3A" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>jLCTF8Mm6bD4PDN+rnzN6q0+ReXaNgPh68kMWgatFwI=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Microsoft.Office.Tools.Excel.dll" size="172216">
+      <assemblyIdentity name="Microsoft.Office.Tools.Excel" version="10.0.0.0" publicKeyToken="B03F5F7F11D50A3A" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>C1kJF384lnmyooijH4sKbV7OfgR/gae6sw3kAG/bOyg=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Microsoft.Office.Tools.v4.0.Framework.dll" size="28360">
+      <assemblyIdentity name="Microsoft.Office.Tools.v4.0.Framework" version="10.0.0.0" publicKeyToken="B03F5F7F11D50A3A" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>ISZh8727tCrrTeM0j3FK7F6rylc8msZemTZgJIz8QMI=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Microsoft.VisualStudio.Tools.Applications.Runtime.dll" size="83168">
+      <assemblyIdentity name="Microsoft.VisualStudio.Tools.Applications.Runtime" version="10.0.0.0" publicKeyToken="B03F5F7F11D50A3A" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>vDNwPlxZTsrepY5kiLFDjUnvE55xbfsf7N7uzyD0qzo=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="ServerActions.dll" size="80896">
+      <assemblyIdentity name="ServerActions" version="2.0.0.0" language="neutral" processorArchitecture="msil" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>gY6n9aEusDga67vTuXGH2BAMNGkVcJW5g7VMgALFaF0=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+  <file name="ServerActions.dll.config" size="5411">
+    <hash>
+      <dsig:Transforms>
+        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+      </dsig:Transforms>
+      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+      <dsig:DigestValue>lUEwhgy80ybEYe7Nx4u7QWPSaPgBoAHRFZ6vysL2O2g=</dsig:DigestValue>
+    </hash>
+  </file>
+  <vstav3:addIn xmlns:vstav3="urn:schemas-microsoft-com:vsta.v3">
+    <vstav3:entryPointsCollection>
+      <vstav3:entryPoints>
+        <vstav3:entryPoint class="ServerActions.ThisAddIn">
+          <assemblyIdentity name="ServerActions" version="2.0.0.0" language="neutral" processorArchitecture="msil" />
+        </vstav3:entryPoint>
+      </vstav3:entryPoints>
+    </vstav3:entryPointsCollection>
+    <vstav3:update enabled="true" />
+    <vstav3:application>
+      <vstov4:customizations xmlns:vstov4="urn:schemas-microsoft-com:vsto.v4">
+        <vstov4:customization>
+          <vstov4:appAddIn application="Excel" loadBehavior="3" keyName="ServerActions">
+            <vstov4:friendlyName>Excel Addin Server Actions</vstov4:friendlyName>
+            <vstov4:description>This is an Excel VSTO Add-In written in Microsoft Visual Studio Community 2017 .NET. It allows the user to use an Excel table to ping a list of servers and create a file for Microsoft Remote Desktop Manager.</vstov4:description>
+            <vstov4.1:ribbonTypes xmlns:vstov4.1="urn:schemas-microsoft-com:vsto.v4.1" />
+          </vstov4:appAddIn>
+        </vstov4:customization>
+      </vstov4:customizations>
+    </vstav3:application>
+  </vstav3:addIn>
+<publisherIdentity name="CN=Anthony Duguid" issuerKeyHash="8e1f5b1cd6092c94f03bfe3cc8a6adc9d3fce05d" /><Signature Id="StrongNameSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>HotvhlMgt9932vEpnoCtk64pLzU=</DigestValue></Reference></SignedInfo><SignatureValue>pswJXHlumAY4RAdR+aOMQz9Di/VGXcu5NaHX2OLftJye8bcirW6aVkQRhUDnzPFjLUyhTKOoGPiI3Lz2sKKBE1VEk7qV6i9jIg02mZRYl6jwUqS8rqJIpAIMQVayVHJQUeRvYrsB/Jlofk8PLgmZfFcegXYuuqkEXQbHNAIkVvhHNYuPCTlVpAszc6KRFUGFF9jQEdqk23sgmVDzL7PXtWtR7Wa71Ihg3Y6GYwb+GRkjuZ5WNFLjL5nfXF1KETzXqp0QXjgnK37PVY4jDG8eOkw8xreYaR/9j9EnuC3MGFk69bSfXTvXa5zmQbS4uw1a8tBJdxiEjpgT7sUmvZK6ew==</SignatureValue><KeyInfo Id="StrongNameKeyInfo"><KeyValue><RSAKeyValue><Modulus>3NXP0qsalOagDYU6g7VAQqeqZYlICq+yClVDSBb+3DNSFIy8M2IogpocMT5wAwOvnBBOYz34mgjqc03B7/uvXFDva1PW/4gRwL5jC+PJxg/FG4ghD+fRlKCDYC/55nNos04DP2APbkO1VLo9LjCVQRUfXjtbifOWtMHOzcw/AzY5PuxzLc5YCPXdXBCMw94aL4jXABdkXp2o3kO9opsWkeZpG7VPsnGe0Ov4A0kHo5/33wVtNOWWQKDD8qJA/wZLDmKAaQX60/hJKzzV7P7hNKoWmUxBAILe/N/soprlj8m5Li+Avx82XumDyH8LPyUad2YLoNcsAZFcNokt3S+QlQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><msrel:RelData xmlns:msrel="http://schemas.microsoft.com/windows/rel/2005/reldata"><r:license xmlns:r="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:as="http://schemas.microsoft.com/windows/pki/2005/Authenticode"><r:grant><as:ManifestInformation Hash="352f29ae93ad809e29f1da77dfb72053866f8b1e" Description="" Url=""><as:assemblyIdentity name="ServerActions.dll" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" type="win32" /></as:ManifestInformation><as:SignedBy /><as:AuthenticodePublisher><as:X509SubjectName>CN=Anthony Duguid</as:X509SubjectName></as:AuthenticodePublisher></r:grant><r:issuer><Signature Id="AuthenticodeSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>KkW5yyt8bM0csoZS3sQ47V+WNTA=</DigestValue></Reference></SignedInfo><SignatureValue>jlGM0AprMXBo8QC1ss9VbQZ/dDlVEFQJmY5tplOelo6KXIMGbAaCZk8xJK/AFCRG9RQmBk7shtBCzlm4QSnfadnLU1IXNuPjiMOYx+d/5ynYO9XYNcvku56kj2R4O4Nfte1sRvKC4cirFVjPSovjpXP7W/wmGr62zlhXzH2pEK1c98p7cwTcl+7CEEpBAtLDmT776ZGnCczpiXzJU6wmQa6wy0qG4JZSy+qlkqsXsBCU/xk8RaNgcG0zH+1U1JTuNOXu+Xp9DGJ1ctj0z4BULN0llw6JHoREOxaujfF4ljjh3SwaE0UFnlNGL5fMMhxBjYAMFHQdQnEx+Ai3svfBIA==</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>3NXP0qsalOagDYU6g7VAQqeqZYlICq+yClVDSBb+3DNSFIy8M2IogpocMT5wAwOvnBBOYz34mgjqc03B7/uvXFDva1PW/4gRwL5jC+PJxg/FG4ghD+fRlKCDYC/55nNos04DP2APbkO1VLo9LjCVQRUfXjtbifOWtMHOzcw/AzY5PuxzLc5YCPXdXBCMw94aL4jXABdkXp2o3kO9opsWkeZpG7VPsnGe0Ov4A0kHo5/33wVtNOWWQKDD8qJA/wZLDmKAaQX60/hJKzzV7P7hNKoWmUxBAILe/N/soprlj8m5Li+Avx82XumDyH8LPyUad2YLoNcsAZFcNokt3S+QlQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIDNzCCAiOgAwIBAgIQYnexPCssuqJKygwWUAWe/zAJBgUrDgMCHQUAMBkxFzAVBgNVBAMTDkFudGhvbnkgRHVndWlkMCAXDTE3MDUyNDAyMTYyNloYDzIxNzQwMTE1MTQwMDAwWjAZMRcwFQYDVQQDEw5BbnRob255IER1Z3VpZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANzVz9KrGpTmoA2FOoO1QEKnqmWJSAqvsgpVQ0gW/twzUhSMvDNiKIKaHDE+cAMDr5wQTmM9+JoI6nNNwe/7r1xQ72tT1v+IEcC+YwvjycYPxRuIIQ/n0ZSgg2Av+eZzaLNOAz9gD25DtVS6PS4wlUEVH147W4nzlrTBzs3MPwM2OT7scy3OWAj13VwQjMPeGi+I1wAXZF6dqN5DvaKbFpHmaRu1T7JxntDr+ANJB6Of998FbTTllkCgw/KiQP8GSw5igGkF+tP4SSs81ez+4TSqFplMQQCC3vzf7KKa5Y/JuS4vgL8fNl7pg8h/Cz8lGndmC6DXLAGRXDaJLd0vkJUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMCAQAwHwYDVR0lBBgwFgYIKwYBBQUHAwMGCisGAQQBgjcKAw0wSgYDVR0BBEMwQYAQNGzMp7oROO3P8lbeEXBwu6EbMBkxFzAVBgNVBAMTDkFudGhvbnkgRHVndWlkghBid7E8Kyy6okrKDBZQBZ7/MAkGBSsOAwIdBQADggEBAC5GwoBNGd1zaobQ/gjoWjMjfgoon4q3UVVMC428DY5audMdzD8fE8uv8bPFvJ5TORpfOEtiygx2H/8nEf60eC+QQEex19XS81a21A76BQNa9rwsFHZNHzgwQEiG9a3qK7exMgV/KHxOJ3luierjK78vCBplh+HGgCfY1KOaUrQoJ/Gg710vRcd51vsMFN71M3EGF16JZ4dPxMwdOPf9yj4T0JFm2aMU0RkkW1Z4axiHL6iyTfH5uX5Rt+Nzpt9kA585hLECFpI6vIYkF7eKCMi7qEKBHCudszyekQOOCHKa+pKmMf84wa1XVi9OHHTSBR5XrOAoorjn5HyLsbV6fvA=</X509Certificate></X509Data></KeyInfo></Signature></r:issuer></r:license></msrel:RelData></KeyInfo></Signature></asmv1:assembly>
\ No newline at end of file
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.vsto b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.vsto
new file mode 100644
index 0000000..6f69b18
--- /dev/null
+++ b/VB/publish/Application Files/ServerActions_2_0_0_0/ServerActions.vsto	
@@ -0,0 +1,21 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
+  <assemblyIdentity name="ServerActions.vsto" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
+  <description asmv2:publisher="Anthony Duguid" asmv2:product="Excel Addin Server Actions" asmv2:supportUrl="https://github.com/aduguid/ServerActions/blob/master/README.md" xmlns="urn:schemas-microsoft-com:asm.v1" />
+  <deployment install="false" mapFileExtensions="true" />
+  <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
+    <framework targetVersion="4.5.2" profile="Full" supportedRuntime="4.0.30319" />
+  </compatibleFrameworks>
+  <dependency>
+    <dependentAssembly dependencyType="install" codebase="Application Files\ServerActions_2_0_0_0\ServerActions.dll.manifest" size="14789">
+      <assemblyIdentity name="ServerActions.dll" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" type="win32" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>cTFcK5sBBMeTR1CXkhyXWe4TialOSEHVi/fLesduvOo=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+<publisherIdentity name="CN=Anthony Duguid" issuerKeyHash="8e1f5b1cd6092c94f03bfe3cc8a6adc9d3fce05d" /><Signature Id="StrongNameSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>Qs+ABmvNfSkvBh+o1D+S/36FW/I=</DigestValue></Reference></SignedInfo><SignatureValue>GVBBIu//0835L8PEnRE1kTmMfT0fJPyN4nwu1Wi9PPV95MCutk81V9ChcBHXS/1UwfSaLv1OadbdObuuHm1WdxY3MKQlgEMJaFWYyUjuDvlAFdTQWJX+mjnOHCHuEhQ4YtyvJJzRLR8NCNgVrdo5EM2jZkD3j9uwjHi6HPawVc0e1cbFtpgX4JCYrJunqnsCnHPCPRpQ3cppm0qZC38Xbkwtx6OFtuN9RLKjO+nfimkOsZLy7HBpX0BmlJW67F5Pr4IaMB8JjAmE194vLb5EQDw1O/b4z9rUtaUXm2RF3mcmJAKyWfI7kNomTKg3l8IjnDvB9rq1yFhoVDC6elOiPw==</SignatureValue><KeyInfo Id="StrongNameKeyInfo"><KeyValue><RSAKeyValue><Modulus>3NXP0qsalOagDYU6g7VAQqeqZYlICq+yClVDSBb+3DNSFIy8M2IogpocMT5wAwOvnBBOYz34mgjqc03B7/uvXFDva1PW/4gRwL5jC+PJxg/FG4ghD+fRlKCDYC/55nNos04DP2APbkO1VLo9LjCVQRUfXjtbifOWtMHOzcw/AzY5PuxzLc5YCPXdXBCMw94aL4jXABdkXp2o3kO9opsWkeZpG7VPsnGe0Ov4A0kHo5/33wVtNOWWQKDD8qJA/wZLDmKAaQX60/hJKzzV7P7hNKoWmUxBAILe/N/soprlj8m5Li+Avx82XumDyH8LPyUad2YLoNcsAZFcNokt3S+QlQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><msrel:RelData xmlns:msrel="http://schemas.microsoft.com/windows/rel/2005/reldata"><r:license xmlns:r="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:as="http://schemas.microsoft.com/windows/pki/2005/Authenticode"><r:grant><as:ManifestInformation Hash="f25b857eff923fd4a81f062f297dcd6b0680cf42" Description="" Url=""><as:assemblyIdentity name="ServerActions.vsto" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" /></as:ManifestInformation><as:SignedBy /><as:AuthenticodePublisher><as:X509SubjectName>CN=Anthony Duguid</as:X509SubjectName></as:AuthenticodePublisher></r:grant><r:issuer><Signature Id="AuthenticodeSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>HETzCLmSF2gYz8dpgS8ZYmQe4kY=</DigestValue></Reference></SignedInfo><SignatureValue>KmlsgtIMLhExettjadN0J8wEWwLaMzYrCOIaJr6erbOM897vX+FdjD07j1KpNQJG3/JL3QCac88SCAkmLbMfKfVfJUaaIiAjn1OtdGChgVwE7SSMjtZX9ARcpUtR6jdlHAojg4dW4afgB17BBqYKLKtLiKEChpA2HwgrWrWgG3NO3J1L5o9fo+AoitqqTnDIh1yFFlMJfMptSeO+V4+d3Q+EqV7Y1mb4IcvEqwywUXBeaKZ+rM3N2XIcpclsB9ogJNkwPUGbppZC6BI3oFF0TAMgTOSYLf+qXbO6fH2yR7yvrrhOeLM/L2HrbPFmtHhIzNIm5CWPrpNoWkXUX1Bhzw==</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>3NXP0qsalOagDYU6g7VAQqeqZYlICq+yClVDSBb+3DNSFIy8M2IogpocMT5wAwOvnBBOYz34mgjqc03B7/uvXFDva1PW/4gRwL5jC+PJxg/FG4ghD+fRlKCDYC/55nNos04DP2APbkO1VLo9LjCVQRUfXjtbifOWtMHOzcw/AzY5PuxzLc5YCPXdXBCMw94aL4jXABdkXp2o3kO9opsWkeZpG7VPsnGe0Ov4A0kHo5/33wVtNOWWQKDD8qJA/wZLDmKAaQX60/hJKzzV7P7hNKoWmUxBAILe/N/soprlj8m5Li+Avx82XumDyH8LPyUad2YLoNcsAZFcNokt3S+QlQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIDNzCCAiOgAwIBAgIQYnexPCssuqJKygwWUAWe/zAJBgUrDgMCHQUAMBkxFzAVBgNVBAMTDkFudGhvbnkgRHVndWlkMCAXDTE3MDUyNDAyMTYyNloYDzIxNzQwMTE1MTQwMDAwWjAZMRcwFQYDVQQDEw5BbnRob255IER1Z3VpZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANzVz9KrGpTmoA2FOoO1QEKnqmWJSAqvsgpVQ0gW/twzUhSMvDNiKIKaHDE+cAMDr5wQTmM9+JoI6nNNwe/7r1xQ72tT1v+IEcC+YwvjycYPxRuIIQ/n0ZSgg2Av+eZzaLNOAz9gD25DtVS6PS4wlUEVH147W4nzlrTBzs3MPwM2OT7scy3OWAj13VwQjMPeGi+I1wAXZF6dqN5DvaKbFpHmaRu1T7JxntDr+ANJB6Of998FbTTllkCgw/KiQP8GSw5igGkF+tP4SSs81ez+4TSqFplMQQCC3vzf7KKa5Y/JuS4vgL8fNl7pg8h/Cz8lGndmC6DXLAGRXDaJLd0vkJUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMCAQAwHwYDVR0lBBgwFgYIKwYBBQUHAwMGCisGAQQBgjcKAw0wSgYDVR0BBEMwQYAQNGzMp7oROO3P8lbeEXBwu6EbMBkxFzAVBgNVBAMTDkFudGhvbnkgRHVndWlkghBid7E8Kyy6okrKDBZQBZ7/MAkGBSsOAwIdBQADggEBAC5GwoBNGd1zaobQ/gjoWjMjfgoon4q3UVVMC428DY5audMdzD8fE8uv8bPFvJ5TORpfOEtiygx2H/8nEf60eC+QQEex19XS81a21A76BQNa9rwsFHZNHzgwQEiG9a3qK7exMgV/KHxOJ3luierjK78vCBplh+HGgCfY1KOaUrQoJ/Gg710vRcd51vsMFN71M3EGF16JZ4dPxMwdOPf9yj4T0JFm2aMU0RkkW1Z4axiHL6iyTfH5uX5Rt+Nzpt9kA585hLECFpI6vIYkF7eKCMi7qEKBHCudszyekQOOCHKa+pKmMf84wa1XVi9OHHTSBR5XrOAoorjn5HyLsbV6fvA=</X509Certificate></X509Data></KeyInfo></Signature></r:issuer></r:license></msrel:RelData></KeyInfo></Signature></asmv1:assembly>
\ No newline at end of file
diff --git a/VB/publish/Application Files/ServerActions_2_0_0_0/log4net.dll.deploy b/VB/publish/Application Files/ServerActions_2_0_0_0/log4net.dll.deploy
new file mode 100644
index 0000000..93fb476
Binary files /dev/null and b/VB/publish/Application Files/ServerActions_2_0_0_0/log4net.dll.deploy differ
diff --git a/VB/publish/ServerActions.vsto b/VB/publish/ServerActions.vsto
new file mode 100644
index 0000000..6f69b18
--- /dev/null
+++ b/VB/publish/ServerActions.vsto
@@ -0,0 +1,21 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
+  <assemblyIdentity name="ServerActions.vsto" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
+  <description asmv2:publisher="Anthony Duguid" asmv2:product="Excel Addin Server Actions" asmv2:supportUrl="https://github.com/aduguid/ServerActions/blob/master/README.md" xmlns="urn:schemas-microsoft-com:asm.v1" />
+  <deployment install="false" mapFileExtensions="true" />
+  <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
+    <framework targetVersion="4.5.2" profile="Full" supportedRuntime="4.0.30319" />
+  </compatibleFrameworks>
+  <dependency>
+    <dependentAssembly dependencyType="install" codebase="Application Files\ServerActions_2_0_0_0\ServerActions.dll.manifest" size="14789">
+      <assemblyIdentity name="ServerActions.dll" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" type="win32" />
+      <hash>
+        <dsig:Transforms>
+          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
+        </dsig:Transforms>
+        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
+        <dsig:DigestValue>cTFcK5sBBMeTR1CXkhyXWe4TialOSEHVi/fLesduvOo=</dsig:DigestValue>
+      </hash>
+    </dependentAssembly>
+  </dependency>
+<publisherIdentity name="CN=Anthony Duguid" issuerKeyHash="8e1f5b1cd6092c94f03bfe3cc8a6adc9d3fce05d" /><Signature Id="StrongNameSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>Qs+ABmvNfSkvBh+o1D+S/36FW/I=</DigestValue></Reference></SignedInfo><SignatureValue>GVBBIu//0835L8PEnRE1kTmMfT0fJPyN4nwu1Wi9PPV95MCutk81V9ChcBHXS/1UwfSaLv1OadbdObuuHm1WdxY3MKQlgEMJaFWYyUjuDvlAFdTQWJX+mjnOHCHuEhQ4YtyvJJzRLR8NCNgVrdo5EM2jZkD3j9uwjHi6HPawVc0e1cbFtpgX4JCYrJunqnsCnHPCPRpQ3cppm0qZC38Xbkwtx6OFtuN9RLKjO+nfimkOsZLy7HBpX0BmlJW67F5Pr4IaMB8JjAmE194vLb5EQDw1O/b4z9rUtaUXm2RF3mcmJAKyWfI7kNomTKg3l8IjnDvB9rq1yFhoVDC6elOiPw==</SignatureValue><KeyInfo Id="StrongNameKeyInfo"><KeyValue><RSAKeyValue><Modulus>3NXP0qsalOagDYU6g7VAQqeqZYlICq+yClVDSBb+3DNSFIy8M2IogpocMT5wAwOvnBBOYz34mgjqc03B7/uvXFDva1PW/4gRwL5jC+PJxg/FG4ghD+fRlKCDYC/55nNos04DP2APbkO1VLo9LjCVQRUfXjtbifOWtMHOzcw/AzY5PuxzLc5YCPXdXBCMw94aL4jXABdkXp2o3kO9opsWkeZpG7VPsnGe0Ov4A0kHo5/33wVtNOWWQKDD8qJA/wZLDmKAaQX60/hJKzzV7P7hNKoWmUxBAILe/N/soprlj8m5Li+Avx82XumDyH8LPyUad2YLoNcsAZFcNokt3S+QlQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><msrel:RelData xmlns:msrel="http://schemas.microsoft.com/windows/rel/2005/reldata"><r:license xmlns:r="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:as="http://schemas.microsoft.com/windows/pki/2005/Authenticode"><r:grant><as:ManifestInformation Hash="f25b857eff923fd4a81f062f297dcd6b0680cf42" Description="" Url=""><as:assemblyIdentity name="ServerActions.vsto" version="2.0.0.0" publicKeyToken="b3e780e0dcdf4cd1" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" /></as:ManifestInformation><as:SignedBy /><as:AuthenticodePublisher><as:X509SubjectName>CN=Anthony Duguid</as:X509SubjectName></as:AuthenticodePublisher></r:grant><r:issuer><Signature Id="AuthenticodeSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>HETzCLmSF2gYz8dpgS8ZYmQe4kY=</DigestValue></Reference></SignedInfo><SignatureValue>KmlsgtIMLhExettjadN0J8wEWwLaMzYrCOIaJr6erbOM897vX+FdjD07j1KpNQJG3/JL3QCac88SCAkmLbMfKfVfJUaaIiAjn1OtdGChgVwE7SSMjtZX9ARcpUtR6jdlHAojg4dW4afgB17BBqYKLKtLiKEChpA2HwgrWrWgG3NO3J1L5o9fo+AoitqqTnDIh1yFFlMJfMptSeO+V4+d3Q+EqV7Y1mb4IcvEqwywUXBeaKZ+rM3N2XIcpclsB9ogJNkwPUGbppZC6BI3oFF0TAMgTOSYLf+qXbO6fH2yR7yvrrhOeLM/L2HrbPFmtHhIzNIm5CWPrpNoWkXUX1Bhzw==</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>3NXP0qsalOagDYU6g7VAQqeqZYlICq+yClVDSBb+3DNSFIy8M2IogpocMT5wAwOvnBBOYz34mgjqc03B7/uvXFDva1PW/4gRwL5jC+PJxg/FG4ghD+fRlKCDYC/55nNos04DP2APbkO1VLo9LjCVQRUfXjtbifOWtMHOzcw/AzY5PuxzLc5YCPXdXBCMw94aL4jXABdkXp2o3kO9opsWkeZpG7VPsnGe0Ov4A0kHo5/33wVtNOWWQKDD8qJA/wZLDmKAaQX60/hJKzzV7P7hNKoWmUxBAILe/N/soprlj8m5Li+Avx82XumDyH8LPyUad2YLoNcsAZFcNokt3S+QlQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIDNzCCAiOgAwIBAgIQYnexPCssuqJKygwWUAWe/zAJBgUrDgMCHQUAMBkxFzAVBgNVBAMTDkFudGhvbnkgRHVndWlkMCAXDTE3MDUyNDAyMTYyNloYDzIxNzQwMTE1MTQwMDAwWjAZMRcwFQYDVQQDEw5BbnRob255IER1Z3VpZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANzVz9KrGpTmoA2FOoO1QEKnqmWJSAqvsgpVQ0gW/twzUhSMvDNiKIKaHDE+cAMDr5wQTmM9+JoI6nNNwe/7r1xQ72tT1v+IEcC+YwvjycYPxRuIIQ/n0ZSgg2Av+eZzaLNOAz9gD25DtVS6PS4wlUEVH147W4nzlrTBzs3MPwM2OT7scy3OWAj13VwQjMPeGi+I1wAXZF6dqN5DvaKbFpHmaRu1T7JxntDr+ANJB6Of998FbTTllkCgw/KiQP8GSw5igGkF+tP4SSs81ez+4TSqFplMQQCC3vzf7KKa5Y/JuS4vgL8fNl7pg8h/Cz8lGndmC6DXLAGRXDaJLd0vkJUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMCAQAwHwYDVR0lBBgwFgYIKwYBBQUHAwMGCisGAQQBgjcKAw0wSgYDVR0BBEMwQYAQNGzMp7oROO3P8lbeEXBwu6EbMBkxFzAVBgNVBAMTDkFudGhvbnkgRHVndWlkghBid7E8Kyy6okrKDBZQBZ7/MAkGBSsOAwIdBQADggEBAC5GwoBNGd1zaobQ/gjoWjMjfgoon4q3UVVMC428DY5audMdzD8fE8uv8bPFvJ5TORpfOEtiygx2H/8nEf60eC+QQEex19XS81a21A76BQNa9rwsFHZNHzgwQEiG9a3qK7exMgV/KHxOJ3luierjK78vCBplh+HGgCfY1KOaUrQoJ/Gg710vRcd51vsMFN71M3EGF16JZ4dPxMwdOPf9yj4T0JFm2aMU0RkkW1Z4axiHL6iyTfH5uX5Rt+Nzpt9kA585hLECFpI6vIYkF7eKCMi7qEKBHCudszyekQOOCHKa+pKmMf84wa1XVi9OHHTSBR5XrOAoorjn5HyLsbV6fvA=</X509Certificate></X509Data></KeyInfo></Signature></r:issuer></r:license></msrel:RelData></KeyInfo></Signature></asmv1:assembly>
\ No newline at end of file
diff --git a/VB/publish/setup.exe b/VB/publish/setup.exe
new file mode 100644
index 0000000..4b014eb
Binary files /dev/null and b/VB/publish/setup.exe differ
diff --git a/VBA/Install.bat b/VBA/Install.bat
index 37c7ac4..f45e7a6 100644
--- a/VBA/Install.bat
+++ b/VBA/Install.bat
@@ -1,23 +1,23 @@
-@ECHO OFF
-
-REM
-REM	|--------------------------------------------------------------------------------------------------------------------
-REM	| Purpose:			Generic Install
-REM	|
-REM	| Ver.	Date			Author			Details
-REM	| 1.00	27-NOV-2017		Anthony Duguid		Initial version.
-REM	|--------------------------------------------------------------------------------------------------------------------*/
-
-
-REM
-REM 	/E 	 = Copies directories and subdirectories, including empty ones. Same as /S /E. May be used to modify /T. 
-REM	/D:m-d-y = Copies files changed on or after the specified date. 
-REM		   If no date is given, copies only those files whose source time is newer than the destination time. 
-REM	/K 	 = Copies attributes. Normal Xcopy will reset read-only attributes. 
-REM 	/Q 	 = Does not display file names while copying. 
-REM 	/R 	 = Overwrites read-only files. 
-REM 	/Y 	 = Suppresses prompting to confirm you want to overwrite an existing destination file. 
-REM
-
-REM	Copy the install directory and sub-directories
-	XCOPY ".\ServerActions.xlam" "%AppData%\Microsoft\AddIns\ServerActions.xlam" /E /K /Q /R /Y /D
\ No newline at end of file
+@ECHO OFF
+
+REM
+REM	|--------------------------------------------------------------------------------------------------------------------
+REM	| Purpose:			Generic Install
+
+
+
+REM	|--------------------------------------------------------------------------------------------------------------------*/
+
+
+REM
+REM 	/E 	 = Copies directories and subdirectories, including empty ones. Same as /S /E. May be used to modify /T. 
+REM	/D:m-d-y = Copies files changed on or after the specified date. 
+REM		   If no date is given, copies only those files whose source time is newer than the destination time. 
+REM	/K 	 = Copies attributes. Normal Xcopy will reset read-only attributes. 
+REM 	/Q 	 = Does not display file names while copying. 
+REM 	/R 	 = Overwrites read-only files. 
+REM 	/Y 	 = Suppresses prompting to confirm you want to overwrite an existing destination file. 
+REM
+
+REM	Copy the install directory and sub-directories
+	XCOPY ".\ServerHelp.xlam" "%AppData%\Microsoft\AddIns\ServerHelp.xlam" /E /K /Q /R /Y /D
diff --git a/VBA/ServerActions.xlam b/VBA/ServerActions.xlam
deleted file mode 100644
index ed726e3..0000000
Binary files a/VBA/ServerActions.xlam and /dev/null differ
diff --git a/VBA/ServerActions.xlsm b/VBA/ServerActions.xlsm
deleted file mode 100644
index 2fd5551..0000000
Binary files a/VBA/ServerActions.xlsm and /dev/null differ
diff --git a/VBA/ServerHelp.xlam b/VBA/ServerHelp.xlam
new file mode 100644
index 0000000..789b2c5
Binary files /dev/null and b/VBA/ServerHelp.xlam differ
diff --git a/VBA/ServerHelp.xlsm b/VBA/ServerHelp.xlsm
new file mode 100644
index 0000000..d57e62d
Binary files /dev/null and b/VBA/ServerHelp.xlsm differ
