diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4b3dec27e0374f0fcc842d7e2646f7193ca09653
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+*.pyc
+*/*.pyc*.pyc
+*/*.pyc*.pyc
+*/*.pyc*.pyc
+*/*.pyc*.pyc
+*/*.pyc*.pyc
+*/*.pyc*.pyc
+*/*.pyc*.pyc
+*/*.pyc
diff --git a/da/analysis/expand_molefractions.py b/da/analysis/expand_molefractions.py
index abcc2b08dd694bfdf78e286fcb0d829a72579072..910adfea0a61bfef21a51150b0e0a437715a24f3 100755
--- a/da/analysis/expand_molefractions.py
+++ b/da/analysis/expand_molefractions.py
@@ -19,7 +19,6 @@ import shutil
 import logging
 import netCDF4
 import numpy as np
-from string import join
 from datetime import datetime, timedelta
 sys.path.append('../../')
 from da.tools.general import date2num, num2date
diff --git a/da/analysis/tools_transcom.py b/da/analysis/tools_transcom.py
index 68287fb065644e5e8184b1c9bf13b5e8012c0da1..cc96a14009f22ef5879f66bf7adc8941da9134c4 100755
--- a/da/analysis/tools_transcom.py
+++ b/da/analysis/tools_transcom.py
@@ -18,7 +18,6 @@ sys.path.append('../../')
 rootdir = os.getcwd().split('da/')[0]
 analysisdir = os.path.join(rootdir, 'da/analysis')
 
-from string import join, split
 from numpy import array, identity, zeros, arange, dot
 import da.tools.io4 as io
 
diff --git a/da/carbondioxide/column_obs.py b/da/carbondioxide/column_obs.py
index ff367401877338b9713facf8f19dc3f218074f5a..691bec74b52bf343d1e4a16f55e46262650c6031 100644
--- a/da/carbondioxide/column_obs.py
+++ b/da/carbondioxide/column_obs.py
@@ -26,7 +26,6 @@ import logging
 
 import datetime as dtm
 import numpy as np
-from string import strip
 from numpy import array, logical_and, sqrt
 sys.path.append(os.getcwd())
 sys.path.append('../../')
diff --git a/da/carbondioxide/obs.py b/da/carbondioxide/obs.py
index 775feb955bc60970348bb33d6766343147fa916b..89f276e35fb702830279f1fe7731d63f09d94604 100755
--- a/da/carbondioxide/obs.py
+++ b/da/carbondioxide/obs.py
@@ -23,9 +23,7 @@ File created on 28 Jul 2010.
 import os
 import sys
 import logging
-#from da.baseclasses.statevector import filename
 import datetime as dtm
-from string import strip
 from numpy import array, logical_and
 
 sys.path.append(os.getcwd())
diff --git a/da/carbondioxide/obspack.py b/da/carbondioxide/obspack.py
index ceab0138a5314ca3c78c2ee9fb41f91a5bac9450..729bc0bf02edc48957287663a00dd1e10c272233 100755
--- a/da/carbondioxide/obspack.py
+++ b/da/carbondioxide/obspack.py
@@ -24,7 +24,6 @@ import os
 import sys
 import logging
 import datetime as dtm
-#from string import strip
 from numpy import array, logical_and
 
 sys.path.append(os.getcwd())
diff --git a/da/carbondioxide/obspack_geocarbon.py b/da/carbondioxide/obspack_geocarbon.py
index 26b54962b9deff469b43222f4ff6002a723fffc2..7bce8b71e78a2feecfe279455fdc441981d3cbfb 100755
--- a/da/carbondioxide/obspack_geocarbon.py
+++ b/da/carbondioxide/obspack_geocarbon.py
@@ -25,7 +25,6 @@ import sys
 import logging
         
 import datetime as dtm
-from string import strip
 from numpy import array, logical_and
 sys.path.append(os.getcwd())
 sys.path.append('../../')
diff --git a/da/carbondioxide/obspack_globalviewplus.py b/da/carbondioxide/obspack_globalviewplus.py
index da1a09a3ac58962d660391f8f35eac2e463228cb..018e1ef2233b9d2adcc50a41fb1cf5c47c299c58 100755
--- a/da/carbondioxide/obspack_globalviewplus.py
+++ b/da/carbondioxide/obspack_globalviewplus.py
@@ -25,7 +25,6 @@ import sys
 import logging
         
 import datetime as dtm
-#from string import strip
 from numpy import array, logical_and, sqrt
 sys.path.append(os.getcwd())
 sys.path.append('../../')
