diff --git a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini
index acf4f58d1a3966001120a43e7f6e8e5678f86e69..437ef831b9a672ce347e79e7f6b822fc972a5d53 100644
--- a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini
+++ b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.ini
@@ -182,6 +182,7 @@ datatype: BOOLEAN
 def_value: False
 set_cmd: :SENS:AVER
 group: Acquisition
+model_value_1: E5071C
 
 [# of averages]
 datatype: DOUBLE
@@ -190,6 +191,7 @@ low_lim: 1
 high_lim: 65536
 set_cmd: :SENS:AVER:COUN
 group: Acquisition
+model_value_1: E5071C
 
 [Wait for new trace]
 datatype: BOOLEAN
diff --git a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py
index 1d19371a62ee4a47997ac1f387e2b2347b937314..4c7711705fe53441c31c9494abc078d7434e47a8 100644
--- a/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py
+++ b/Agilent_NetworkAnalyzer/Agilent_NetworkAnalyzer.py
@@ -56,17 +56,12 @@ class Driver(VISA_Driver):
                 # create new measurement, if enabled is true
                 if value:
                     newName = 'LabC_%s' % param
-                    self.writeAndLog("CALC:PAR:EXT '%s','%s'" % (newName, param))
+                    if self.getModel() in ('E8364B'):
+                        self.writeAndLog("CALC:PAR:DEF '%s',%s" % (newName, param))
+                    else:
+                        self.writeAndLog("CALC:PAR:EXT '%s','%s'" % (newName, param))
                     # show on PNA screen
                     iTrace = 1 + ['S11', 'S21', 'S12', 'S22'].index(param)
-    #                sPrev = self.askAndLog('DISP:WIND:CAT?')
-    #                if sPrev.find('EMPTY')>0:
-    #                    # no previous traces
-    #                    iTrace = 1
-    #                else:
-    #                    # previous traces, add new
-    #                    lTrace = sPrev[1:-1].split(',')
-    #                    iTrace = int(lTrace[-1]) + 1
                     self.writeAndLog("DISP:WIND:TRAC%d:FEED '%s'" % (iTrace, newName))
                     # add to dict with list of measurements
                     self.dMeasParam[param] = [newName]
@@ -88,6 +83,7 @@ class Driver(VISA_Driver):
             self.getActiveMeasurements()
             # get selected parameter
             param = quant.name[:3]
+            self.log(self.dMeasParam)
             value = (param in self.dMeasParam)
         elif quant.name in ('S11', 'S21', 'S12', 'S22'):
             # check if channel is on
@@ -109,10 +105,14 @@ class Driver(VISA_Driver):
                 * (self.getValue('# of averages') if bAverage else 1))
                 # wait for trace, either in averaging or normal mode
                 if bWaitTrace:
-                    self.writeAndLog(':ABOR;:TRIG:SOUR BUS;:INIT:CONT OFF;:INIT:IMM;')
-                    if bAverage:
-                        self.writeAndLog(':TRIG:AVER ON')
-                    self.writeAndLog(':TRIG:SING;')
+                    if self.getModel() not in ('E8364B'):
+                        self.writeAndLog(":ABOR;:TRIG:SOUR BUS;:INIT:CONT OFF;:INIT:IMM;")
+                        if bAverage:
+                            self.writeAndLog(':TRIG:AVER ON')
+                        self.writeAndLog(':TRIG:SING;')
+
+                    else:
+                        self.writeAndLog(":ABOR;:INIT:CONT OFF;:INIT:IMM;")
                     self.writeAndLog('*OPC')
                     # wait some time before first check
                     self.wait(0.03)
@@ -140,7 +140,11 @@ class Driver(VISA_Driver):
                     self.write(':FORM REAL,32;CALC:DATA? SDATA', bCheckError=False)
                 sData = self.read(ignore_termination=True)
                 if bWaitTrace:
