diff --git a/CSE/CSE.vbproj b/CSE/CSE.vbproj
index c6d254ebacb78ac64558b2790fc6f8c4d6c28056..3f0199c083d19c5674ae06a0a8b3b20bd8e8614f 100644
--- a/CSE/CSE.vbproj
+++ b/CSE/CSE.vbproj
@@ -105,6 +105,7 @@
   <ItemGroup>
     <Compile Include="Classes\cGenShp.vb" />
     <Compile Include="Classes\cMSC.vb" />
+    <Compile Include="Classes\cJsonFile.vb" />
     <Compile Include="Classes\CResult.vb" />
     <Compile Include="Classes\cPreferences.vb" />
     <Compile Include="Classes\csKey.vb" />
@@ -112,6 +113,7 @@
     <Compile Include="Classes\cValidSec.vb" />
     <Compile Include="Classes\cVehicle.vb" />
     <Compile Include="Classes\cVirtMSC.vb" />
+    <Compile Include="Classes\SemanticVersion.vb" />
     <Compile Include="Export\Minor_routines_output.vb" />
     <Compile Include="Export\output.vb" />
     <Compile Include="Export\OutputTest.vb" />
diff --git a/CSE/Classes/cJsonFile.vb b/CSE/Classes/cJsonFile.vb
new file mode 100644
index 0000000000000000000000000000000000000000..a765a4433e33cdef5a2bf1d5266046ec012ae969
--- /dev/null
+++ b/CSE/Classes/cJsonFile.vb
@@ -0,0 +1,143 @@
+Option Strict Off
+
+Imports Newtonsoft.Json.Linq
+Imports Newtonsoft.Json.Schema
+
+''' <summary>The parent-class for Head/Body json files</summary>
+''' <remarks>The /Header/Strict boolean controles whether to allow additional-properties in Body, 
+''' so it can be used to debug bad input-files by manually setting it to 'true' with a text-editor.
+''' </remarks>
+Public MustInherit Class cJsonFile
+
+    ''' <summary>The json-content for a json-file structured in Header/Body</summary>
+    Protected Shared Function JsonStr_FileContents(ByVal version As String, ByVal body As String) As String
+        Return <json>{
+            "Header": {
+                "FileVersion":  "<%= version %>",
+                "Strict":       false,
+            },
+            "Body": <%= body %>
+        }</json>.Value
+    End Function
+
+    ''' <summary>The schema for a json-file structured in Header/Body</summary>
+    Protected Shared Function JSchemaStr_File() As String
+        Return <json>{
+            "title": "vecto header/body json-file",
+            "type": "object", "additionalProperties": false, 
+            "properties": {
+                "Header": { 
+                    "type": "object", "additionalProperties": true, 
+                    "required": true,
+                    "properties": {
+                        "FileVersion": {
+                            "type": "string",
+                            "required": true,
+                        },
+                        "Strict": {
+                            "type": "boolean",
+                            "required": true,
+                            "default": false,
+                        }
+                    }
+                },
+                "Body": {}
+            }
+        }</json>.Value
+    End Function
+
+    ''' <summary>When a new file is created, it gets it /Header/FileVersion from this method</summary>
+    Protected MustOverride ReadOnly Property CodeVersion() As String
+
+    ''' <summary>When a instance_with_defauls is created, it gets its /Body from this method</summary>
+    Protected MustOverride ReadOnly Property CodeBodyStr() As String
+
+    ''' <summary>The schema used to validate the /Body</summary>
+    ''' <remarks>To signify validation-failure it can throw an exception or add err-messages into the supplied list</remarks>
+    Protected MustOverride Sub ValidateVersionAndBody(ByVal fileVersion As String, ByVal body As JObject, ByVal allowsAdditionalProps As Boolean, ByVal validateMsgs As IList(Of String))
+
+
+    Protected Json_Contents As JObject
+
+    ''' <summary>Reads from a file (aka "Load") or creates an instance with defaults
+    ''' 
+    ''' When reading, it optionally checks version and validates its body with ValidateVersionAndBody().
+    ''' When defaulting, the resulted file-version is retrieved from 'CodeVersion' prop and the body from 'BodyStr' prop.
+    ''' </summary>
+    ''' <param name="inputFilePath">If unspecifed, create instance_with_defaults, otherwise read json-contents from file</param>
+    ''' <param name="skipValidation">When false (the default), validates json-contents in both cases (reading or creating-defaults)</param>
+    ''' <remarks></remarks>
+    Protected Sub New(Optional ByVal inputFilePath As String = Nothing, Optional ByVal skipValidation As Boolean = False)
+        If (inputFilePath Is Nothing) Then
+            Dim jstr = JsonStr_FileContents(Me.CodeVersion, Me.CodeBodyStr)
+            Me.Json_Contents = JObject.Parse(jstr)
+        Else
+            Me.Json_Contents = ReadJsonFile(inputFilePath)
+        End If
+
+        If Not skipValidation Then
+            Me.Validate()
+        End If
+    End Sub
+
+    ''' <summary>Validates and Writing to the config file</summary>
+    Sub Store(ByVal fpath As String)
+        Validate(Me.Strict)
+        WriteJsonFile(fpath, Json_Contents)
+    End Sub
+
+
+    ''' <exception cref="SystemException">includes all validation errors</exception>
+    ''' <param name="isStrict">when True, no additional json-properties allowed in the data, when nothing, use value from Header</param>
+    Friend Sub Validate(Optional ByVal isStrict As Boolean? = Nothing)
+        Dim allowsAdditionalProps As Boolean = Not IIf(isStrict Is Nothing, Me.Strict, isStrict)
+        Dim fileSchema = JsonSchema.Parse(JSchemaStr_File())        ' TODO: Lazily create schemas once
+
+        Dim validateMsgs As IList(Of String) = New List(Of String)
+        ValidateJson(Me.Json_Contents, fileSchema, validateMsgs)
+        If (validateMsgs.Any()) Then
+            Throw New SystemException(format("Invalid File-format due to: {0}", String.Join(vbCrLf, validateMsgs)))
+        End If
+
+        Me.ValidateVersionAndBody(Me.FileVersion, Me.Body, allowsAdditionalProps, validateMsgs)
+
+        If (validateMsgs.Any()) Then
+            Throw New SystemException(format("Invalid Body-format due to: {0}", String.Join(vbCrLf, validateMsgs)))
+        End If
+    End Sub
+
+
+
+    Public Overrides Function Equals(ByVal obj As Object) As Boolean
+        If obj Is Nothing OrElse Not Me.GetType().Equals(obj.GetType()) Then
+            Return False
+        Else
+            Return Me.Json_Contents.Equals(DirectCast(obj, cJsonFile).Json_Contents)
+        End If
+    End Function
+
+
+#Region "json props"
+    Protected ReadOnly Property Header() As JObject
+        Get
+            Return Me.Json_Contents("Header")
+        End Get
+    End Property
+    Protected ReadOnly Property Body() As JObject
+        Get
+            Return Me.Json_Contents("Body")
+        End Get
+    End Property
+    Public ReadOnly Property FileVersion As String
+        Get
+            Return Me.Header("FileVersion")
+        End Get
+    End Property
+    Public ReadOnly Property Strict As Boolean
+        Get
+            Return Me.Header("Strict")
+        End Get
+    End Property
+#End Region ' "json props"
+
+End Class
diff --git a/CSE/Classes/cPreferences.vb b/CSE/Classes/cPreferences.vb
index a837bd6ed7a5dd39b3496fa81efc17b27c74b837..41b658fbeacccea0c0185bacc08a5171aeef2b9a 100644
--- a/CSE/Classes/cPreferences.vb
+++ b/CSE/Classes/cPreferences.vb
@@ -4,79 +4,61 @@ Imports Newtonsoft.Json.Linq
 Imports Newtonsoft.Json.Schema
 
 Public Class cPreferences
-    Public Json_Contents As JObject
+    Inherits cJsonFile
+
+    Protected Overrides ReadOnly Property CodeVersion() As String
+        Get
+            Return "1.0.0"
+        End Get
+    End Property
 
     ' Default-prefs specified here.
-    Function JsonStr_Contents() As String
-        Return <json>{
-            "Header": {
-                "FileVersion":  "1.0",
-                "Strict":       false,
-            },
-            "Body": {
+    Protected Overrides ReadOnly Property CodeBodyStr() As String
+        Get
+            Return <json>{
                 "WorkingDir":   null,
                 "WriteLog":     true,
                 "LogSize":      2,
                 "LogLevel":     5,
                 "Editor":       "notepad.exe",
-            }
         }</json>.Value
-    End Function
+        End Get
+    End Property
 
-    ''' <param name="allowsAdditionalProps">when false, more strict validation</param>
-    Function JSchemaStr(ByVal allowsAdditionalProps As Boolean) As String
-        Dim allowsAdditionalProps_str As String = IIf(allowsAdditionalProps, "false", "true")
+    ''' <param name="allowAdditionalProps">when false, more strict validation</param>
+    Protected Function JSchemaStr(ByVal allowAdditionalProps As Boolean) As String
+        Dim allowAdditionalProps_str As String = IIf(allowAdditionalProps, "true", "false")
         Return <json>{
-            "title": "Vecto_cse-prefs.ver1.0",
-            "type": "object", "AllowAdditionalProperties": <%= allowsAdditionalProps_str %>, 
+            "title": "cse-prefs.ver1.0",
+            "type": "object", "additionalProperties": <%= allowAdditionalProps_str %>, 
+            "required": true,
             "properties": {
-                "Header": { 
-                    "type": "object", "AllowAdditionalProperties": <%= allowsAdditionalProps_str %>, 
+                "WorkingDir": {
+                    "type": ["string", "null"], 
+                    "required": false,
+                    "default": null,
+                    "description": "Last used Working Directory Path for input/output files, when null/empty,  uses app's dir (default: null)",
+                }, 
+                "WriteLog": {
+                    "type": "boolean",
+                    "required": true,
+                    "description": "Whether to write messages to log file (default: true)",
+                }, 
+                "LogSize": {
+                    "type": "integer",
+                    "required": true,
+                    "description": "Allowed Log-file size limit [MiB] (default: 2)",
+                }, 
+                "LogLevel": {
+                    "type": "integer",
                     "required": true,
-                    "properties": {
-                        "FileVersion": {
-                            "type": "string",
-                            "required": true,
-                        },
-                        "Strict": {
-                            "type": "boolean",
-                            "required": true,
-                            "default": false,
-                        }
-                    }
-                },
-                "Body": {
-                    "type": "object", "AllowAdditionalProperties": <%= allowsAdditionalProps_str %>, 
+                    "description": "Message Output Level (default: 5 - 'info')",
+                }, 
+                "Editor": {
+                    "type": "string",
                     "required": true,
-                    "properties": {
-                        "WorkingDir": {
-                            "type": ["string", "null"], 
-                            "required": false,
-                            "default": null,
-                            "description": "Last used Working Directory Path for input/output files, when null/empty,  uses app's dir (default: null)",
-                        }, 
-                        "WriteLog": {
-                            "type": "boolean",
-                            "required": true,
-                            "description": "Whether to write messages to log file (default: true)",
-                        }, 
-                        "LogSize": {
-                            "type": "integer",
-                            "required": true,
-                            "description": "Allowed Log-file size limit [MiB] (default: 2)",
-                        }, 
-                        "LogLevel": {
-                            "type": "integer",
-                            "required": true,
-                            "description": "Message Output Level (default: 5 - 'info')",
-                        }, 
-                        "Editor": {
-                            "type": "string",
-                            "required": true,
-                            "description": "Path (or filename if in PATH) of some (text or JSON) editor (default: 'notepad.exe')",
-                        }, 
-                    }
-                }
+                    "description": "Path (or filename if in PATH) of some (text or JSON) editor (default: 'notepad.exe')",
+                }, 
             }
         }</json>.Value
     End Function
@@ -84,34 +66,23 @@ Public Class cPreferences
 
     ''' <summary>Reads from file or creates defaults</summary>
     ''' <param name="inputFilePath">If unspecifed, default prefs used, otherwise data read from file</param>
-    ''' <remarks></remarks>
-    Sub New(Optional ByVal inputFilePath As String = Nothing)
-        If (inputFilePath Is Nothing) Then
-            Me.Json_Contents = JObject.Parse(JsonStr_Contents())
-        Else
-            Me.Json_Contents = ReadJsonFile(inputFilePath)
-        End If
-    End Sub
-
-
-    ''' <summary>Validates and Writing to the config file</summary>
-    Sub Store(ByVal prefs_fpath As String)
-        Validate(Me.Strict)
-        WriteJsonFile(prefs_fpath, Json_Contents)
+    ''' <remarks>See cJsonFile() constructor</remarks>
+    Sub New(Optional ByVal inputFilePath As String = Nothing, Optional ByVal skipValidation As Boolean = False)
+        MyBase.New(inputFilePath, skipValidation)
     End Sub
 
 
     ''' <exception cref="SystemException">includes all validation errors</exception>
-    ''' <param name="isStrict">when True, no additional json-properties allowed in the data, when nothing, use value from Header</param>
-    Friend Sub Validate(Optional ByVal isStrict As Boolean? = Nothing)
-        Dim allowsAdditionalProps As Boolean = IIf(isStrict Is Nothing, Me.Strict, Not isStrict)
-        Dim schema = JsonSchema.Parse(JSchemaStr(allowsAdditionalProps))
-        Dim validateMsgs As IList(Of String) = New List(Of String)
-
-        ValidateJson(Me.Json_Contents, schema, validateMsgs)
+    ''' <param name="allowAdditionalProps">when False, no additional json-properties allowed in the data, when nothing, use value from Header</param>
+    Protected Overrides Sub ValidateVersionAndBody(ByVal fileVersion As String, ByVal body As JObject, ByVal allowAdditionalProps As Boolean, ByVal validateMsgs As IList(Of String))
+        Dim fromVersion = "1.0.0"
+        Dim toVersion = "2.0.0"
+        If Not IsSemanticVersionsSupported(fileVersion, fromVersion, toVersion) Then
+            validateMsgs.Add(format("Unsupported FileVersion({0}, was not in between [{1}, )", fileVersion, fromVersion, toVersion))
+        Else
+            Dim schema = JsonSchema.Parse(JSchemaStr(allowAdditionalProps)) ' TODO: Lazily create schemas once
 
-        If (validateMsgs.Any()) Then
-            Throw New SystemException(format("Invalid Preferences due to: {0}", String.Join(vbCrLf, validateMsgs)))
+            ValidateJson(body, schema, validateMsgs)
         End If
     End Sub
 
@@ -127,22 +98,9 @@ Public Class cPreferences
 
 
 #Region "json props"
-    Public ReadOnly Property FileVersion As String
-        Get
-            Return Me.Json_Contents("Header")("FileVersion")
-        End Get
-    End Property
-
-    Public ReadOnly Property Strict As Boolean
-        Get
-            Return Me.Json_Contents("Header")("Strict")
-        End Get
-    End Property
-
-
     Public Property WorkingDir As String
         Get
-            Dim value As String = Me.Json_Contents("Body")("WorkingDir")
+            Dim value As String = Me.Body("WorkingDir")
             If value Is Nothing OrElse value.Trim().Length = 0 Then
                 Return MyPath
             ElseIf IO.Path.IsPathRooted(value) Then
@@ -185,51 +143,48 @@ Public Class cPreferences
                 End If
             End If
 
-            If value Is Nothing Then
-                Me.Json_Contents("Body")("WorkingDir") = Nothing
-            Else
-                Me.Json_Contents("Body")("WorkingDir") = value
-            End If
+            Dim var As Object = value ' NOTE: Avoid early-binding so that Nulls do not end-up with String as schema-type.
+            Me.Body("WorkingDir") = var
         End Set
     End Property
 
     Public Property WriteLog As Boolean
         Get
-            Return Me.Json_Contents("Body")("WriteLog")
+            Return Me.Body("WriteLog")
         End Get
         Set(ByVal value As Boolean)
-            Me.Json_Contents("Body")("WriteLog") = value
+            Me.Body("WriteLog") = value
         End Set
     End Property
 
     Public Property LogSize As Integer
         Get
-            Return Me.Json_Contents("Body")("LogSize")
+            Return Me.Body("LogSize")
         End Get
         Set(ByVal value As Integer)
-            Me.Json_Contents("Body")("LogSize") = value
+            Me.Body("LogSize") = value
         End Set
     End Property
 
     Public Property LogLevel As Integer
         Get
-            Return Me.Json_Contents("Body")("LogLevel")
+            Return Me.Body("LogLevel")
         End Get
         Set(ByVal value As Integer)
-            Me.Json_Contents("Body")("LogLevel") = value
+            Me.Body("LogLevel") = value
         End Set
     End Property
 
     Public Property Editor As String
         Get
-            Return Me.Json_Contents("Body")("Editor")
+            Return Me.Body("Editor")
         End Get
         Set(ByVal value As String)
             If value Is Nothing OrElse value.Trim().Length = 0 Then
                 value = "notepad.exe"
             End If
 
-            Me.Json_Contents("Body")("Editor") = value
+            Me.Body("Editor") = value
         End Set
     End Property
 #End Region ' "json props"
diff --git a/CSE/Classes/cSemanticVersion.vb b/CSE/Classes/cSemanticVersion.vb
new file mode 100644
index 0000000000000000000000000000000000000000..b8e85a125c126c8010f3c3202b6a9436bd092ec0
--- /dev/null
+++ b/CSE/Classes/cSemanticVersion.vb
@@ -0,0 +1,525 @@
+''-----------------------------------------------------------------------------
+'' <copyright file="SemanticVersion.cs" company="ImaginaryRealities">
+'' Copyright 2013 ImaginaryRealities, LLC
+'' </copyright>
+'' <summary>
+'' This file implements the SemanticVersion class. The SemanticVersion class
+'' represents a semantic version number for a program.
+'' </summary>
+'' <license>
+'' Permission is hereby granted, free of charge, to any person obtaining a copy
+'' of this software and associated documentation files (the "Software"), to
+'' deal in the Software without restriction, including but without limitation
+'' the rights to use, copy, modify, merge, publish, distribute, sublicense,
+'' and/or sell copies of the Software, and to permit persons to whom the
+'' Software is furnished to do so, subject to the following conditions:
+''
+'' The above copyright notice and this permission notice shall be included in
+'' all copies or substantial portions of the Software.
+''
+'' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+'' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+'' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+'' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+'' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+'' FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+'' IN THE SOFTWARE.
+'' </license>
+''-----------------------------------------------------------------------------
+''
+'' Copied from: http://www.michaelfcollins3.me/blog/2013/01/23/semantic_versioning_dotnet.html
+''      github: https://gist.github.com/mfcollins3/4624831
+'' Adapted to VB.net by ankostis@gmail.com
+
+
+Imports System
+Imports System.Diagnostics.CodeAnalysis
+Imports System.Globalization
+Imports System.Text.RegularExpressions
+'Imports System.Diagnostics.Contracts
+
+''' <summary>
+''' Stores a semantic version number for a program.
+''' </summary>
+<Serializable()>
+Public NotInheritable Class cSemanticVersion
+    Implements IComparable, IComparable(Of cSemanticVersion), IEquatable(Of cSemanticVersion)
+
+    ''' <summary>
+    ''' A regular expression to detect whether a string contains only
+    ''' digits.
+    ''' </summary>
+    Private Shared ReadOnly AllDigitsRegex As New Regex("^[0-9]+$", RegexOptions.Compiled Or RegexOptions.Singleline)
+
+    ''' <summary>
+    ''' A regular expression to detect whether a string contains only
+    ''' digits.
+    ''' </summary>
+    Private Shared ReadOnly AlphaRegex As New Regex("^[A-Za-z0-9\-\.]+$", RegexOptions.Compiled Or RegexOptions.Singleline)
+
+    ''' <summary>
+    ''' The regular expression to use to parse a semantic version number.
+    ''' </summary>
+    Private Shared ReadOnly SemanticVersionRegex As New Regex( _
+            "^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)(-(?<prerelease>[A-Za-z0-9\-\.]+))?(\+(?<build>[A-Za-z0-9\-\.]+))?$", _
+            RegexOptions.Compiled Or RegexOptions.Singleline)
+
+    ''' <summary>
+    ''' Initializes a new instance of the <see cref="SemanticVersion"/> class.
+    ''' </summary>
+    ''' <param name="version">
+    ''' The semantic version number to be parsed.
+    ''' </param>
+    Public Sub New(ByVal version As String)
+        'Contract.Requires(Of ArgumentException)(Not String.IsNullOrEmpty(version))
+        'Contract.Ensures(0 <= Me.MajorVersion)
+        'Contract.Ensures(0 <= Me.MinorVersion)
+        'Contract.Ensures(0 <= Me.PatchVersion)
+        'Contract.Ensures(AlphaRegex.Match(Me.PrereleaseVersion).Success)
+        'Contract.Ensures(AlphaRegex.Match(Me.BuildVersion).Success)
+
+        Dim match = SemanticVersionRegex.Match(version)
+        If (Not match.Success) Then
+            Throw New ArgumentException(String.Format("Invalid Version-string({0})!", version))
+        End If
+
+        Me.MajorVersion = Integer.Parse(match.Groups("major").Value, CultureInfo.InvariantCulture)
+        Me.MinorVersion = Integer.Parse(match.Groups("minor").Value, CultureInfo.InvariantCulture)
+        Me.PatchVersion = Integer.Parse(match.Groups("patch").Value, CultureInfo.InvariantCulture)
+        If match.Groups("prerelease").Success Then
+            Me.PrereleaseVersion = match.Groups("prerelease").Value
+        End If
+        If match.Groups("build").Success Then
+            Me.BuildVersion = match.Groups("build").Value
+        End If
+    End Sub
+
+    ''' <summary>
+    ''' Initializes a new instance of the <see cref="SemanticVersion"/> class.
+    ''' </summary>
+    ''' <param name="majorVersion">
+    ''' The major version number.
+    ''' </param>
+    ''' <param name="minorVersion">
+    ''' The minor version number.
+    ''' </param>
+    ''' <param name="patchVersion">
+    ''' The patch version number.
+    ''' </param>
+    Public Sub New(ByVal majorVersion As Integer, ByVal minorVersion As Integer, ByVal patchVersion As Integer, Optional ByVal prereleaseVersion As String = Nothing, Optional ByVal buildVersion As String = Nothing)
+        'Contract.Requires(Of ArgumentException)(0 <= majorVersion)
+        'Contract.Requires(Of ArgumentException)(0 <= minorVersion)
+        'Contract.Requires(Of ArgumentException)(0 <= patchVersion)
+        'Contract.Ensures(0 <= Me.MajorVersion)
+        'Contract.Ensures(0 <= Me.MinorVersion)
+        'Contract.Ensures(0 <= Me.PatchVersion)
+
+        Me.MajorVersion = majorVersion
+        Me.MinorVersion = minorVersion
+        Me.PatchVersion = patchVersion
+        Me.PrereleaseVersion = prereleaseVersion
+        Me.BuildVersion = buildVersion
+    End Sub
+
+
+    ''' <summary>
+    ''' Gets the build number.
+    ''' </summary>
+    ''' <value>
+    ''' The value of this property is a string containing the build
+    ''' identifier for the version number.
+    ''' </value>
+    Public Property BuildVersion As String
+
+    ''' <summary>
+    ''' Gets the major version number.
+    ''' </summary>
+    ''' <value>
+    ''' The value of this property is a non-negative integer for the major
+    ''' version number.
+    ''' </value>
+    Public Property MajorVersion As Integer
+
+    ''' <summary>
+    ''' Gets the minor version number.
+    ''' </summary>
+    ''' <value>
+    ''' The value of this property is a non-negative integer for the minor
+    ''' version number.
+    ''' </value>
+    Public Property MinorVersion As Integer
+
+    ''' <summary>
+    ''' Gets the patch version number.
+    ''' </summary>
+    ''' <value>
+    ''' The value of this property is a non-negative integer for the patch
+    ''' version number.
+    ''' </value>
+    Public Property PatchVersion As Integer
+
+    ''' <summary>
+    ''' Gets the pre-release version component.
+    ''' </summary>
+    ''' <value>
+    ''' The value of this property is a string containing the pre-release
+    ''' identifier.
+    ''' </value>
+    Public Property PrereleaseVersion As String
+
+    ''' <summary>
+    ''' Compares two <see cref="SemanticVersion"/> objects for equality.
+    ''' </summary>
+    ''' <param name="version">
+    ''' The first <see cref="SemanticVersion"/> object to compare.
+    ''' </param>
+    ''' <param name="other">
+    ''' The second semantic version object to compare.
+    ''' </param>
+    ''' <returns>
+    ''' <b>True</b> if the objects are equal, or <b>false</b> if the
+    ''' objects are not equal.
+    ''' </returns>
+    Public Shared Operator =(ByVal version As cSemanticVersion, ByVal other As cSemanticVersion) As Boolean
+        If (version Is Nothing) Then Return other Is Nothing
+
+        Return version.Equals(other)
+    End Operator
+
+    ''' <summary>
+    ''' Compares two <see cref="SemanticVersion"/> objects for equality.
+    ''' </summary>
+    ''' <param name="version">
+    ''' The first <see cref="SemanticVersion"/> object to compare.
+    ''' </param>
+    ''' <param name="other">
+    ''' The second <see cref="SemanticVersion"/> object to compare.
+    ''' </param>
+    ''' <returns>
+    ''' <b>True</b> if the objects are not equal, or <b>false</b> if the
+    ''' objects are equal.
+    ''' </returns>
+    Public Shared Operator <>(ByVal version As cSemanticVersion, ByVal other As cSemanticVersion) As Boolean
+        If (version Is Nothing) Then Return Not other Is Nothing
+
+        Return Not version.Equals(other)
+    End Operator
+
+    ''' <summary>
+    ''' Compares two <see cref="SemanticVersion"/> objects to determine if
+    ''' the first object logically precedes the second object.
+    ''' </summary>
+    ''' <param name="version">
+    ''' The first <see cref="SemanticVersion"/> object to compare.
+    ''' </param>
+    ''' <param name="other">
+    ''' The second <see cref="SemanticVersion"/> object to compare.
+    ''' </param>
+    ''' <returns>
+    ''' <b>True</b> if <paramref name="version"/> precedes 
+    ''' <paramref name="other"/>, otherwise <b>false</b>.
+    ''' </returns>
+    Public Shared Operator <(ByVal version As cSemanticVersion, ByVal other As cSemanticVersion) As Boolean
+        'Contract.Requires(Of ArgumentNullException)(version IsNot Nothing)
+        'Contract.Requires(Of ArgumentNullException)(other IsNot Nothing)
+
+        Return 0 > version.CompareTo(other)
+    End Operator
+    Public Shared Operator <=(ByVal version As cSemanticVersion, ByVal other As cSemanticVersion) As Boolean
+        'Contract.Requires(Of ArgumentNullException)(version IsNot Nothing)
+        'Contract.Requires(Of ArgumentNullException)(other IsNot Nothing)
+
+        Return 0 >= version.CompareTo(other)
+    End Operator
+
+    ''' <summary>
+    ''' Compares two <see cref="SemanticVersion"/> object to determine if
+    ''' the first object logically precedes the second object.
+    ''' </summary>
+    ''' <param name="version">
+    ''' The first <see cref="SemanticVersion"/> object to compare.
+    ''' </param>
+    ''' <param name="other">
+    ''' The second <see cref="SemanticVersion"/> object to compare.
+    ''' </param>
+    ''' <returns>
+    ''' <b>True</b> if <paramref name="version"/> follows
+    ''' <paramref name="other"/>, otherwise <b>false</b>.
+    ''' </returns>
+    Public Shared Operator >(ByVal version As cSemanticVersion, ByVal other As cSemanticVersion) As Boolean
+        'Contract.Requires(Of ArgumentNullException)(version IsNot Nothing)
+        'Contract.Requires(Of ArgumentNullException)(version IsNot Nothing)
+
+        Return 0 < version.CompareTo(other)
+    End Operator
+    Public Shared Operator >=(ByVal version As cSemanticVersion, ByVal other As cSemanticVersion) As Boolean
+        'Contract.Requires(Of ArgumentNullException)(version IsNot Nothing)
+        'Contract.Requires(Of ArgumentNullException)(version IsNot Nothing)
+
+        Return 0 <= version.CompareTo(other)
+    End Operator
+
+    ''' <summary>
+    ''' Compares two objects.
+    ''' </summary>
+    ''' <param name="obj">
+    ''' The object to compare to this object.
+    ''' </param>
+    ''' <returns>
+    ''' Returns a value that indicates the relative order of the objects
+    ''' that are being compared.
+    ''' <list type="table">
+    ''' <listheader>
+    ''' <term>Value</term>
+    ''' <description>Meaning</description>
+    ''' </listheader>
+    ''' <item>
+    ''' <term>Less than zero</term>
+    ''' <description>
+    ''' This instance precedes <paramref name="obj"/> in the sort order.
+    ''' </description>
+    ''' </item>
+    ''' <item>
+    ''' <term>Zero</term>
+    ''' <description>
+    ''' This instance occurs in the same position in the sort order as
+    ''' <paramref name="obj"/>.
+    ''' </description>
+    ''' </item>
+    ''' <item>
+    ''' <term>Greater than zero</term>
+    ''' <description>
+    ''' This instance follows <paramref name="obj"/> in the sort order.
+    ''' </description>
+    ''' </item>
+    ''' </list>
+    ''' </returns>
+    ''' <exception cref="ArgumentException">
+    ''' <paramref name="obj"/> is not a <see cref="SemanticVersion"/>
+    ''' object.
+    ''' </exception>
+    Public Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo
+        If obj Is Nothing Then Throw New ArgumentNullException("Other Object is Null!")
+        If Not TypeOf obj Is cSemanticVersion Then Throw New ArgumentException(String.Format("Other Object({0}) is not a SemanticVersion!", obj))
+
+        Return Me.CompareTo(DirectCast(obj, cSemanticVersion))
+    End Function
+
+    ''' <summary>
+    ''' Compares the current object with another 
+    ''' <see cref="SemanticVersion"/> object.
+    ''' </summary>
+    ''' <param name="other">
+    ''' The other <see cref="SemanticVersion"/> object to compare to this
+    ''' instance.
+    ''' </param>
+    ''' <returns>
+    ''' Returns a value that indicates the relative order of the objects
+    ''' that are being compared.
+    ''' <list type="table">
+    ''' <listheader>
+    ''' <term>Value</term>
+    ''' <description>Meaning</description>
+    ''' </listheader>
+    ''' <item>
+    ''' <term>Less than zero</term>
+    ''' <description>
+    ''' This instance precedes <paramref name="other"/> in the sort order.
+    ''' </description>
+    ''' </item>
+    ''' <item>
+    ''' <term>Zero</term>
+    ''' <description>
+    ''' This instance occurs in the same position in the sort order as
+    ''' <paramref name="other"/>.
+    ''' </description>
+    ''' </item>
+    ''' <item>
+    ''' <term>Greater than zero</term>
+    ''' <description>
+    ''' This instance follows <paramref name="other"/> in the sort order.
+    ''' </description>
+    ''' </item>
+    ''' </list>
+    ''' </returns>
+    Public Function CompareTo(ByVal other As cSemanticVersion) As Integer Implements IComparable(Of CSE.cSemanticVersion).CompareTo
+        If (other Is Nothing) Then Throw New ArgumentNullException("other")
+
+        If (other Is Me) Then Return 0
+
+        Dim result = Me.MajorVersion.CompareTo(other.MajorVersion)
+        If (0 = result) Then
+            result = Me.MinorVersion.CompareTo(other.MinorVersion)
+            If (0 = result) Then
+                result = Me.PatchVersion.CompareTo(other.PatchVersion)
+                If (0 = result) Then
+                    result = ComparePrereleaseVersions(Me.PrereleaseVersion, other.PrereleaseVersion)
+                End If
+            End If
+        End If
+
+        Return result
+    End Function
+
+    ''' <summary>
+    ''' Compares this instance to another object for equality.
+    ''' </summary>
+    ''' <param name="obj">
+    ''' The object to compare to this instance.
+    ''' </param>
+    ''' <returns>
+    ''' <b>True</b> if the objects are equal, or <b>false</b> if the
+    ''' objects are not equal.
+    ''' </returns>
+    Public Overrides Function Equals(ByVal obj As Object) As Boolean
+        If (obj Is Nothing) Then Return False
+        If (obj Is Me) Then Return True
+        If (Not TypeOf obj Is cSemanticVersion) Then Return False
+
+        Return Me.Equals(DirectCast(obj, cSemanticVersion))
+    End Function
+
+    ''' <summary>
+    ''' Compares this instance to another <see cref="SemanticVersion"/>
+    ''' object for equality.
+    ''' </summary>
+    ''' <param name="other">
+    ''' The <see cref="SemanticVersion"/> object to compare to this
+    ''' instance.
+    ''' </param>
+    ''' <returns>
+    ''' <b>True</b> if the objects are equal, or false if the objects are
+    ''' not equal.
+    ''' </returns>
+    Public Overloads Function Equals(ByVal other As cSemanticVersion) As Boolean Implements IEquatable(Of CSE.cSemanticVersion).Equals
+        If (other Is Me) Then Return True
+
+        If (other Is Nothing) Then Return False
+
+        Return Me.MajorVersion = other.MajorVersion AndAlso Me.MinorVersion = other.MinorVersion _
+                   AndAlso Me.PatchVersion = other.PatchVersion AndAlso Me.PrereleaseVersion = other.PrereleaseVersion _
+                   AndAlso Me.BuildVersion = other.BuildVersion
+    End Function
+
+
+    ''' <summary>
+    ''' Calculates the hash code for the object.
+    ''' </summary>
+    ''' <returns>
+    ''' The hash code for the object.
+    ''' </returns>
+    Public Overrides Function GetHashCode() As Integer
+        Dim hashCode = 17
+        hashCode = (hashCode * 37) + Me.MajorVersion
+        hashCode = (hashCode * 37) + Me.MinorVersion
+        hashCode = (hashCode * 37) + Me.PatchVersion
+        If Me.PrereleaseVersion IsNot Nothing Then
+            hashCode = (hashCode * 37) + Me.PrereleaseVersion.GetHashCode()
+        End If
+
+        If Me.BuildVersion IsNot Nothing Then
+            hashCode = (hashCode * 37) + Me.BuildVersion.GetHashCode()
+        End If
+        Return hashCode
+    End Function
+
+    ''' <summary>
+    ''' Returns the string representation of the semantic version number.
+    ''' </summary>
+    ''' <returns>
+    ''' The semantic version number.
+    ''' </returns>
+    Public Overrides Function ToString() As String
+        Return String.Format(
+            CultureInfo.InvariantCulture,
+            "{0}.{1}.{2}{3}{4}",
+            Me.MajorVersion,
+            Me.MinorVersion,
+            Me.PatchVersion,
+            IIf(String.IsNullOrEmpty(Me.PrereleaseVersion), String.Empty, "-" + Me.PrereleaseVersion),
+            IIf(String.IsNullOrEmpty(Me.BuildVersion), String.Empty, "+" + Me.BuildVersion))
+    End Function
+
+    ''' <summary>
+    ''' Compares two build version values to determine precedence.
+    ''' </summary>
+    ''' <param name="identifier1">
+    ''' The first identifier to compare.
+    ''' </param>
+    ''' <param name="identifier2">
+    ''' The second identifier to compare.
+    ''' </param>
+    ''' <returns>
+    ''' Returns a value that indicates the relative order of the objects
+    ''' that are being compared.
+    ''' <list type="table">
+    ''' <listheader>
+    ''' <term>Value</term>
+    ''' <description>Meaning</description>
+    ''' </listheader>
+    ''' <item>
+    ''' <term>Less than zero</term>
+    ''' <description>
+    ''' <paramref name="identifier1"/> precedes 
+    ''' <paramref name="identifier2"/> in the sort order.
+    ''' </description>
+    ''' </item>
+    ''' <item>
+    ''' <term>Zero</term>
+    ''' <description>
+    ''' The identifiers occur in the same position in the sort order.
+    ''' </description>
+    ''' </item>
+    ''' <item>
+    ''' <term>Greater than zero</term>
+    ''' <description>
+    ''' <paramref name="identifier1"/> follows 
+    ''' <paramref name="identifier2"/> in the sort order.
+    ''' </description>
+    ''' </item>
+    ''' </list>
+    ''' </returns>
+    Private Shared Function ComparePrereleaseVersions(ByVal identifier1 As String, ByVal identifier2 As String) As Integer
+        Dim result As Integer = 0
+        Dim hasIdentifier1 = Not String.IsNullOrEmpty(identifier1)
+        Dim hasIdentifier2 = Not String.IsNullOrEmpty(identifier2)
+        If (hasIdentifier1 AndAlso Not hasIdentifier2) Then
+            result = 1
+        ElseIf (Not hasIdentifier1 AndAlso hasIdentifier2) Then
+            result = -1
+        ElseIf (hasIdentifier1) Then
+            Dim dotDelimiter As Char() = {"."c}
+            Dim parts1 = identifier1.Split(dotDelimiter, StringSplitOptions.RemoveEmptyEntries)
+            Dim parts2 = identifier2.Split(dotDelimiter, StringSplitOptions.RemoveEmptyEntries)
+            Dim max = Math.Max(parts1.Length, parts2.Length)
+            For i = 0 To max
+                If (i = parts1.Length AndAlso i <> parts2.Length) Then
+                    result = -1
+                    Exit For
+                End If
+
+                If (i <> parts1.Length AndAlso i = parts2.Length) Then
+                    result = 1
+                    Exit For
+                End If
+
+                Dim part1 = parts1(i)
+                Dim part2 = parts2(i)
+                If (AllDigitsRegex.IsMatch(part1) AndAlso AllDigitsRegex.IsMatch(part2)) Then
+                    Dim value1 = Integer.Parse(part1, CultureInfo.InvariantCulture)
+                    Dim value2 = Integer.Parse(part2, CultureInfo.InvariantCulture)
+                    result = value1.CompareTo(value2)
+                Else
+                    result = String.Compare(part1, part2, StringComparison.Ordinal)
+
+                    If (0 <> result) Then
+                        Exit For
+                    End If
+                End If
+            Next
+        End If
+
+        Return result
+    End Function
+
+End Class
diff --git a/CSE/GUI/F_Main.vb b/CSE/GUI/F_Main.vb
index 2171c055e03ebbae801f154a7c4f361540425ef9..f2557ec935368293722eee685324a2d2cef91650 100644
--- a/CSE/GUI/F_Main.vb
+++ b/CSE/GUI/F_Main.vb
@@ -28,9 +28,7 @@ Public Class F_Main
         ' Load the config file
         '
         Try
-            Dim fileprefs As New cPreferences(PreferencesPath)
-            fileprefs.Validate()
-            AppPreferences = fileprefs
+            AppPreferences = New cPreferences(PreferencesPath)
         Catch ex As Exception
             fInfWarErr(9, False, format("Failed loading Preferences({0}) due to: {1}", PreferencesPath, ex.Message))
             configL = False
@@ -61,7 +59,7 @@ Public Class F_Main
         If Not configL Then
             Try
                 AppPreferences.Store(PreferencesPath)
-                fInfWarErr(7, False, format("Created Preferences({0}).", PreferencesPath))
+                fInfWarErr(7, False, format("Stored new Preferences({0}).", PreferencesPath))
             Catch ex As Exception
                 fInfWarErr(9, False, format("Failed storing Preferences({0}) due to: {1}", PreferencesPath, ex.Message))
             End Try
diff --git a/CSE/GUI/F_Preferences.vb b/CSE/GUI/F_Preferences.vb
index 1019d92aaf33722c581cb803623e1f6e8cbb644c..dfa0dbd45e546e3eb0b5139393326e0b52ad61fd 100644
--- a/CSE/GUI/F_Preferences.vb
+++ b/CSE/GUI/F_Preferences.vb
@@ -20,7 +20,6 @@ Public Class F_Preferences
 
     Private Function prefs_PopulateTo() As cPreferences
         Dim value = New cPreferences()
-        value.Validate()
 
         value.WorkingDir = Me.TextBoxWorDir.Text
         value.Editor = Me.TextBoxNotepad.Text
diff --git a/CSE/Tools/ApplicationEvents.vb b/CSE/Tools/ApplicationEvents.vb
index 7f2a0a2a68c4fa2989c8191d2646b561ca18e10a..cb66a913c6deb5617bcf0e8058890cd506e1e974 100644
--- a/CSE/Tools/ApplicationEvents.vb
+++ b/CSE/Tools/ApplicationEvents.vb
@@ -7,6 +7,7 @@
 
             ' Close the open Filebrowser (Save the History)
             fbTXT.Close()
+            fbExe.Close()
             fbVECTO.Close()
             fbCSV.Close()
             fbDir.Close()
@@ -40,8 +41,7 @@
             ' compile date
             AppDate = fiAss.LastWriteTime.Date
 
-            AppPreferences = New cPreferences()
-            ''AppPreferences.Validate() !!!Skip schema-validation here, or else app hangs as zombie! (do it instead when creating new for Dialog)
+            AppPreferences = New cPreferences(, True) ' !!!Skip schema-validation here, or else app hangs as zombie! (do it instead when creating new for Dialog)
 
             ' Licencemodul
             Lic.FilePath = joinPaths(MyPath, "License.dat")
diff --git a/CSE/Tools/Minor_routines.vb b/CSE/Tools/Minor_routines.vb
index d6c722524b7a5b48e8a5219790a6fdf668018463..004d4e05a6327626d8f22a03ec05bc2d7152cbb6 100644
--- a/CSE/Tools/Minor_routines.vb
+++ b/CSE/Tools/Minor_routines.vb
@@ -5,9 +5,24 @@ Imports System.Text.RegularExpressions
 
 Module Minor_routines
 
-    ' Functions for the identification from the fileend, -name and for the path identification
+    Function IsSemanticVersionsSupported(ByVal checkVersion As String, ByVal fromVersion As String, Optional ByVal toVersion As String = Nothing) As Boolean
+
+        Dim cver As New cSemanticVersion(checkVersion)
+        Dim fver As New cSemanticVersion(fromVersion)
+
+        If toVersion Is Nothing Then
+            Return fver <= cver
+        Else
+            Dim tver As New cSemanticVersion(toVersion)
+            Return fver <= cver AndAlso cver < tver
+        End If
+
+    End Function
+
+
+
+#Region "File paths" ' Functions for the identification from the fileend, -name and for the path identification
 
-#Region "File paths"
     ' Identification from the filename
     Public Function fName(ByVal Pfad As String, ByVal MitEndung As Boolean) As String
         Dim x As Int16
@@ -392,5 +407,4 @@ Module Minor_routines
 
 #End Region ' Strings
 
-
 End Module
\ No newline at end of file