diff --git a/VECTOAux/VectoAuxiliaries/Electrics/Alternator.vb b/VECTOAux/VectoAuxiliaries/Electrics/Alternator.vb
index 659f8f7d171f9310d4f017c4edadd465055635c5..4408494954bea48f200979028aef199fc04cfeab 100644
--- a/VECTOAux/VectoAuxiliaries/Electrics/Alternator.vb
+++ b/VECTOAux/VectoAuxiliaries/Electrics/Alternator.vb
@@ -22,13 +22,15 @@ End Class
 Public Class Alternator
  Implements IAlternator
 
+
+
  Public Property AlternatorName As String Implements IAlternator.AlternatorName
  Public Property  PulleyRatio As Single Implements IAlternator.PulleyRatio
 
  Public Property InputTable2000 As  New List(Of AltUserInput) Implements IAlternator.InputTable2000  
  Public Property InputTable4000 As  New List(Of AltUserInput) Implements IAlternator.InputTable4000
  Public Property InputTable6000 As  New List(Of AltUserInput) Implements IAlternator.InputTable6000
- Public Property RangeTable     As  New List(Of Table4Row) Implements IAlternator.RangeTable
+ Public Property RangeTable     As  New List(Of Table4Row)    Implements IAlternator.RangeTable
 
  Private signals As ICombinedAlternatorSignals 
 
@@ -283,7 +285,29 @@ Public Class Alternator
   End Sub
 
 
-   
+
+  Public Function IsEqualTo(other As IAlternator) As Boolean Implements IAlternator.IsEqualTo
+
+     If Me.AlternatorName <> other.AlternatorName then Return False
+     If Me.PulleyRatio <> other.PulleyRatio then Return false
+     
+     Dim i As Integer =1
+
+     For i= 1 to 3
+
+       If Me.InputTable2000(i).Eff <> other.InputTable2000(i).Eff then Return False
+       If Me.InputTable4000(i).Eff <> other.InputTable4000(i).Eff then Return False
+       If Me.InputTable6000(i).Eff <> other.InputTable6000(i).Eff then Return False
+
+
+     Next
+
+    Return True
+    
+  End Function
+
+
+
 End Class
 
 
diff --git a/VECTOAux/VectoAuxiliaries/Electrics/CombinedAlternator.vb b/VECTOAux/VectoAuxiliaries/Electrics/CombinedAlternator.vb
index 9690f55962bbfbaf6dd354555812776fb54ccd34..01a27bddac49888a370f58a59faadf4af19088d9 100644
--- a/VECTOAux/VectoAuxiliaries/Electrics/CombinedAlternator.vb
+++ b/VECTOAux/VectoAuxiliaries/Electrics/CombinedAlternator.vb
@@ -1,4 +1,6 @@
-Imports VectoAuxiliaries.Electrics
+
+
+Imports VectoAuxiliaries.Electrics
 Imports System
 Imports System.Collections.Generic
 Imports System.Linq
@@ -9,18 +11,21 @@ Imports DocumentFormat.OpenXml.Spreadsheet
 Imports SpreadsheetLight
 Imports Newtonsoft.Json
 Imports VectoAuxiliaries
+Imports System.Globalization
 
 
 Namespace Electrics
 
 Public Class CombinedAlternator
-   Implements IAlternatorMap
+   Implements IAlternatorMap, ICombinedAlternator
+
 
 
-  Private map As new List(Of ICombinedAlternatorMapRow)
 
+  Private map As New List(Of ICombinedAlternatorMapRow)
 
-  Public Property Alternators As New List(Of IAlternator)
+
+  Public Property Alternators As New List(Of IAlternator)  Implements ICombinedAlternator.Alternators
   Private OriginalAlternators As New List(Of IAlternator)
 
   Private FilePath As String
@@ -28,184 +33,184 @@ Public Class CombinedAlternator
 
 
  'Interface Implementation
- Public Function GetEfficiency( ByVal CrankRPM As Single , ByVal  Amps  As Single ) As AlternatorMapValues Implements IAlternatorMap.GetEfficiency
+ Public Function GetEfficiency(ByVal CrankRPM As Single, ByVal Amps As Single) As AlternatorMapValues Implements IAlternatorMap.GetEfficiency
 
     altSignals.CrankRPM = CrankRPM
     altSignals.CurrentDemandAmps = Amps / Alternators.Count
 
-    Return  New AlternatorMapValues( Alternators.Average( Function(a) a.Efficiency)/100)
+    Return New AlternatorMapValues(Alternators.Average(Function(a) a.Efficiency) / 100)
 
 
  End Function