-                    self.writeAndLog(':TRIG:SOUR INT;:TRIG:AVER OFF;:ABOR;')
+                    if self.getModel() in ('E8364B'):
+                        self.writeAndLog(':TRIG:SOUR MAN;:ABOR;')
+
+                    else:
+                        self.writeAndLog(':TRIG:SOUR INT;:TRIG:AVER OFF;:ABOR;')
 
                 # strip header to find # of points
                 i0 = sData.find(b'#')
@@ -187,7 +191,10 @@ class Driver(VISA_Driver):
                 sParam = self.askAndLog(":CALC:PAR%d:DEF?" % (n+1))
                 self.dMeasParam[sParam] = (n+1)
         else:
-            sAll = self.askAndLog("CALC:PAR:CAT:EXT?")
+            if self.getModel() in ('E8364B'):
+                sAll = self.askAndLog("CALC:PAR:CAT?")
+            else:
+                sAll = self.askAndLog("CALC:PAR:CAT:EXT?")
             # strip "-characters
             sAll = sAll[1:-1]
             # parse list, format is channel, parameter, ...
diff --git a/Triton/Triton.ini b/Triton/Triton.ini
index 1293fd9da694d220e0f7040e686ebfb2a44f8d24..4905850ffb32bdd02d71265ed7d39bc20092b3c3 100755
--- a/Triton/Triton.ini
+++ b/Triton/Triton.ini
@@ -6,7 +6,7 @@
 name: Triton 200 dilution fridge
 
 # The version string should be updated whenever changes are made to this config file
-version: 1.2.1
+version: 1.3.0
 
 # Name of folder containing the code defining a custom driver. Do not define this item
 # or leave it blank for any standard driver based on the built-in VISA interface.
@@ -210,6 +210,243 @@ get_cmd: READ:DEV:T13:TEMP:SIG:TEMP
 section: Temperature
 high_lim: 300
 