diff --git a/da/carbondioxide/obspack_globalviewplus2.py b/da/carbondioxide/obspack_globalviewplus2.py
index 156c0d009d2519e7bf20faff21d44ef40ac91fda..33134bb5c2cce9a01e35c7ecac2b2f4d80e9d466 100755
--- a/da/carbondioxide/obspack_globalviewplus2.py
+++ b/da/carbondioxide/obspack_globalviewplus2.py
@@ -26,7 +26,6 @@ import sys
 import logging
 
 import datetime as dtm
-from string import strip
 from numpy import array, logical_and, sqrt
 sys.path.append(os.getcwd())
 sys.path.append('../../')
@@ -115,8 +114,8 @@ class ObsPackObservations(Observations):
         logging.debug("ObsPack dataset info read, proceeding with %d netcdf files" % len(ncfilelist))
 
         for ncfile in ncfilelist:
-
-	    if ncfile not in valid_sites: continue
+            
+            if ncfile not in valid_sites: continue
 
             infile = os.path.join(self.obspack_dir, 'data', 'nc', ncfile + '.nc')
             ncf    = io.ct_read(infile, 'read')
@@ -296,27 +295,27 @@ class ObsPackObservations(Observations):
             savedict['missing_value'] = '!'
             f.add_data(savedict)
 
-	    data = self.getvalues('obs')
-
-	    savedict = io.std_savedict.copy()
-	    savedict['name'] = "observed"
-	    savedict['long_name'] = "observedvalues"
-	    savedict['units'] = "mol mol-1"
-	    savedict['dims'] = dimid
-	    savedict['values'] = data.tolist()
-	    savedict['comment'] = 'Observations used in optimization'
-	    f.add_data(savedict)
-
-	    data = self.getvalues('mdm')
-
-	    savedict = io.std_savedict.copy()
-	    savedict['name'] = "modeldatamismatch"
-	    savedict['long_name'] = "modeldatamismatch"
-	    savedict['units'] = "[mol mol-1]"
-	    savedict['dims'] = dimid
-	    savedict['values'] = data.tolist()
-	    savedict['comment'] = 'Standard deviation of mole fractions resulting from model-data mismatch'
-	    f.add_data(savedict)
+            data = self.getvalues('obs')
+
+            savedict = io.std_savedict.copy()
+            savedict['name'] = "observed"
+            savedict['long_name'] = "observedvalues"
+            savedict['units'] = "mol mol-1"
+            savedict['dims'] = dimid
+            savedict['values'] = data.tolist()
+            savedict['comment'] = 'Observations used in optimization'
+            f.add_data(savedict)
+
+            data = self.getvalues('mdm')
+
+            savedict = io.std_savedict.copy()
+            savedict['name'] = "modeldatamismatch"
+            savedict['long_name'] = "modeldatamismatch"
+            savedict['units'] = "[mol mol-1]"
+            savedict['dims'] = dimid
+            savedict['values'] = data.tolist()
+            savedict['comment'] = 'Standard deviation of mole fractions resulting from model-data mismatch'
+            f.add_data(savedict)
             f.close()
 
             logging.debug("Successfully wrote data to obs file")
diff --git a/da/co2gridded/statevectorNHgridded.py b/da/co2gridded/statevectorNHgridded.py
index 67341824b02711d6c6d45b92b84e3cdf20e3013a..92b0a78b1a069fe6fbbf50cd5aef9788201597c0 100644
--- a/da/co2gridded/statevectorNHgridded.py
+++ b/da/co2gridded/statevectorNHgridded.py
@@ -89,9 +89,9 @@ class CO2GriddedStateVector(StateVector):
 
             if 'pco2' in file or 'cov_ocean' in file:
                 parnr = list(range(9805,9835))
-		if 'ocn.optimize' in dacycle.dasystem and not dacycle.dasystem['ocn.optimize']:
-		    cov = np.identity(30)*1E-20
-		    logging.debug('Prior ocean covariance matrix = Identity matrix')
+                if 'ocn.optimize' in dacycle.dasystem and not dacycle.dasystem['ocn.optimize']:
+                    cov = np.identity(30)*1E-20
+                    logging.debug('Prior ocean covariance matrix = Identity matrix')
                 else:
                     cov_ocn = f.get_variable('CORMAT')
                     cov     = cov_ocn
