diff --git a/LCU/checkhardware/config/LV614-check_hardware.conf b/LCU/checkhardware/config/LV614-check_hardware.conf
new file mode 100755
index 0000000000000000000000000000000000000000..33da7c8f3bcc691382e2913d7f86efee3a73113e
--- /dev/null
+++ b/LCU/checkhardware/config/LV614-check_hardware.conf
@@ -0,0 +1,252 @@
+#
+# configuration file for check_hardware.py
+#
+
+[configuration]
+version= 00.01
+station= LV614C
+
+# checks to do if '-l=x' argument is given, all checks behind list.x are executed
+# always checks will be done always
+#
+# S(rcumode)       : signal check for rcumode (also down and flat-check in rcumode 1..4).
+# O(rcumode)       : oscillation check for rcumode.
+# SP(rcumode)      : spurious check for rcumode.
+# N(rcumode)[= 300]: noise check for rcumode, optional data time in seconds
+#                     default data time= 120 sec.
+# E(rcumode)[= 60] : do all RCU5 element tests, optional data time in seconds.
+#                     default data time= 10 sec.
+# M(rcumode)       : do modem
+# SN(rcumode)      : do summator noise
+#
+# RCU(mode)        : do all rcu checks for given mode, no element tests done.
+#
+# RBC              : RSP voltage/temperature check
+# TBC              : TBB voltage/temperature check
+# SPU              : SPU voltage
+# TM               : TBB memmory
+
+[check]
+always= RV, TV, RBC, TBC
+list.0=
+list.1= SPU,TM,RCU3,RCU5
+list.2= SPU,TM,RCU3,M5,SN5,O5,N5,SP5,S7,E7
+list.3= S3
+
+[spu]
+temperature.min= 10.0
+temperature.max= 35.0
+voltage.3_3.min= 3.1
+voltage.3_3.max= 3.4
+voltage.3_3.max-drop= 0.3
+voltage.5_0.min= 4.5
+voltage.5_0.max= 5.0
+voltage.5_0.max-drop= 0.3
+voltage.8_0.min= 7.4
+voltage.8_0.max= 8.0
+voltage.8_0.max-drop= 0.3
+voltage.48_0.min= 43.0
+voltage.48_0.max= 48.0
+voltage.48_0.max-drop= 2.0
+
+[tbb]
+version.tp= 2.4
+version.mp= 3.0
+temperature.min= 10.0
+temperature.max= 45.0
+temperature.tp.min= 10.0
+temperature.tp.max= 75.0
+temperature.tp.max_delta= 10.0
+temperature.mp.min= 10.0
+temperature.mp.max= 75.0
+temperature.mp.max_delta= 10.0
+voltage.1_2.min= 1.1
+voltage.1_2.max= 1.3
+voltage.2_5.min= 2.4
+voltage.2_5.max= 2.6
+voltage.3_3.min= 3.1
+voltage.3_3.max= 3.4
+
+[rsp]
+version.ap= 8.2
+version.bp= 8.2
+temperature.min= 10.0
+temperature.max= 50.0
+temperature.ap.min= 10.0
+temperature.ap.max= 80.0
+temperature.ap.max_delta= 10.0
+temperature.bp.min= 10.0
+temperature.bp.max= 80.0
+temperature.bp.max_delta= 10.0
+voltage.1_2.min= 1.1
+voltage.1_2.max= 1.3
+voltage.2_5.min= 2.4
+voltage.2_5.max= 2.6
+voltage.3_3.min= 3.1
+voltage.3_3.max= 3.4
+
+[rcumode.1-3]
+short.mean-pwr.min= 55.0
+short.mean-pwr.max= 61.0
+flat.mean-pwr.min= 61.0
+flat.mean-pwr.max= 64.5
+rf.subbands= 301
+rf.min-sb-pwr= 75.0
+rf.negative-deviation= -3.0
+rf.positive-deviation= 3.0
+noise.negative-deviation= -2.5
+noise.positive-deviation= 2.5
+noise.max-difference= 1.5
+noise.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.min-peak-pwr= 0.8
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+down.passband= 231:371
+
+[rcumode.2-4]
+short.mean-pwr.min= 55.0
+short.mean-pwr.max= 61.0
+flat.mean-pwr.min= 61.0
+flat.mean-pwr.max= 64.5
+rf.subbands= 301
+rf.min-sb-pwr= 75.0
+rf.negative-deviation= -3.0
+rf.positive-deviation= 3.0
+noise.negative-deviation= -2.5
+noise.positive-deviation= 2.5
+noise.max-difference= 1.5
+noise.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.min-peak-pwr= 0.8
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+down.passband= 231:371
+
+[rcumode.5.tile]
+short.mean-pwr.min= 55.0
+short.mean-pwr.max= 61.0
+flat.mean-pwr.min= 61.0
+flat.mean-pwr.max= 64.5
+rf.subbands= 113
+rf.min-sb-pwr= 80.0
+rf.negative-deviation= -24.0
+rf.positive-deviation= 12.0
+noise.negative-deviation= -3.0
+noise.positive-deviation= 1.5
+noise.max-difference= 1.5
+noise.passband= 1:511
+summator-noise.min-peak-pwr= 1.2
+summator-noise.passband= 45:135,200:270
+cable-reflection.min-peak-pwr= 0.8
+cable-reflection.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+
+[rcumode.5.element]
+rf.subbands= 113
+rf.min-sb-pwr= 70.0
+rf.negative-deviation= -24.0
+rf.positive-deviation= 12.0
+noise.negative-deviation= -3.0
+noise.positive-deviation= 1.5
+noise.max-difference= 1.5
+noise.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+
+[rcumode.6.tile]
+short.mean-pwr.min= 55.0
+short.mean-pwr.max= 61.0
+flat.mean-pwr.min= 61.0
+flat.mean-pwr.max= 64.5
+rf.subbands= 113
+rf.min-sb-pwr= 80.0
+rf.negative-deviation= -24.0
+rf.positive-deviation= 12.0
+noise.negative-deviation= -3.0
+noise.positive-deviation= 1.5
+noise.max-difference= 1.5
+noise.passband= 1:511
+summator-noise.min-peak-pwr= 1.2
+summator-noise.passband= 45:135
+cable-reflection.min-peak-pwr= 0.8
+cable-reflection.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+
+[rcumode.6.element]
+rf.subbands= 113
+rf.min-sb-pwr= 70.0
+rf.negative-deviation= -24.0
+rf.positive-deviation= 12.0
+noise.negative-deviation= -3.0
+noise.positive-deviation= 1.5
+noise.max-difference= 1.5
+noise.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+
+[rcumode.7.tile]
+short.mean-pwr.min= 55.0
+short.mean-pwr.max= 61.0
+flat.mean-pwr.min= 61.0
+flat.mean-pwr.max= 64.5
+rf.subbands= 113
+rf.min-sb-pwr= 80.0
+rf.negative-deviation= -24.0
+rf.positive-deviation= 12.0
+noise.negative-deviation= -3.0
+noise.positive-deviation= 1.5
+noise.max-difference= 1.5
+noise.passband= 1:511
+summator-noise.min-peak-pwr= 1.2
+summator-noise.passband= 45:135
+cable-reflection.min-peak-pwr= 0.8
+cable-reflection.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+
+[rcumode.7.element]
+rf.subbands= 113
+rf.min-sb-pwr= 70.0
+rf.negative-deviation= -24.0
+rf.positive-deviation= 12.0
+noise.negative-deviation= -3.0
+noise.positive-deviation= 3.0
+noise.max-difference= 1.5
+noise.passband= 1:511
+oscillation.min-peak-pwr= 6.0
+oscillation.passband= 1:511
+cable-reflection.passband= 1:511
+spurious.min-peak-pwr= 3.0
+spurious.passband= 1:511
+
+# General settings
+[paths]
+global-data= /globalhome/log/stationtest
+local-data= /opt/stationtest/data
+local-report-dir= /localhome/stationtest/data
+global-report-dir= /globalhome/log/stationtest
+
+[files]
+bad-antenna-list= /localhome/stationtest/data/bad_antenna_list.txt
diff --git a/LTA/ltastorageoverview/lib/scraper.py b/LTA/ltastorageoverview/lib/scraper.py
index 493cf943ceb3a1130b26bae2ff582ddcf6889ea2..98840e486d20b99ac258b668e119d391336d8bb9 100755
--- a/LTA/ltastorageoverview/lib/scraper.py
+++ b/LTA/ltastorageoverview/lib/scraper.py
@@ -17,7 +17,7 @@
 # You should have received a copy of the GNU General Public License along
 # with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
 