+[T14]
+datatype: DOUBLE
+group: Temperatures
+permission: READ
+unit: K
+get_cmd: READ:DEV:T14:TEMP:SIG:TEMP
+section: Temperature
+high_lim: 300
+
+[T15]
+datatype: DOUBLE
+group: Temperatures
+permission: READ
+unit: K
+get_cmd: READ:DEV:T15:TEMP:SIG:TEMP
+section: Temperature
+high_lim: 300
+
+[T16]
+datatype: DOUBLE
+group: Temperatures
+permission: READ
+unit: K
+get_cmd: READ:DEV:T16:TEMP:SIG:TEMP
+section: Temperature
+high_lim: 300
+
+[P1]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P1:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P2]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P2:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P3]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P3:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P4]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P4:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[P5]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P5:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[OVC]
+datatype: DOUBLE
+group: Pressures
+permission: READ
+unit: bar
+get_cmd: READ:DEV:P6:PRES:SIG:PRES
+section: Pressures
+high_lim: 5
+
+[TurboState]
+group: Turbopump
+label: Turbopump state
+datatype: STRING
+def_value: NONE
+permission: READ
+section: Turbopump
+get_cmd: READ:DEV:TURB1:PUMP:SIG:STATE
+
+[TurboStatus]
+group: Turbopump
+tooltip: The status is usually an error code
+label: Turbopump status
+datatype: DOUBLE
+def_value: 0
+permission: READ
+section: Turbopump
+get_cmd: READ:DEV:TURB1:PUMP:STATUS
+
+[TurboHours]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: h
+get_cmd: READ:DEV:TURB1:PUMP:SIG:HRS
+section: Turbopump
+high_lim: 35040
+
+[TurboPower]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: W
+get_cmd: READ:DEV:TURB1:PUMP:SIG:POWR
+section: Turbopump
+
+[TurboSpeed]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: Hz 
+get_cmd: READ:DEV:TURB1:PUMP:SIG:SPD
+section: Turbopump
+
+[PowerStageTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:PST
+section: Turbopump
+
+[MotorTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:MT
+section: Turbopump
+
+[BearingTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:BT
+section: Turbopump
+
+[PumpBottomTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:PBT
+section: Turbopump
+
+[ElectronicTemp]
+datatype: DOUBLE
+group: Turbopump
+permission: READ
+unit: C
+get_cmd: READ:DEV:TURB1:PUMP:SIG:ET
+section: Turbopump
+
+[WaterInTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:WIT
+section: Compressor
+high_lim: 30
+
+[WaterOutTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:WOT
+section: Compressor
+high_lim: 30
+
+[OilTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:OILT
+section: Compressor
+high_lim: 30
+
+[HeliumTemp]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: C
+get_cmd: READ:DEV:C1:PTC:SIG:HT
+section: Compressor
+high_lim: 30
+
+[LowPressure]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: bar
+get_cmd: READ:DEV:C1:PTC:SIG:HLP
+section: Compressor
+high_lim: 20
+
+[HighPressure]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: bar
+get_cmd: READ:DEV:C1:PTC:SIG:HHP
+section: Compressor
+high_lim: 20
+
+[MotorCurrent]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: A
+get_cmd: READ:DEV:C1:PTC:SIG:MCUR
+section: Compressor
+high_lim: 4
+
+[Hours]
+datatype: DOUBLE
+group: Compressor
+permission: READ
+unit: h
+get_cmd: READ:DEV:C1:PTC:SIG:HRS
+section: Compressor
+high_lim: 20000
+
 [ControlLoop]
 datatype: BOOLEAN
 label: Temperature control loop
@@ -254,6 +491,16 @@ get_cmd: READ:DEV:T<c>:TEMP:LOOP:RANGE
 set_cmd: SET:DEV:T<c>:TEMP:LOOP:RANGE:<*>
 section: Temperature
 
+[HeaterPower]
+datatype: DOUBLE
+label: Heater Setpoint
+group: Heater
+unit: uW
+get_cmd: READ:DEV:H<c>:HTR:SIG:POWR
+set_cmd: SET:DEV:H<c>:HTR:SIG:POWR:<*>
+section: Temperature
+high_lim: 20000
+
 [CoordSys]
 label: Coordinate System
 datatype: COMBO
@@ -398,3 +645,12 @@ option_value_1: switch heater
 section: Switch heater
 get_cmd: READ:SYS:VRM:POC
 set_cmd: SET:SYS:VRM:POC:<*>
+
+[STATE]
+label: Triton Automation Routine
+tooltip: Currently running name of the automation routine.
+datatype: STRING
+def_value: NONE
+permission: READ
+section: System
+get_cmd: READ:SYS:DR:ACTN
\ No newline at end of file
diff --git a/Triton/Triton.py b/Triton/Triton.py
index f56d80e85953f637d5934415827918222e40e513..904e87bb4581adec0e69d57cc89f8e73a177ed20 100755
--- a/Triton/Triton.py
+++ b/Triton/Triton.py
@@ -6,9 +6,9 @@ import visa
 from InstrumentConfig import InstrumentQuantity
 import numpy as np
 import string
-from builtins import str
+import re
 
-__version__ = "0.0.1"
+__version__ = "0.0.3" #user expansion Triton1	19.02.2018
 
 class Error(Exception):
     pass
@@ -23,25 +23,32 @@ class Driver(VISA_Driver):
         
         #Detect options: (vector) magnet and swicth heater
         detectedOptions = []
-        table = str.maketrans(dict.fromkeys(string.ascii_letters+'/'))
-        rate = self.askAndLog('READ:SYS:VRM:RFMX').strip().rsplit(':',1)[1][1:-1].translate(table).split()
-        if float(rate[0]) > 0:
-            detectedOptions.append("x magnet")
-        if float(rate[1]) > 0:
-            detectedOptions.append("y magnet")
-        if float(rate[2]) > 0:
-            detectedOptions.append("z magnet")
         
-        heater = self.askAndLog('READ:SYS:VRM:SWHT').strip().rsplit(':',1)[1][1:-1].split()
-        if heater[0] != "NOSW" or heater[1] != "NOSW" or heater[2] != "NOSW":
-            detectedOptions.append("switch heater")
-            
+        #rate = self.askAndLog('READ:SYS:VRM:RFMX').strip().rsplit(':',1)[1][1:-1].encode('utf-8').translate(None, string.ascii_letters + "/").split()
+        try:
+            rate = self.askAndLog('READ:SYS:VRM:RFMX').strip().rsplit(':',1)[1][1:-1].translate({ord(c): None for c in (string.ascii_letters + "/")}).split()
+            if float(rate[0]) > 0:
+                detectedOptions.append("x magnet")
+            if float(rate[1]) > 0:
+                detectedOptions.append("y magnet")
+            if float(rate[2]) > 0:
+                detectedOptions.append("z magnet")
+        except IndexError:
+            pass
+        try:
+            heater = self.askAndLog('READ:SYS:VRM:SWHT').strip().rsplit(':',1)[1][1:-1].split()
+            if heater[0] != "NOSW" or heater[1] != "NOSW" or heater[2] != "NOSW":
+                detectedOptions.append("switch heater")
+        except IndexError:
+            pass
+        
         self.instrCfg.setInstalledOptions(detectedOptions)
         
         # Make sure that the coordinate system matches the device
-        coordFunc = self.instrCfg.getQuantity('CoordSys')
-        v = self.performGetValue(coordFunc)
-        coordFunc.setValue(v)
+        if detectedOptions:
+            coordFunc = self.instrCfg.getQuantity('CoordSys')
+            v = self.performGetValue(coordFunc)
+            coordFunc.setValue(v)
 
 
     def performGetValue(self, quant, options={}):
@@ -50,11 +57,30 @@ class Driver(VISA_Driver):
         if self.isFirstCall(options):
             self.Bresult = []
         # check type of quantity
-        if quant.name in ('T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12', 'T13'):
+        if quant.name in ('T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12', 'T13', 'T14', 'T15', 'T16', 'WaterInTemp', 'WaterOutTemp', 'OilTemp', 'HeliumTemp', 'PowerStageTemp', 'MotorTemp', 'BearingTemp', 'PumpBottomTemp', 'ElectronicTemp'):
+            # temperatures, get value strings
+            sAns = self.askAndLog(quant.get_cmd).strip()
+            # convert string to float by taking everything after last colon, ignoring final 'K'
+            sAnsC = re.compile('(\d+.\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+            if not sAnsC:
+                sAnsC = re.compile('(\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+            if sAns:
+                value = float(sAnsC.groups()[0])
+            else:
+                value = -np.inf
+        elif quant.name in ('P1', 'P2', 'P3', 'P4', 'P5', 'OVC', 'LowPressure', 'HighPressure', 'MotorCurrent', 'Hours', 'TurboHours', 'TurboPower', 'TurboSpeed'):
             # temperatures, get value strings
             sAns = self.askAndLog(quant.get_cmd).strip()
             # convert string to float by taking everything after last colon, ignoring final 'K'
-            value = float(sAns.rsplit(':',1)[1][:-1])
+            sAnsC = re.compile('(\d+.\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+            if not sAnsC:
+                sAnsC = re.compile('(\d+)\s*(\w+)').match(sAns.rsplit(':',1)[1])
+            if sAns:
+                value = float(sAnsC.groups()[0])
+                if "m" in sAnsC.groups()[1]:
+                    value *= 1e-3
+            else:
+                value = -np.inf
         elif quant.name in ('ControlLoop'):
             for i in range(1,14):
                 pass
@@ -77,6 +103,13 @@ class Driver(VISA_Driver):
                 if sAns != "NOT_FOUND":
                     value = quant.getValueFromCmdString(sAns[:-2])
                     break
+        elif quant.name in ('HeaterPower'): 
+            for i in range(1,3):
+                sAns = self.askAndLog(quant.get_cmd.replace('<c>', str(i))).strip()
+                sAns = sAns.rsplit(':',1)[1]
+                if sAns != "NOT_FOUND":
+                    value = quant.getValueFromCmdString(sAns[:-2])
+                    break
         elif quant.name in ('PoC'):
             sAns = self.askAndLog(quant.get_cmd).strip()
             value = (sAns.rsplit(':',1)[1] == "ON")
@@ -87,10 +120,13 @@ class Driver(VISA_Driver):
             coordFunc = self.instrCfg.getQuantity('CoordSys')
             if not self.Bresult:
                 vectValue = self.askAndLog(quant.get_cmd).strip()
-                table = str.maketrans(dict.fromkeys(string.ascii_letters))
-                self.Bresult = vectValue.rsplit(':',1)[1][1:-1].translate(table).split()
+                #self.Bresult = vectValue.rsplit(':',1)[1][1:-1].encode('utf-8').translate(None,string.ascii_letters).split()
+                self.Bresult = vectValue.rsplit(':',1)[1][1:-1].translate({ord(c): None for c in (string.ascii_letters)}).split()
             #Vector results depend on the coordinate system
             value = float('nan')
+            self.log(vectValue)
+            if not len(self.Bresult) == 3:
+                self.Bresult = ["NaN", "NaN", "NaN"]
             if coordFunc.getValue() == 'Cartesian':
                 if quant.name == 'Bx':
                     return float(self.Bresult[0])
@@ -112,6 +148,9 @@ class Driver(VISA_Driver):
                     return float(self.Bresult[1])
                 elif quant.name == 'Bphi':
                     return float(self.Bresult[2])
+        elif quant.name in ('STATE'):
+            sAns = self.askAndLog(quant.get_cmd).strip()
+            value = sAns.rsplit(':',1)[1]
         else:
             # for all other cases, call VISA driver
             cmd = quant.get_cmd
@@ -158,6 +197,13 @@ class Driver(VISA_Driver):
                 if sAns != "NOT_FOUND":
                     self.askAndLog(quant.set_cmd.replace('<c>', str(i)).replace('<*>', quant.getCmdStringFromValue(value)))
                     break
+        elif quant.name in ('HeaterPower'):
+            for i in range(1,3):
+                sAns = self.askAndLog(quant.get_cmd.replace('<c>', str(i))).strip()
+                sAns = sAns.rsplit(':',1)[1]
+                if sAns != "NOT_FOUND":
+                    self.askAndLog(quant.set_cmd.replace('<c>', str(i)).replace('<*>', quant.getCmdStringFromValue(value)))
+                    break
         elif quant.name in ('PoC'):
             vstring = "OFF"
             if value:
@@ -193,12 +239,12 @@ class Driver(VISA_Driver):
         coordFunc = self.instrCfg.getQuantity('CoordSys')
         if self.Bchanged == False:
             self.askAndLog('SET:SYS:VRM:ACTN:HOLD')
-            self.waitForIdle()
+            waitForIdle()
             self.performSetValue(coordFunc, coordFunc.getValue())
             self.performGetValue(coordFunc)
         vectValue = self.askAndLog("READ:SYS:VRM:VSET").strip()
-        table = str.maketrans(dict.fromkeys(string.ascii_letters))
-        a,b,c = vectValue.rsplit(':',1)[1][1:-1].translate(table).split()
+        #a,b,c = vectValue.rsplit(':',1)[1][1:-1].encode('utf-8').translate(None,string.ascii_letters).split()
+        a,b,c = vectValue.rsplit(':',1)[1][1:-1].translate({ord(c): None for c in (string.ascii_letters)}).split()
         if coordFunc.getValue() == 'Cartesian':
             if axis == 'Bx':
                 a = value