- public Function Initialise() As Boolean Implements IAlternatorMap.Initialise
+ Public Function Initialise() As Boolean Implements IAlternatorMap.Initialise
 
    'From the map we construct this CombinedAlternator object and original CombinedAlternator Object
 
-   Alternators.Clear
-   OriginalAlternators.Clear
+   Alternators.Clear()
+   OriginalAlternators.Clear()
 
 
-   For Each alt As IEnumerable(Of ICombinedAlternatorMapRow)  In map.GroupBy( Function(g) g.AlternatorName)
+   For Each alt As IEnumerable(Of ICombinedAlternatorMapRow) In map.GroupBy(Function(g) g.AlternatorName)
 
      Dim altName As String = alt.First().AlternatorName
      Dim pulleyRatio As Single = alt.First().PulleyRatio
 
 
-     Dim alternator  As IAlternator = New Alternator(altSignals, alt.ToList())
+     Dim alternator As IAlternator = New Alternator(altSignals, alt.ToList())
 
-     Alternators.Add( alternator )
+     Alternators.Add(alternator)
 
 
    Next
 
-   Return true
+   Return True
 
  End Function
 
  'Constructors
- public sub new( filePath as String)
+ Public Sub New(filePath As String)
 
       Dim feedback As String = String.Empty
 
-      If Not FilePathUtils.ValidateFilePath(filePath,".aalt", feedback) then
+      If Not FilePathUtils.ValidateFilePath(filePath, ".aalt", feedback) Then
          Throw New ArgumentException(String.Format("Combined Alternator requires a valid .AALT filename. : {0}", feedback))
         Else
-          me.filePath = filePath
+          Me.FilePath = filePath
       End If
 
 
-      Me.altSignals= New CombinedAlternatorSignals()
+      Me.altSignals = New CombinedAlternatorSignals()
 
 
       'IF file exists then read it otherwise create a default.
 
-      If File.Exists( filePath )  andAlso InitialiseMap( filePath) then
+      If File.Exists(filePath) AndAlso InitialiseMap(filePath) Then
         Initialise()
-      else
+      Else
 
        'Create Default Map
         CreateDefaultMap()
-        Initialise
+        Initialise()
 
       End If
 
  End Sub
 
  'Helpers