-# $Id$
+# $Id: scraper.py 43211 2019-06-18 18:55:40Z klazema $
 
 # TODO: add comments to methods
 # TODO: code cleanup
@@ -41,7 +41,7 @@ from random import random, randint
 logger = logging.getLogger()
 
 VISIT_INTERVAL = datetime.timedelta(days=7)
-LEXAR_HOST = 'ingest@lexar004.offline.lofar'
+LEXAR_HOST = 'ingest@lexar004.control.lofar'
 
 class FileInfo:
     '''Simple struct to hold filename and size'''
@@ -135,8 +135,8 @@ class Location:
 
         # the core command: do an srmls call and parse the results
         # srmls can only yield max 900 items in a result, hence we can recurse for the next 900 by using the offset
-        cmd = ['ssh', '-tt', '-n', '-x', '-q', LEXAR_HOST, "bash", "-c",
-               "\'srmls -l -count=900 -offset=%d %s%s\'" % (
+        cmd = ['ssh', '-tt', '-n', '-x', '-q', LEXAR_HOST,
+               "srmls -l -count=900 -offset=%d %s%s" % (
                 offset,
                 self.srmurl,
                 self.directory) ]
diff --git a/LTA/ltastorageoverview/lib/webservice/webservice.py b/LTA/ltastorageoverview/lib/webservice/webservice.py
index 44beadb45ee36bcde602c951a2797a2e91f90fad..9188c2fb48cc3014a0b6fe9392107b412fa9b7e7 100755
--- a/LTA/ltastorageoverview/lib/webservice/webservice.py
+++ b/LTA/ltastorageoverview/lib/webservice/webservice.py
@@ -17,7 +17,7 @@
 # You should have received a copy of the GNU General Public License along
 # with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
 
-# $Id$
+# $Id: webservice.py 42507 2019-04-09 19:08:50Z schaap $
 
 # TODO: add comment to methods
 # TODO: code cleanup
@@ -78,12 +78,14 @@ def index():
         storagesitedata ='[]'
 
     min_date, max_date = db.datetimeRangeOfFilesInTree()
+    logger.info("datetimeRangeOfFilesInTree: min_date=%s, max_date=%s", min_date, max_date)
     if min_date is None:
         min_date = datetime(2012, 1, 1)
     if max_date is None:
         max_date = datetime.utcnow()
     min_date = max(datetime(2012, 1, 1), min_date)
-    month_ranges = monthRanges(min_date, max_date, 3)
+    logger.info("month_ranges: min_date=%s, max_date=%s", min_date, max_date)
+    month_ranges = monthRanges(min_date, max_date, 1)
 
     # convert end-of-month timestamps to milliseconds since epoch
     epoch = datetime.utcfromtimestamp(0)
@@ -223,18 +225,20 @@ def main():
 
     # Check the invocation arguments
     parser = OptionParser("%prog [options]", description='runs the lta scraper and stores results in the speficied database.')
+    parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging')
     parser.add_option_group(dbcredentials.options_group(parser))
     parser.set_defaults(dbcredentials="LTASO")
     (options, args) = parser.parse_args()
 
-    logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
+    logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
+                        level=logging.DEBUG if options.verbose else logging.INFO)
 
     dbcreds = dbcredentials.parse_options(options)
 
     logger.info("Using dbcreds: %s" % dbcreds.stringWithHiddenPassword())
 
     global db
-    db = store.LTAStorageDb(dbcreds)
+    db = store.LTAStorageDb(dbcreds, options.verbose)
 
     app.run(debug=False,host='0.0.0.0',port=9632)
 
diff --git a/MAC/Deployment/data/OTDB/createPICfile b/MAC/Deployment/data/OTDB/createPICfile
index 0fae86339e06f7ad78bba717a015854b9f728406..c1e4a4d31b68e74415223939a59884b921ee59f5 100755
--- a/MAC/Deployment/data/OTDB/createPICfile
+++ b/MAC/Deployment/data/OTDB/createPICfile
@@ -2,82 +2,91 @@
 #
 # $Id$
 #
-# Syntax: createPICFile ( -a | stationname [stationame ...])
+# Syntax: createPICFile ( -a | station-name [statio-name ...])
 #
-# Makea a file with PVSS(!) datapoints that must be monitored in SAS.
+# Make a a file with PVSS(!) data-points that must be monitored in SAS.
 import re, sys
 from optparse import OptionParser
 
+
 def expandRCUMarker(dataPoint, nrRSP):
     """
-	Expands the lines that only contain markers up to @rcu@.
+    Expands the lines that only contain markers up to @rcu@.
     """
     for rcu in range(0, nrRSP * 8):
-        rsp = rcu / 8 
-        subrack = rsp / 4
-        cabinet = rsp / 8
-        print "21 "+dataPoint.replace("@cabinet@","Cabinet"+str(cabinet)) \
-                               .replace("@subrack@","Subrack"+str(subrack)) \
-                               .replace("@RSPBoard@", "RSPBoard"+str(rsp)) \
-                               .replace("@rcu@", "RCU"+str(rcu))+".status.state"
+        rsp = rcu // 8
+        subrack = rsp // 4
+        cabinet = rsp // 8
+        print("21 " + dataPoint
+              .replace("@cabinet@", "Cabinet" + str(cabinet))
+              .replace("@subrack@", "Subrack" + str(subrack))
+              .replace("@RSPBoard@", "RSPBoard" + str(rsp))
+              .replace("@rcu@", "RCU" + str(rcu)) + ".status.state")
+
 
 def expandRSPBoardMarker(dataPoint, nrRSP):
     """
-	Expands the lines that only contain markers up to @rcu@.
+    Expands the lines that only contain markers up to @rcu@.
     """
     for rsp in range(0, nrRSP):
-        subrack = rsp / 4
-        cabinet = rsp / 8
-        print "21 "+dataPoint.replace("@cabinet@","Cabinet"+str(cabinet)) \
-                               .replace("@subrack@","Subrack"+str(subrack)) \
-                               .replace("@RSPBoard@", "RSPBoard"+str(rsp))+".status.state"
+        subrack = rsp // 4
+        cabinet = rsp // 8
+        print("21 " + dataPoint
+              .replace("@cabinet@", "Cabinet" + str(cabinet))
+              .replace("@subrack@", "Subrack" + str(subrack))
+              .replace("@RSPBoard@", "RSPBoard" + str(rsp)) + ".status.state")
+
 
 def expandTBBoardMarker(dataPoint, nrTBB):
     """
-	Expands the lines that only contain markers up to @rcu@.
+    Expands the lines that only contain markers up to @rcu@.
     """
     for tbb in range(0, nrTBB):
-        subrack = tbb / 2
-        cabinet = tbb / 4
-        print "21 "+dataPoint.replace("@cabinet@","Cabinet"+str(cabinet)) \
-                               .replace("@subrack@","Subrack"+str(subrack)) \
-                               .replace("@TBBoard@", "TBBoard"+str(tbb))+".status.state"
+        subrack = tbb // 2
+        cabinet = tbb // 4
+        print("21 " + dataPoint
+              .replace("@cabinet@", "Cabinet" + str(cabinet))
+              .replace("@subrack@", "Subrack" + str(subrack))
+              .replace("@TBBoard@", "TBBoard" + str(tbb)) + ".status.state")
+
 
 def expandSubrackMarker(dataPoint, nrRSP):
     """
-	Expands the lines that only contain markers up to @rcu@.
+    Expands the lines that only contain markers up to @rcu@.
     """
-    nrSubracks = nrRSP / 4
+    nrSubracks = nrRSP // 4
     if nrRSP % 4: nrSubracks += 1
     for subrack in range(0, nrSubracks):
-        cabinet = subrack / 2
-        print "21 "+dataPoint.replace("@cabinet@","Cabinet"+str(cabinet)) \
-                               .replace("@subrack@","Subrack"+str(subrack))+".status.state"
+        cabinet = subrack // 2
+        print("21 " + dataPoint
+              .replace("@cabinet@", "Cabinet" + str(cabinet))
+              .replace("@subrack@", "Subrack" + str(subrack)) + ".status.state")
+
 
 def expandCabinetMarker(dataPoint, nrRSP):
-	"""
-	Expands the lines that only contain the @cabinet@ marker with all cabinet numbers
-	"""
-	nrCabinets = nrRSP / 8
-	if nrRSP % 8: nrCabinets += 1
-	for cabinet in range(0, nrCabinets):
-		print "21 "+dataPoint.replace("@cabinet@","Cabinet"+str(cabinet))+".status.state"
+    """
+    Expands the lines that only contain the @cabinet@ marker with all cabinet numbers
+    """
+    nrCabinets = nrRSP // 8
+    if nrRSP % 8: nrCabinets += 1
+    for cabinet in range(0, nrCabinets):
+        print("21 " + dataPoint.replace("@cabinet@", "Cabinet" + str(cabinet)) + ".status.state")
 
 
 def expandLBAMarker(dataPoint, nrLBA):
-	"""
-	Expands the lines that only contain the @lbaantenna@ marker with all cabinet numbers
-	"""
-	for lba in range(0, nrLBA):
-		print "21 "+dataPoint.replace("@lbaantenna@","LBA%03d"%lba)+".status.state"
+    """
+    Expands the lines that only contain the @lbaantenna@ marker with all cabinet numbers
+    """
+    for lba in range(0, nrLBA):
+        print("21 " + dataPoint.replace("@lbaantenna@", "LBA%03d" % lba) + ".status.state")
 
-def expandHBAMarker(dataPoint, nrHBA):
-	"""
-	Expands the lines that only contain the @hbaantenna@ marker with all cabinet numbers
-	"""
-	for lba in range(0, nrHBA):
-		print "21 "+dataPoint.replace("@hbaantenna@","HBA%02d"%lba)+".status.state"
 
+def expandHBAMarker(dataPoint, nrHBA):
+    """
+    Expands the lines that only contain the @hbaantenna@ marker with all cabinet numbers
+    """
+    for lba in range(0, nrHBA):
+        print("21 " + dataPoint.replace("@hbaantenna@", "HBA%02d" % lba) + ".status.state")
 
 
 # MAIN
@@ -85,7 +94,6 @@ def expandHBAMarker(dataPoint, nrHBA):
 
 # We can start this from a SVN tree, or from the install location (/opt/lofar)
 # This is indicated by the "-l" command line option.
-
 parser = OptionParser()
 parser.add_option("-l", "--local", action="store_true", dest="isLocal", default=False,
                   help="Run createPICFile in situ (in a svn checkout tree, not an in install tree [default!]")
@@ -93,16 +101,16 @@ parser.add_option("-l", "--local", action="store_true", dest="isLocal", default=
 (options, args) = parser.parse_args()
 
 if (options.isLocal):
-    PVSSbasefile= "../PVSS/data/PVSSDataPoints.base"
+    PVSSbasefile = "../PVSS/data/PVSSDataPoints.base"
     StationFile = "../StaticMetaData/StationInfo.dat"
     ControlFile = "../StaticMetaData/ControlInfo.dat"
-    RingFile    = "../PVSS/data/Rings.list"
+    RingFile = "../PVSS/data/Rings.list"
     ClusterFile = "../PVSS/data/Clusters.list"
 else:
-    PVSSbasefile= "/opt/lofar/pvss/dpdef/PVSSDataPoints.base"
+    PVSSbasefile = "/opt/lofar/pvss/dpdef/PVSSDataPoints.base"
     StationFile = "/opt/lofar/etc/StationInfo.dat"
     ControlFile = "/opt/lofar/etc/ControlInfo.dat"
-    RingFile    = "/opt/lofar/pvss/dpdef/Rings.list"
+    RingFile = "/opt/lofar/pvss/dpdef/Rings.list"
     ClusterFile = "/opt/lofar/pvss/dpdef/Clusters.list" 
 
 filledLine  = re.compile("^[^#].*", re.MULTILINE)
@@ -112,57 +120,57 @@ filledLine  = re.compile("^[^#].*", re.MULTILINE)
 ringDict = {}
 for line in filledLine.findall(open(RingFile).read()):
     ringDict[line[0]] = line
-#print "ringDict =", ringDict
+# print "ringDict =", ringDict
 
 # construct a list with all ring_station combinations
 ringStations = []
 stations = []
 for line in filledLine.findall(open(StationFile).read()):
     if (line.strip() and len(line.split()) == 14 and line.strip()[0] != "#"):
-#        print "line: =",line
+        # print "line: =",line
         (name, stationID, stnType, long, lat, height, nrRSP, nrTBB, nrLBA, nrHBA, nrPowec, HBAsplit, LBAcal, AartFaac ) = line.split()
         if (height != "0" and int(stationID) < 900):
             ringStations.append(ringDict[stnType]+"_"+name)
             stations.append(name)
             
-#print "ringStations =", ringStations
-#print "stations =", stations
+# print "ringStations =", ringStations
+# print "stations =", stations
     
 # construct a dictionary for the clusters
 clusterDict = {}
 for line in filledLine.findall(open(ClusterFile).read()):
     (mnemonic, prefix, count) = line.split()
     clusterDict[mnemonic] = (prefix, count)
-#print "clusterDict =", clusterDict
+# print "clusterDict =", clusterDict
 
 # construct a list for the control-machines
 controlList = []
 for line in filledLine.findall(open(ControlFile).read()):
     (name, ipaddr, macaddr) = line.split()
     controlList.append(name)
-#print "controlList =", controlList
+# print "controlList =", controlList
 
 # open outputfile and write top-node of PIC
-print "21 LOFAR.status.state"
-print "21 LOFAR_PIC.status.state"
-print "21 LOFAR_PermSW.status.state"
+print("21 LOFAR.status.state")
+print("21 LOFAR_PIC.status.state")
+print("21 LOFAR_PermSW.status.state")
 
 # construct the rings with stations and the clusters with their nodes
 # ???	???  	C	P	???	???_PIC_@???@
 ringStationMask=""
-central=re.compile("^\w+[ \t]+[^ \t]+[ \t]+M[ \t]+[YN][ \t]+([A-Za-z_]+_(?:PIC|PermSW)_@.*)", \
-                        re.IGNORECASE | re.MULTILINE)
+central=re.compile("^\w+[ \t]+[^ \t]+[ \t]+M[ \t]+[YN][ \t]+([A-Za-z_]+_(?:PIC|PermSW)_@.*)",
+                   re.IGNORECASE | re.MULTILINE)
 for line in central.findall(open(PVSSbasefile).read()):
-    #print "line =",line
+    # print "line =",line
     if line.find("@station@") >= 0:
         ringStationMask=line.replace("LOFAR_","")
         for RS in ringStations:
-            print "21 "+line.replace("@ring@_@station@", RS)+".status.state"
+            print("21 "+line.replace("@ring@_@station@", RS) + ".status.state")
     # ---
     elif line.find("@ring@") >= 0:
         # for all rings
         for ring in ringDict.keys():
-            print "21 "+line.replace("@ring@", ringDict[ring])+".status.state"
+            print("21 "+line.replace("@ring@", ringDict[ring]) + ".status.state")
     # ---
     elif line.find("@node@") >= 0:
         # for all nodes in each cluster
@@ -170,44 +178,44 @@ for line in central.findall(open(PVSSbasefile).read()):
             (name, count) = clusterDict[cluster]
             for nodeNr in range(1, int(count)+1):
                 nodename = "%s%03d" % (name, nodeNr)
-                print "21 "+line.replace("@cluster@_@node@", cluster+"_"+nodename)+".status.state"
+                print("21 " + line.replace("@cluster@_@node@", cluster + "_" + nodename) + ".status.state")
             # for all nodes
         # for all clusters
         # also add= the control 'cluster' at this place
         for node in controlList:
-            print "21 "+line.replace("@cluster@_@node@", "Control_"+node)+".status.state"
+            print("21 " + line.replace("@cluster@_@node@", "Control_" + node) + ".status.state")
     # ---
     elif line.find("@cluster@") >= 0:
         # for all clusters
         for cluster in clusterDict.keys():
-            print "21 "+line.replace("@cluster@", cluster)+".status.state"
+            print("21 " + line.replace("@cluster@", cluster) + ".status.state")
         # and the control-section
-        print "21 "+line.replace("@cluster@", "Control")+".status.state"
+        print("21 " + line.replace("@cluster@", "Control") + ".status.state")
     # ---
     elif line.find("@") < 0:
-        print "21 "+line+".status.state"
+        print("21 " + line + ".status.state")
         
 # for all expandable lines
 
 # Permanent software on MCU
-software=re.compile("^\w+[ \t]+[^ \t]+[ \t]+M[ \t]+[YN][ \t]+([A-Za-z_]+_PermSW_[^@].*)", \
-					re.IGNORECASE | re.MULTILINE)
+software=re.compile("^\w+[ \t]+[^ \t]+[ \t]+M[ \t]+[YN][ \t]+([A-Za-z_]+_PermSW_[^@].*)",
+                    re.IGNORECASE | re.MULTILINE)
 for line in software.findall(open(PVSSbasefile).read()):
-	print "21 MCU001:%s.status.state" % line
+    print("21 MCU001:%s.status.state" % line)
 
 # generate the hardware on each station
 for line in filledLine.findall(open(StationFile).read()):
-#    print "line: =",line
+    # print "line: =",line
     if (line.strip() and len(line.split()) == 14 and line.strip()[0] != "#"):
         (name, stationID, stnType, long, lat, height, nrRSP, nrTBB, nrLBA, nrHBA, nrPowec, HBAsplit, LBAcal, AartFaac ) = line.split()
-        if ( height == "0" or int(stationID) >= 900):
+        if height == "0" or int(stationID) >= 900:
             continue
 
         # Find all expandable hardware elements on a station. The line syntax is:
         # ???	???  	S	P	???	???_PIC_@...@
         # we are only interested in the @...@ part.
-        station=re.compile("^\w+[ \t]+[^ \t]+[ \t]+S[ \t]+[YN][ \t]+[A-Za-z_]+_PIC_(@.*)", \
-                        re.IGNORECASE | re.MULTILINE)
+        station=re.compile("^\w+[ \t]+[^ \t]+[ \t]+S[ \t]+[YN][ \t]+[A-Za-z_]+_PIC_(@.*)",
+                           re.IGNORECASE | re.MULTILINE)
         for line in station.findall(open(PVSSbasefile).read()):
             prefix="@station@:LOFAR_PIC_".replace("@station@", name)
             if line.find("@rcu@") >= 0:
@@ -226,11 +234,10 @@ for line in filledLine.findall(open(StationFile).read()):
                 expandHBAMarker(prefix+line, int(nrHBA))
         #   for all expandable lines
         # Permanent software on the stations
-        software=re.compile("^\w+[ \t]+[^ \t]+[ \t]+S[ \t]+[YN][ \t]+([A-Za-z_]+_PermSW_.*)", \
-                        re.IGNORECASE | re.MULTILINE)
+        software=re.compile("^\w+[ \t]+[^ \t]+[ \t]+S[ \t]+[YN][ \t]+([A-Za-z_]+_PermSW_.*)",
+                            re.IGNORECASE | re.MULTILINE)
         for line in software.findall(open(PVSSbasefile).read()):
             if line.find("@") < 0:
-                print "21 %s:%s.status.state" % (name, line)
+                print("21 %s:%s.status.state" % (name, line))
     
-#for all stations
-
+# for all stations
diff --git a/MAC/Deployment/data/PVSS/License/471_3031_Astron_Station_5.log b/MAC/Deployment/data/PVSS/License/471_3031_Astron_Station_5.log
new file mode 100644
index 0000000000000000000000000000000000000000..ae787de102612e1e29fbae2d0a4c68eb2eee8539
--- /dev/null
+++ b/MAC/Deployment/data/PVSS/License/471_3031_Astron_Station_5.log
@@ -0,0 +1,34 @@
+
+---------------------------------------------------
+[license]
+code        = "LV614C 50455775608"
+version     = 31400002
+sn          = "471_3031_Astron_Station_5/1"
+date        = 2019.09.02;10:21:13,000 
+comment     = "European Station LV614"
+expire      = 0000.00.00;00:00:00,000 
+redundancy  = 0
+ui          = 1
+para        = 1
+dde         = 5
+event       = 1
+ios         = 4000
+ssi         = 0
+api         = 80
+excelreport = 5
+http        = 0
+infoserver  = 1000
+comcenter   = 5
+maintenance = 1
+scheduler   = 1
+s7          = 1
+recipe      = 1
+distributed = 255
+ultralight  = 1
+mobile_app  = 1
+uifix       = 0
+parafix     = 0
+pararemote  = 0
+ctrlext     = 1
+update      = 0
+
diff --git a/MAC/Deployment/data/PVSS/License/Astron_Station_1_shield.txt b/MAC/Deployment/data/PVSS/License/Astron_Station_1_shield.txt
index b9af735dd4ba4da54568a18c971f63b08a179db1..3ea11580e68c8a5ad0088ef338d8e1ee64bf7a6e 100644
--- a/MAC/Deployment/data/PVSS/License/Astron_Station_1_shield.txt
+++ b/MAC/Deployment/data/PVSS/License/Astron_Station_1_shield.txt
@@ -1,34 +1,33 @@
 [license]
-#hw               = 12831493085
-code              = "dongleHost 00138422163"
-version           = 31600002
-sn                = "471_3031_Astron_Station_5"
-expire            = 0000.00.00;00:00:00,000
-redundancy        = 0
-ui                = 1
-para              = 1
-dde               = 5
-event             = 1
-api               = 80
-excelreport       = 5
-http              = 0
-infoserver        = 1000
-ios               = 4000
-comcenter         = 5
-maintenance       = 1
-scheduler         = 1
-ssi               = 0
-s7                = 1
-recipe            = 1
-distributed       = 255
-ultralight        = 1
-mobile_app        = 1
-s7plus            = 8
-uifix             = 0
-parafix           = 0
-pararemote        = 0
-ctrlext           = 1
-update            = 0
-licenseMax        = 100
-licenseLeft       = 100
+code        = "dongleHost 40215168481"
+version     = 31600002
+sn          = "471_3031_Astron_Station_5"
+expire      = 0000.00.00;00:00:00,000 
+redundancy  = 0
+ui          = 1
+para        = 1
+dde         = 5
+event       = 1
+ios         = 4000
+ssi         = 0
+api         = 80
+excelreport = 5
+http        = 0
+infoserver  = 1000
+comcenter   = 5
+maintenance = 1
+scheduler   = 1
+s7          = 1
+recipe      = 1
+distributed = 255
+ultralight  = 1
+mobile_app  = 1
+s7plus      = 8
+uifix       = 0
+parafix     = 0
+pararemote  = 0
+ctrlext     = 1
+update      = 0
+licenseMax  = 100
+licenseLeft = 99
 
diff --git a/MAC/Deployment/data/PVSS/License/LV614C_option.txt b/MAC/Deployment/data/PVSS/License/LV614C_option.txt
new file mode 100644
index 0000000000000000000000000000000000000000..91bb46fef907b5bbafc91197df46020cce5d390f
--- /dev/null
+++ b/MAC/Deployment/data/PVSS/License/LV614C_option.txt
@@ -0,0 +1,32 @@
+[license]
+code        = "LV614C 33179529551"
+version     = 31400002
+comment       = "European Station LV614"
+sn            = "471_3031_2_Astron_Gen_II_1_38"
+expire        = 0000.00.00;00:00:00,000
+redundancy    = 0
+ui            = 1
+para          = 1
+dde           = 5
+event         = 1
+api           = 80
+excelreport   = 5
+http          = 0
+infoserver    = 1000
+ios           = 4000
+comcenter     = 5
+maintenance   = 1
+scheduler     = 1
+ssi           = 0
+s7            = 1
+recipe        = 1
+distributed   = 255
+ultralight    = 1
+mobile_app    = 1
+uifix         = 0
+parafix       = 0
+pararemote    = 0
+ctrlext       = 1
+update        = 0
+
+
diff --git a/MAC/Deployment/data/PVSS/License/shield.LV614C.txt b/MAC/Deployment/data/PVSS/License/shield.LV614C.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d2584092b95fdbd6e41fd3d5d17a83097777fc92
--- /dev/null
+++ b/MAC/Deployment/data/PVSS/License/shield.LV614C.txt
@@ -0,0 +1,32 @@
+[license]
+code        = "LV614C 50455775608"
+version     = 31400002
+sn          = "471_3031_Astron_Station_5/1"
+date        = 2019.09.02;10:21:13,000 
+comment     = "European Station LV614"
+expire      = 0000.00.00;00:00:00,000 
+redundancy  = 0
+ui          = 1
+para        = 1
+dde         = 5
+event       = 1
+ios         = 4000
+ssi         = 0
+api         = 80
+excelreport = 5
+http        = 0
+infoserver  = 1000
+comcenter   = 5
+maintenance = 1
+scheduler   = 1
+s7          = 1
+recipe      = 1
+distributed = 255
+ultralight  = 1
+mobile_app  = 1
+uifix       = 0
+parafix     = 0
+pararemote  = 0
+ctrlext     = 1
+update      = 0
+
diff --git a/MAC/Deployment/data/StaticMetaData/RSPImage.conf b/MAC/Deployment/data/StaticMetaData/RSPImage.conf
index 0109608db327635e838aa5a4565be49cdc902b47..7d8194aa3459e37334d9c567dd836e7b5818477d 100644
--- a/MAC/Deployment/data/StaticMetaData/RSPImage.conf
+++ b/MAC/Deployment/data/StaticMetaData/RSPImage.conf
@@ -59,4 +59,4 @@ PL610  4
 PL611  4
 PL612  4
 IE613  4
-LV616  4
+LV614  4
diff --git a/MAC/Deployment/data/StaticMetaData/StationInfo.dat b/MAC/Deployment/data/StaticMetaData/StationInfo.dat
index c35d2b0665a7aff694aba32216ffd17df2494675..ceb4270bf82d1380403f60c9b50b66012beb5ee4 100644
--- a/MAC/Deployment/data/StaticMetaData/StationInfo.dat
+++ b/MAC/Deployment/data/StaticMetaData/StationInfo.dat
@@ -129,7 +129,7 @@ PL612   213    E     20.5897506  53.5939042      178.38  24    12    96    96
 # Birr
 IE613   214    E     -7.9213656  53.0951167      105.99  24    12    96    96    2       No       No    No
 # Irbene
-LV614   215    E     21.8549189  57.5568802       13.29  24    12    96    96    2       No       No    No
+LV614   215    E     21.8558311  57.5570617       42.58  24    12    96    96    2       No       No    No
 
 ## Non-ILT international
 ## 900