diff --git a/da/platform/cartesius.py b/da/platform/cartesius.py
index b1daa0aa5e100f801a5b0cb57135e8c1d64c4191..3286b48c02483e0d6c1cb92198f4694d06db9743 100755
--- a/da/platform/cartesius.py
+++ b/da/platform/cartesius.py
@@ -132,9 +132,9 @@ class CartesiusPlatform(Platform):
             logging.info("A new task will be started (%s)" % cmd)
             output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
             logging.info(output)
-            print 'output', output
+            print('output', output)
             jobid = output.split()[-1]             
-            print 'jobid', jobid
+            print('jobid', jobid)
         else:
             cmd = ["sbatch", jobfile]
             logging.info("A new job will be submitted (%s)" % cmd)
diff --git a/da/rc/ctdas_column_oco2.rc b/da/rc/ctdas_column_oco2.rc
new file mode 100644
index 0000000000000000000000000000000000000000..2372230813bdc0c5decaf243982d23e84294864e
--- /dev/null
+++ b/da/rc/ctdas_column_oco2.rc
@@ -0,0 +1,40 @@
+!!! Info for the CarbonTracker data assimilation system
+ 
+datadir             : /projects/0/ctdas/input/ctdas_2012
+
+! XCO2 samples
+obs.column.input.dir          : ${datadir}/xco2/oco2_l2_lite_fp_9r_10secs/
+obs.column.ncfile             : oco2_LtCO2_<YYYYMMDD>_10sec.nc
+obs.column.selection.variables: land_water_indicator, operation_mode
+obs.column.selection.criteria : == 0, <2
+obs.column.extra.variables    : pressure_weight
+obs.column.mdm.weight         : 1
+obs.column.rc	              : ${datadir}/xco2/oco2_weights.rc
+obs.column.mdm.calculation    : parametrization
+
+! For ObsPack
+obspack.input.id   : obspack_co2_111_MERGE_GLOBALVIEWplus_v4.2_NRT_v4.4_2019-05-16
+obspack.input.dir  : ${datadir}/obspacks/${obspack.input.id}
+obs.sites.rc       : /projects/0/ctdas/liesbeth/ctdas_xco2/sites_weights_validation_noaircraft.rc
+obspack.mdm.weight : 1
+obs.scaling.factor : 1e6
+
+ocn.covariance  : ${datadir}/oceans/oif/cov_ocean.2000.01.nc 
+deltaco2.prefix : oif_p3_era40.dpco2
+
+bio.cov.dir     : ${datadir}/covariances/gridded_NH/
+bio.cov.prefix  : cov_ecoregion
+
+regtype         : gridded_oif30
+nparameters     : 9835 
+random.seed     : 4385
+regionsfile     : ${datadir}/covariances/gridded_NH/griddedNHparameters.nc
+!random.seed.init: ${datadir}/randomseedinit.pickle
+
+! Include a naming scheme for the variables
+
+#include NamingScheme.wp_Mar2011.rc 
+
+! Info on the sites file used
+
+ocn.optimize       : True
diff --git a/da/tm5/observationoperator.py b/da/tm5/observationoperator.py
index dd21dba0cc292bb920c7d7b037b144b20af2c000..5fe9e457eab7b51471f059cdec5f8d69e4d056fa 100755
--- a/da/tm5/observationoperator.py
+++ b/da/tm5/observationoperator.py
@@ -38,7 +38,6 @@ import logging
 import shutil
 import datetime
 import subprocess
-from string import join
 import glob
 sys.path.append(os.getcwd())
 sys.path.append("../../")
@@ -191,7 +190,7 @@ class TM5ObservationOperator(ObservationOperator):
         else: cmd = ['python', 'setup_tm5', '--%s' % self.dacycle.daplatform.give_queue_type(), rcfilename]
 
         logging.info('Starting the external TM5 setup script')
-        logging.info('using command ... %s' % join(cmd))
+        logging.info('using command ... %s' % ''.join(cmd))
 
         retcode = subprocess.call(cmd)
         os.chdir(self.dacycle['dir.da_submit'])
diff --git a/da/tools/initexit.py b/da/tools/initexit.py
index 4a29e1dd50cabc1021945a85363f7e25a474fb65..7d69199745dcec8feabcdb93a26bbf93b20e5880 100755
--- a/da/tools/initexit.py
+++ b/da/tools/initexit.py
@@ -75,7 +75,6 @@ import copy
 import getopt
 import pickle
 import numpy as np
-#from string import join
 
 import da.tools.rc as rc
 from da.tools.general import create_dirs, to_datetime, advance_time