- Private sub CreateDefaultMap()
-
-    map.Clear
-
-    map.Add( new CombinedAlternatorMapRow("Alt1",2000,10,50,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",2000,40,50,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",2000,60,50,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",4000,10,70,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",4000,40,70,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",4000,60,70,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",6000,10,60,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",6000,40,60,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt1",6000,60,60,3   ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",2000,10,80,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",2000,40,80,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",2000,60,80,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",4000,10,40,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",4000,40,40,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",4000,60,40,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",6000,10,60,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",6000,40,60,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt2",6000,60,60,2.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",2000,10,95,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",2000,40,50,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",2000,60,90,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",4000,10,99,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",4000,40, 1,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",4000,60,55,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",6000,10,94,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",6000,40,86,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt3",6000,60,13,3.5 ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",2000,10,55,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",2000,40,45,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",2000,60,67,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",4000,10,77,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",4000,40,39,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",4000,60,23,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",6000,10,34,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",6000,40,67,2   ))
-    map.Add( new CombinedAlternatorMapRow("Alt4",6000,60,35,2   ))
+ Private Sub CreateDefaultMap()
+
+    map.Clear()
+
+    map.Add(New CombinedAlternatorMapRow("Alt1", 2000, 10, 50, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 2000, 40, 50, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 2000, 60, 50, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 4000, 10, 70, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 4000, 40, 70, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 4000, 60, 70, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 6000, 10, 60, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 6000, 40, 60, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt1", 6000, 60, 60, 3))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 2000, 10, 80, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 2000, 40, 80, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 2000, 60, 80, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 4000, 10, 40, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 4000, 40, 40, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 4000, 60, 40, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 6000, 10, 60, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 6000, 40, 60, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt2", 6000, 60, 60, 2.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 2000, 10, 95, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 2000, 40, 50, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 2000, 60, 90, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 4000, 10, 99, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 4000, 40, 1, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 4000, 60, 55, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 6000, 10, 94, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 6000, 40, 86, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt3", 6000, 60, 13, 3.5))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 2000, 10, 55, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 2000, 40, 45, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 2000, 60, 67, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 4000, 10, 77, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 4000, 40, 39, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 4000, 60, 23, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 6000, 10, 34, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 6000, 40, 67, 2))
+    map.Add(New CombinedAlternatorMapRow("Alt4", 6000, 60, 35, 2))
 
 
  End Sub
 
  'Grid Management
- private Function AddNewAlternator( list As List(Of ICombinedAlternatorMapRow), ByRef feeback As string) As Boolean
+ Private Function AddNewAlternator(list As List(Of ICombinedAlternatorMapRow), ByRef feeback As String) As Boolean
+
+     Dim returnValue As Boolean = True
 
-     Dim returnValue As Boolean = true
-    
      Dim altName As String = list.First().AlternatorName
      Dim pulleyRatio As Single = list.First().PulleyRatio
 
      'Check alt does not already exist in list
-     If Alternators.where( Function(w) w.AlternatorName=altName).Count>0 then
-       feeback="This alternator already exists in in the list, operation not completed."
+     If Alternators.Where(Function(w) w.AlternatorName = altName).Count > 0 Then
+       feeback = "This alternator already exists in in the list, operation not completed."
        Return False
      End If
 
-     Dim alternator  As IAlternator = New Alternator(altSignals, list.ToList())
+     Dim alternator As IAlternator = New Alternator(altSignals, list.ToList())
 
-     Alternators.Add( alternator )
+     Alternators.Add(alternator)
 
 
    Return returnValue
 
  End Function
- Public Function AddAlternator( rows As List( Of ICombinedAlternatorMapRow)  , byref feedback as string) As Boolean
+ Public Function AddAlternator(rows As List(Of ICombinedAlternatorMapRow), ByRef feedback As String) As Boolean
 
-       If Not   AddNewAlternator( rows, feedback )
-         feedback=String.Format("Unable to add new alternator : {0}", feedback)
-         Return false
+       If Not AddNewAlternator(rows, feedback) Then
+         feedback = String.Format("Unable to add new alternator : {0}", feedback)
+         Return False
        End If
 
-       Return true
+       Return True
 
  End Function
- Public Function DeleteAlternator( alternatorName As string, byref feedback as string ) As Boolean
+ Public Function DeleteAlternator(alternatorName As String, ByRef feedback As String) As Boolean
+
+     If Alternators.Where(Function(w) w.AlternatorName = alternatorName).Count = 0 Then
+       feedback = "This alternator does not exist"
+       Return False
+     End If
 
-     If Alternators.Where( Function(w) w.AlternatorName = alternatorName).Count=0 then
-       feedback="This alternator does not exist"
-       Return false
-     End if
 
+     Dim altToRemove As IAlternator = Alternators.First(Function(w) w.AlternatorName = alternatorName)
+     Dim numAlternators As Integer = Alternators.Count
 
-     Dim altToRemove As IAlternator = Alternators.First( Function(w) w.AlternatorName= alternatorName)
-     Dim numAlternators = Alternators.Count
-   
-     Alternators.Remove( altToRemove)
+     Alternators.Remove(altToRemove)
 
-     If Alternators.Count = numAlternators-1 then
+     If Alternators.Count = numAlternators - 1 Then
       Return True
      Else
-      feedback= String.Format("The alternator {0} could not be removed : {1}", alternatorName, feedback)
-      Return false
+      feedback = String.Format("The alternator {0} could not be removed : {1}", alternatorName, feedback)
+      Return False
      End If
 
  End Function
- Public Function UpdateAlternator(  rows As List( Of ICombinedAlternatorMapRow) , byref feedback as string ) As Boolean
+ Public Function UpdateAlternator(rows As List(Of ICombinedAlternatorMapRow), ByRef feedback As String) As Boolean
 
        Dim altName As String = rows.First.AlternatorName
-       Dim altToUpd As IAlternator = Alternators.First( Function(w) w.AlternatorName = altName)
+       Dim altToUpd As IAlternator = Alternators.First(Function(w) w.AlternatorName = altName)
 
-       If Not DeleteAlternator(altName, feedback) then
-          feedback= feedback
-          Return false
+       If Not DeleteAlternator(altName, feedback) Then
+          feedback = feedback
+          Return False
 
        End If
 
        'Re.create alternator.
 
-       Dim replacementAlt As New Alternator( altSignals, rows )
-       Alternators.Add( replacementAlt)
+       Dim replacementAlt As New Alternator(altSignals, rows)
+       Alternators.Add(replacementAlt)
 
-       Return true
+       Return True
 
 
  End Function
@@ -216,8 +221,8 @@ Public Class CombinedAlternator
 
    Dim returnValue As Boolean = True
    Dim sb As New StringBuilder()
-   Dim row As Integer=0
-   Dim amps, eff As single
+   Dim row As Integer = 0
+   Dim amps, eff As Single
 
    'write headers  
     sb.AppendLine("[AlternatorName],[RPM],[Amps],[Efficiency],[PulleyRatio]")
@@ -227,26 +232,26 @@ Public Class CombinedAlternator
 
 
      '2000 - IE Alt1,2000,10,50,3
-     For  row = 1 to 3
-       amps = alt.InputTable2000(row).Amps : eff = alt.InputTable2000(row).eff
-       sb.Append(alt.AlternatorName + ",2000," + Amps.ToString() + "," + Eff.ToString() + "," + alt.PulleyRatio.ToString())
+     For row = 1 To 3
+       amps = alt.InputTable2000(row).Amps : eff = alt.InputTable2000(row).Eff
+       sb.Append(alt.AlternatorName + ",2000," + amps.ToString() + "," + eff.ToString() + "," + alt.PulleyRatio.ToString())
        sb.AppendLine("")
      Next
 
      '4000 - IE Alt1,2000,10,50,3
-     For  row = 1 to 3
-        amps = alt.InputTable4000(row).Amps : eff  = alt.InputTable4000(row).eff
-       sb.Append(alt.AlternatorName + ",4000," + amps.ToString() + "," + Eff.ToString() + "," + alt.PulleyRatio.ToString())
+     For row = 1 To 3
+        amps = alt.InputTable4000(row).Amps : eff = alt.InputTable4000(row).Eff
+       sb.Append(alt.AlternatorName + ",4000," + amps.ToString() + "," + eff.ToString() + "," + alt.PulleyRatio.ToString())
        sb.AppendLine("")
      Next
 
      '4000 - IE Alt1,2000,10,50,3
-      For  row = 1 to 3
-       amps = alt.InputTable4000(row).Amps : eff  = alt.InputTable6000(row).eff
+      For row = 1 To 3
+       amps = alt.InputTable4000(row).Amps : eff = alt.InputTable6000(row).Eff
        sb.Append(alt.AlternatorName + ",6000," + amps.ToString() + "," + eff.ToString() + "," + alt.PulleyRatio.ToString())
        sb.AppendLine("")
      Next
-      
+
 
    Next
 
@@ -254,24 +259,25 @@ Public Class CombinedAlternator
    ' Write the stream cotnents to a new file named "AllTxtFiles.txt" 
    Using outfile As New StreamWriter(aaltPath)
        outfile.Write(sb.ToString())
-   End Using 
+   End Using
 
    Return returnValue
 
 End Function
- private Function Load() As Boolean 
+ Private Function Load() As Boolean
 
-      If Not InitialiseMap(filePath) then Return False
-      
+      If Not InitialiseMap(FilePath) Then Return False
 
-      Return true
+
+      Return True
 
   End Function
 
  'Initialises the map, only valid when loadingUI for first time in edit mode or always in operational mode.
- Private Function InitialiseMap(filePath As string) As Boolean 
+ Private Function InitialiseMap(filePath As String) As Boolean
 
-      Dim returnValue As Boolean = false
+      Dim returnValue As Boolean = False
+      Dim elements As  String() 
 
       If File.Exists(filePath) Then
                Using sr As StreamReader = New StreamReader(filePath)
@@ -283,7 +289,7 @@ End Function
                        Throw New ArgumentException("Insufficient rows in csv to build a usable map")
                    End If
 
-                   map = new  List(Of ICombinedAlternatorMapRow)
+                   map = New List(Of ICombinedAlternatorMapRow)
 
                    Dim firstline As Boolean = True
 
@@ -291,17 +297,17 @@ End Function
                        If Not firstline Then
 
                        'Advanced Alternator Source Check.
-                       If line.contains("[MODELSOURCE") then Exit For
+                       If line.Contains("[MODELSOURCE") Then Exit For
 
                            'split the line
-                           Dim elements() As String = line.Split(New Char() {","}, StringSplitOptions.RemoveEmptyEntries)
+                           elements = line.Split(  New Char()  {","C} , StringSplitOptions.RemoveEmptyEntries)
                            '3 entries per line required
                            If (elements.Length <> 5) Then
                                Throw New ArgumentException("Incorrect number of values in csv file")
                            End If
                            'add values to map
 
-                            map.Add( New CombinedAlternatorMapRow(elements(0),elements(1),elements(2),elements(3),elements(4)))
+                            map.Add(New CombinedAlternatorMapRow(elements(0), CType(elements(1),Single), CType(elements(2),Single), CType( elements(3),Single), CType(elements(4),single)))
 
                        Else
                            firstline = False
@@ -325,29 +331,29 @@ End Function
  Public Overrides Function ToString() As String
 
   Dim sb As New StringBuilder()
-  Dim a1,a2,a3,e1,e2,e3 As String
+  Dim a1, a2, a3, e1, e2, e3 As String
 
 
-  For Each alt As Alternator In Alternators
+  For Each alt As Alternator In Alternators.OrderBy( Function(o) o.AlternatorName)
     sb.AppendLine("")
-    sb.AppendFormat("** {0} ** , PulleyRatio {1}",alt.AlternatorName,alt.PulleyRatio)
+    sb.AppendFormat("** {0} ** , PulleyRatio {1}", alt.AlternatorName, alt.PulleyRatio)
     sb.AppendLine("")
-    sb.AppendLine  ("******************************************************************")
+    sb.AppendLine("******************************************************************")
     sb.AppendLine("")
 
-    Dim i As Integer=1
+    Dim i As Integer = 1
     sb.AppendLine("Table 1 (2000)" + vbTab + "Table 2 (4000)" + vbTab + "Table 3 (6000)")
-    sb.AppendLine("Amps" + vbTab + "Eff" + vbTab + "Amps" + vbTab + "Eff" + vbTab + "Amps" + vbTab + "Eff" + vbTab )
+    sb.AppendLine("Amps" + vbTab + "Eff" + vbTab + "Amps" + vbTab + "Eff" + vbTab + "Amps" + vbTab + "Eff" + vbTab)
     sb.AppendLine("")
-    For  i = 0 to 5 
+    For i = 0 To 5
 
-    a1= alt.InputTable2000(i).Amps.ToString("0.###")
-    e1 =alt.InputTable2000(i).Eff .ToString("0.###")
-    a2= alt.InputTable4000(i).Amps.ToString("0.###")
-    e2 =alt.InputTable4000(i).Eff .ToString("0.###")
-    a3= alt.InputTable6000(i).Amps.ToString("0.###")
-    e3 =alt.InputTable6000(i).Eff .ToString("0.###")
-    sb.AppendLine(a1 + vbTab + e1 + vbTab + a2 + vbTab + e2 + vbTab + a3 + vbTab + e3 + vbTab )
+    a1 = alt.InputTable2000(i).Amps.ToString("0.###")
+    e1 = alt.InputTable2000(i).Eff.ToString("0.###")
+    a2 = alt.InputTable4000(i).Amps.ToString("0.###")
+    e2 = alt.InputTable4000(i).Eff.ToString("0.###")
+    a3 = alt.InputTable6000(i).Amps.ToString("0.###")
+    e3 = alt.InputTable6000(i).Eff.ToString("0.###")
+    sb.AppendLine(a1 + vbTab + e1 + vbTab + a2 + vbTab + e2 + vbTab + a3 + vbTab + e3 + vbTab)
 
     Next
 
@@ -357,17 +363,17 @@ End Function
     sb.AppendLine("")
     sb.AppendLine("********* COMBINED EFFICIENCY VALUES **************")
     sb.AppendLine("")
-    sb.AppendLine( vbTab +"RPM VALUES")
-    sb.AppendLine("AMPS" + vbTab + "500" + vbTab + "1500" + vbtab + "2500" + vbtab + "3500" + vbtab + "4500" + vbtab + "5500" + vbtab + "6500" + vbTab  + "7500")
-    For a As Single = 1 to alternators.Count * 50
+    sb.AppendLine(vbTab + "RPM VALUES")
+    sb.AppendLine("AMPS" + vbTab + "500" + vbTab + "1500" + vbTab + "2500" + vbTab + "3500" + vbTab + "4500" + vbTab + "5500" + vbTab + "6500" + vbTab + "7500")
+    For a As Single = 1 To Alternators.Count * 50
 
        sb.Append(a.ToString("0") + vbTab)
-       For Each  r As Single in {500,1500,2500,3500,4500,5500,6500,7500}
-        
-          Dim eff as Single = GetEfficiency( r ,a).Efficiency
-          
-          sb.Append( eff.ToString("0.###") + vbTab)
-          
+       For Each r As Single In {500, 1500, 2500, 3500, 4500, 5500, 6500, 7500}
+
+          Dim eff As Single = GetEfficiency(r, a).Efficiency
+
+          sb.Append(eff.ToString("0.###") + vbTab)
+
        Next
        sb.AppendLine("")
 
@@ -380,6 +386,28 @@ End Function
 
  End Function
 
+ 
+
+  Public Function IsEqualTo(other As ICombinedAlternator) As Boolean Implements ICombinedAlternator.IsEqualTo
+  
+      'Count Check.
+      If Me.Alternators.Count <> other.Alternators.Count then Return False
+      
+      For Each alt As IAlternator In Me.Alternators
+
+       'Can we find the same alternatorName in other
+       If  other.Alternators.Where( Function(f) f.AlternatorName=alt.AlternatorName).Count()<>1 then Return False
+
+       'get the alternator to compare and compare it.
+       If  Not alt.IsEqualTo( other.Alternators.first( Function(f) f.AlternatorName=alt.AlternatorName) ) then Return false
+
+
+      Next
+
+      Return true
+
+  End Function
+
 
 
  End Class
diff --git a/VECTOAux/VectoAuxiliaries/Electrics/IAlternator.vb b/VECTOAux/VectoAuxiliaries/Electrics/IAlternator.vb
index 261b4d86b04e2a9bb95cb5d5c9ba411784c62657..ee083870654fcf084973b3eb7769813997921351 100644
--- a/VECTOAux/VectoAuxiliaries/Electrics/IAlternator.vb
+++ b/VECTOAux/VectoAuxiliaries/Electrics/IAlternator.vb
@@ -21,9 +21,11 @@ Namespace Electrics
 
 
          Sub  Clone( other As IAlternator)
-     
-     
-     End Interface
+
+         Function IsEqualTo(other As IAlternator) As Boolean 
+
+
+   end  interface
 
 
 End Namespace
diff --git a/VECTOAux/VectoAuxiliaries/Electrics/ICombinedAlternator.vb b/VECTOAux/VectoAuxiliaries/Electrics/ICombinedAlternator.vb
new file mode 100644
index 0000000000000000000000000000000000000000..04e16b11abc96094850aa58c41e8037b1e0d45d3
--- /dev/null
+++ b/VECTOAux/VectoAuxiliaries/Electrics/ICombinedAlternator.vb
@@ -0,0 +1,22 @@
+
+Namespace Electrics
+
+
+Public Interface ICombinedAlternator
+
+
+   Property Alternators As List(Of IAlternator)
+
+
+   Function IsEqualTo( other As ICombinedAlternator ) As Boolean
+
+
+
+End Interface
+
+
+
+
+End Namespace
+
+
diff --git a/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.Designer.vb b/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.Designer.vb
index 2fd1405a7b8287c04dafc991a67e4d9422dbca94..ee5dce21ab1f2e82718a6fcde0b3c61f0b155993 100644
--- a/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.Designer.vb
+++ b/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.Designer.vb
@@ -533,7 +533,7 @@ Partial Class frmCombinedAlternators
         Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
         Me.Name = "frmCombinedAlternators"
         Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
-        Me.Text = "frmCombinedAlternators"
+        Me.Text = "Combined Alternators - ( Excel V03 )"
         Me.grpTable2000PRM.ResumeLayout(false)
         Me.grpTable2000PRM.PerformLayout
         Me.grpTable4000PRM.ResumeLayout(false)
diff --git a/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.vb b/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.vb
index 5313d568d7748c04032ea17794fa4557ea46747d..0102b0305c72d0b0d41c67ad85295c55c7bc5fd3 100644
--- a/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.vb
+++ b/VECTOAux/VectoAuxiliaries/UI/frmCombinedAlternators.vb
@@ -406,6 +406,25 @@ End Sub
   
   
   End Sub
+  Private Sub btnCancel_Click( sender As Object,  e As EventArgs) Handles btnCancel.Click
+  
+     UserHitCancel=true
+     Me.close
+  
+  End Sub
+  Private Sub btnSave_Click( sender As Object,  e As EventArgs) Handles btnSave.Click
+
+    '  If Not ValidateAll then Return 
+
+        UserHitSave=true
+
+        Me.DialogResult=Windows.Forms.DialogResult.OK
+        Me.Close
+       
+
+
+  End Sub
+
 
   'Form / Tab Events
   Private Sub TabControl1_SelectedIndexChanged( sender As Object,  e As EventArgs) Handles TabControl1.SelectedIndexChanged
@@ -417,6 +436,68 @@ End Sub
   
   
     End If
+  End Sub
+  Private Sub frmCombinedAlternators_FormClosing( sender As Object,  e As FormClosingEventArgs) Handles MyBase.FormClosing
+
+
+       Dim result As DialogResult
+      
+       'If UserHitCancel then bail
+       If UserHitCancel then 
+          DialogResult= Windows.Forms.DialogResult.Cancel
+          UserHitCancel=false
+          return
+       End If
+      
+       'UserHitSave
+       If UserHitSave then 
+          DialogResult= Windows.Forms.DialogResult.Cancel
+          If NOT combinedAlt.Save(aaltPath )   then
+                MessageBox.Show("Unable to save file, aborting.")
+                e.Cancel=true
+           End If
+          UserHitSave=false
+          return
+       End If
+      
+      
+      ''This must be a close box event. If nothing changed, then bail, otherwise ask user if they wanna save
+      If  Not combinedAlt.IsEqualTo( originalAlt ) 
+      
+           result = (MessageBox.Show("Would you like to save changes before closing?","Save Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question))
+      
+      
+                Select Case  result
+                
+                    case DialogResult.Yes:
+                        'save 
+      
+                        If NOT combinedAlt.Save(aaltPath)   then
+                          e.Cancel=true
+                        End If
+      
+                    case DialogResult.No:
+                        'just allow the form to close
+                        'without saving
+                        Me.DialogResult=Windows.Forms.DialogResult.Cancel
+      
+      
+      
+                    case DialogResult.Cancel:
+                        'cancel the close
+                        e.Cancel = true
+                        Me.DialogResult=Windows.Forms.DialogResult.Cancel
+      
+      
+                end select
+      
+      End If
+      
+      UserHitCancel=false
+      UserHitSave=false
+
+
+
   End Sub
 
 
@@ -514,83 +595,7 @@ End Sub
 
 
 
-Private Sub btnSave_Click( sender As Object,  e As EventArgs) Handles btnSave.Click
-
-     ' If Not ValidateAll then Return 
-
-        UserHitSave=true
-
-        Me.DialogResult=Windows.Forms.DialogResult.OK
-        Me.Close
-       
-
 
-End Sub
-
-
-
-Private Sub frmCombinedAlternators_FormClosing( sender As Object,  e As FormClosingEventArgs) Handles MyBase.FormClosing
-
-
-     Dim result As DialogResult
-
-     'If UserHitCancel then bail
-     If UserHitCancel then 
-        DialogResult= Windows.Forms.DialogResult.Cancel
-        UserHitCancel=false
-        return
-     End If
-
-     'UserHitSave
-     If UserHitSave then 
-        DialogResult= Windows.Forms.DialogResult.Cancel
-        If NOT combinedAlt.Save(aaltPath )   then
-              MessageBox.Show("Unable to save file, aborting.")
-              e.Cancel=true
-         End If
-        UserHitSave=false
-        return
-     End If
-
-
-    ''This must be a close box event. If nothing changed, then bail, otherwise ask user if they wanna save
-    'If  Not ssmTOOL.IsEqualTo( originalssmTOOL ) 
-  
-    '     result = (MessageBox.Show("Would you like to save changes before closing?","Save Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question))
-
-
-    '          Select Case  result
-              
-    '              case DialogResult.Yes:
-    '                  'save 
-
-    '                  If NOT ssmTOOL.Save(ahsmFilePath)   then
-    '                    e.Cancel=true
-    '                  End If
-  
-    '              case DialogResult.No:
-    '                  'just allow the form to close
-    '                  'without saving
-    '                  Me.DialogResult=Windows.Forms.DialogResult.Cancel
-
-  
-  
-    '              case DialogResult.Cancel:
-    '                  'cancel the close
-    '                  e.Cancel = true
-    '                  Me.DialogResult=Windows.Forms.DialogResult.Cancel
-
-  
-    '          end select
-  
-    'End If
-  
-    UserHitCancel=false
-    UserHitSave=false
-
-
-
-End Sub
 
 
 
diff --git a/VECTOAux/VectoAuxiliaries/VectoAuxiliaries.vbproj b/VECTOAux/VectoAuxiliaries/VectoAuxiliaries.vbproj
index 9ae6c54f890d4571b183cc5fe6e6abfc06557fb7..307f1880c663e8c1d388adc01feae70061fb6d6f 100644
--- a/VECTOAux/VectoAuxiliaries/VectoAuxiliaries.vbproj
+++ b/VECTOAux/VectoAuxiliaries/VectoAuxiliaries.vbproj
@@ -118,6 +118,7 @@
     <Compile Include="Electrics\CombinedAlternatorSignals.vb" />
     <Compile Include="Electrics\ElectricsUserInputsConfig.vb" />
     <Compile Include="Electrics\IAlternator.vb" />
+    <Compile Include="Electrics\ICombinedAlternator.vb" />
     <Compile Include="Electrics\ICombinedAlternatorMapRow.vb" />
     <Compile Include="Electrics\ICombinedAlternatorSignals.vb" />
     <Compile Include="Electrics\IElectricsUserInputsConfig.vb" />
diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/BusDatabaseTests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/BusDatabaseTests.vb
index fdd455429c6252d295fde3ab5c231a7cdb939071..571ec0c81c7fe6153925913a89e11a61aedc75cd 100644
--- a/VECTOAux/VectoAuxiliariesTests/UnitTests/BusDatabaseTests.vb
+++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/BusDatabaseTests.vb
@@ -32,8 +32,8 @@ Public Sub BusCreateTest()
   Assert.AreEqual("raised floor", target.FloorType)
   Assert.AreEqual("diesel", target.EngineType)
 
-  Assert.AreEqual(114.4f, target.AreaInMetresSquared)
-  Assert.AreEqual(61.8f, target.VolumneInMetresQubed)
+  Assert.AreEqual(114.4r, target.AreaInMetresSquared)
+  Assert.AreEqual(61.8r, target.VolumneInMetresQubed)
 
 End Sub
 
diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/CombinedAlternatorTests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/CombinedAlternatorTests.vb
index c90089655a29d74b34e94438c3d4e486db2048e5..e7d518362c33ea1011abb38e4723b3ccf82c13c2 100644
--- a/VECTOAux/VectoAuxiliariesTests/UnitTests/CombinedAlternatorTests.vb
+++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/CombinedAlternatorTests.vb
@@ -1,4 +1,6 @@
-Imports NUnit.Framework
+Option Strict On
+
+Imports NUnit.Framework
 Imports VectoAuxiliaries.Electrics
 Imports VectoAuxiliariesTests.Mocks
 Imports VectoAuxiliaries
@@ -434,6 +436,57 @@ Namespace UnitTests
   End Sub
 
 
+ <Test()>
+  Public Sub AlternatorsAreEqual()
+
+
+   Dim ca As ICombinedAlternator=  new CombinedAlternator("abc.aalt")
+   Dim original as  ICombinedAlternator = new CombinedAlternator("abc.aalt")
+ 
+   Assert.IsTrue( ca.IsEqualTo( original))
+
+  End Sub
+
+ <Test()>
+  Public Sub AlternatorsUnequalName()
+
+
+   Dim ca As new CombinedAlternator("abc.aalt")
+   Dim original As new CombinedAlternator("abc.aalt")
+
+   ca.Alternators(0).AlternatorName="ZCZZCZCZCZCXXXYYY"
+ 
+   Assert.IsFalse(ca.IsEqualTo( original))
+
+  End Sub
+
+ <Test()>
+  Public Sub AlternatorsUnequalPulley()
+
+
+   Dim ca As new CombinedAlternator("abc.aalt")
+   Dim original As new CombinedAlternator("abc.aalt")
+
+   ca.Alternators(0).PulleyRatio=9
+ 
+   Assert.IsFalse(ca.IsEqualTo( original))
+
+  End Sub
+
+ <Test()>
+  Public Sub AlternatorsUnequalEfficiency()
+
+
+   Dim ca As new CombinedAlternator("abc.aalt")
+   Dim original As new CombinedAlternator("abc.aalt")
+
+   ca.Alternators(0).InputTable2000(1).Eff=0.99999
+ 
+   'Only tests efficiency values table row 1-3
+   Assert.IsFalse(ca.IsEqualTo( original))
+
+  End Sub
+
 
  End Class
 
diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/HVACSSMMapTests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/HVACSSMMapTests.vb
index 5815cf0c1726879d8db7f63b77b415e38936f03a..d09e6f2f93b6df506ebb603eb0b39cd1a375c6e8 100644
--- a/VECTOAux/VectoAuxiliariesTests/UnitTests/HVACSSMMapTests.vb
+++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/HVACSSMMapTests.vb
@@ -51,18 +51,19 @@ Namespace UnitTests
 
         End Sub
 
-        <Test()>
-        Public Sub BadValuesTest()
-            Dim message As String = String.Empty
-            Dim expected As boolean = false
-            Dim actual As Boolean
-            Dim target = GetMap
+        'Redundant, this format is superceeded.
+        '<Test()>
+        'Public Sub BadValuesTest()
+        '    Dim message As String = String.Empty
+        '    Dim expected As boolean = false
+        '    Dim actual As Boolean
+        '    Dim target = GetMap
 
-            actual = target.SetValuesFromMap( badValues, message)
-            Assert.AreEqual(expected, actual)
+        '    actual = target.SetValuesFromMap( badValues, message)
+        '    Assert.AreEqual(expected, actual)
 
 
-        End Sub
+        'End Sub
 
 
         <Test()>