diff --git a/analysis_only.py b/analysis_only.py
index fa735f959e3e1634741ecd3ccca5a6cf0196fe6c..9707bd6b1058c2fe6662376c6ebcb993ecb5ecc0 100755
--- a/analysis_only.py
+++ b/analysis_only.py
@@ -5,7 +5,7 @@ running the forecast model without assimilation
 import os, sys, shutil
 import datetime as dt
 
-from dartwrf import utils
+from dartwrf.utils_workflow import backup_scripts
 from config.cfg import exp, cluster
 
 log_dir = cluster.archivedir+'/logs/'
@@ -15,7 +15,7 @@ print('scripts, which are submitted to SLURM:', slurm_scripts_dir)
 
 
 ###############################
-utils.backup_scripts()
+backup_scripts()
 
 
 prior_path_exp = '/mnt/jetfs/scratch/lkugler/data/sim_archive/exp_v1.19_P3_wbub7_noDA'
diff --git a/config/cfg.py b/config/cfg.py
index af998f1e96fd83c0b475dc5a944f7baacdd05f10..c0340bd94405b672c4c9761ef9c6a4aba8c18f64 100755
--- a/config/cfg.py
+++ b/config/cfg.py
@@ -1,8 +1,8 @@
-from dartwrf import utils
+from dartwrf.utils_workflow import ExperimentConfiguration
 from config import clusters  # from . = problem in archivedir
-cluster = clusters.jet  # change cluster configuration here
+cluster = clusters.srvx1  # change cluster configuration here
 
-exp = utils.ExperimentConfiguration()
+exp = ExperimentConfiguration()
 exp.expname = "test_srvx1" #"exp_v1.22_P3_wbub7_WV62_obs10_loc20_oe1"
 exp.model_dx = 2000
 exp.n_ens = 40
@@ -24,7 +24,7 @@ exp.use_existing_obsseq = False  # False or pathname (use precomputed obs_seq.ou
 #exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.19_P5+su_nat2/2008-07-30_07:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S'
 #exp.nature_wrfout = '/jetfs/home/lkugler/data/sim_archive/exp_v1.19_P3_wbub7_nat/2008-07-30_12:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S'
 #exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.19_Pwbub5_nat/2008-07-30_12:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S'
-exp.nature_wrfout = '/jetfs/home/lkugler/data/sim_archive/exp_v1.18_P1_nature/2008-07-30_06:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S'
+exp.nature_wrfout = cluster.archive_base+'/exp_v1.18_P1_nature/2008-07-30_06:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S'
 #exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.19_P4_nat/2008-07-30_07:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S'
 
 exp.input_profile = '/jetfs/home/lkugler/data/initial_profiles/wrf/ens/2022-03-31/raso.fc.<iens>.wrfprof'
diff --git a/config/clusters.py b/config/clusters.py
index d2ae6f8c9137f43b28b329b93bc2f8151b1d46ca..01e61703abd094d43260f13cc1ce049aeda043df 100755
--- a/config/clusters.py
+++ b/config/clusters.py
@@ -1,6 +1,6 @@
 import os, sys
 import datetime as dt
-from dartwrf import utils
+from dartwrf.utils_workflow import ClusterConfig
 
 """Configuration name docs
 
@@ -43,8 +43,7 @@ slurm_cfg               python dictionary, containing options of SLURM
 
 
 
-
-vsc = utils.ClusterConfig()
+vsc = ClusterConfig()
 vsc.name = 'vsc' 
 vsc.max_nproc = 20
 vsc.size_jobarray = 10  # 10 jobs with each 4 WRF processes per node
@@ -77,7 +76,7 @@ vsc.slurm_cfg = {"account": "p71386", "partition": "skylake_0384", "qos": "p7138
                  "nodes": "1", "ntasks": "1", "ntasks-per-node": "48", "ntasks-per-core": "1",
                  "mail-type": "FAIL", "mail-user": "lukas.kugler@univie.ac.at"}
 
-jet = utils.ClusterConfig()
+jet = ClusterConfig()
 jet.name = 'jet'
 jet.max_nproc = 12
 jet.use_slurm = True
@@ -113,36 +112,31 @@ jet.slurm_cfg = {"account": "lkugler", "partition": "compute", #"nodelist": "jet
                  "mail-type": "FAIL", "mail-user": "lukas.kugler@univie.ac.at"}
 
 
-srvx1 = utils.ClusterConfig()
+srvx1 = ClusterConfig()
 srvx1.name = 'srvx1'
 srvx1.max_nproc = 6
-srvx1.size_jobarray = 40
 srvx1.use_slurm = False
 
 # binaries
-srvx1.python = '/mnt/jetfs/home/lkugler/miniconda3/envs/DART/bin/python'
-srvx1.python_verif = '/jetfs/home/lkugler/miniconda3/envs/enstools/bin/python'
-srvx1.ncks = '/jetfs/spack/opt/spack/linux-rhel8-skylake_avx512/intel-20.0.2/nco-4.9.3-dhlqiyog7howjmaleyfhm6lkt7ra37xf/bin/ncks'
-srvx1.ideal = '/jetfs/home/lkugler/bin/ideal-v4.3_v1.22.exe'
-srvx1.wrfexe = '/jetfs/home/lkugler/bin/wrf-v4.3_v1.22.exe'
+srvx1.python = '/users/staff/lkugler/miniconda3/bin/python'
+srvx1.python_verif = '/users/staff/lkugler/miniconda3/bin/python'
+srvx1.ncks = '/home/swd/spack/opt/spack/linux-rhel8-skylake_avx512/gcc-8.5.0/nco-5.0.1-ntu44aoxlvwtr2tsrobfr4lht7cpvccf/bin/ncks'
+srvx1.ideal = '' #/jetfs/home/lkugler/bin/ideal-v4.3_v1.22.exe'
+srvx1.wrfexe = '' #/jetfs/home/lkugler/bin/wrf-v4.3_v1.22.exe'
 srvx1.container = ''
 
 # paths for data output
-srvx1.wrf_rundir_base = '/jetfs/home/lkugler/data/run_WRF/'  # path for temporary files
-srvx1.dart_rundir_base = '/jetfs/home/lkugler/data/run_DART/'  # path for temporary files
+srvx1.wrf_rundir_base = '/mnt/jetfs/home/lkugler/data/run_WRF/'  # path for temporary files
+srvx1.dart_rundir_base = '/users/staff/lkugler/AdvDA23/run_DART/'  # path for temporary files
 srvx1.archive_base = '/mnt/jetfs/scratch/lkugler/data/sim_archive/'
 
 # paths used as input
 srvx1.srcdir = '/users/staff/lkugler/AdvDA23/DART/WRF-4.3/run'
 srvx1.dart_srcdir = '/users/staff/lkugler/AdvDA23/DART/models/wrf/work'
 srvx1.rttov_srcdir = '/users/staff/lkugler/AdvDA23/RTTOV13/rtcoef_rttov13/'
-srvx1.scriptsdir = '/jetfs/home/lkugler/DART-WRF/dartwrf/'
+srvx1.scriptsdir = '/users/staff/lkugler/AdvDA23/DART-WRF/dartwrf/'
 srvx1.geo_em = '/mnt/jetfs/scratch/lkugler/data/geo_em.d01.nc'
 
 # templates/run scripts
 srvx1.namelist = srvx1.scriptsdir+'/../templates/namelist.input'
 srvx1.run_WRF = srvx1.scriptsdir+'/run_ens.jet.sh'
-
-srvx1.slurm_cfg = {"account": "lkugler", "partition": "compute",
-                 "ntasks": "1", "ntasks-per-core": "1", "mem": "50G",
-                 "mail-type": "FAIL", "mail-user": "lukas.kugler@univie.ac.at"}
diff --git a/cycled_exp.py b/cycled_exp.py
index 4e30e9930dcba29d7d50f59dbb9857a7aba17ef1..d15b44dbb71ecf55fc739d42ec23562458368944 100755
--- a/cycled_exp.py
+++ b/cycled_exp.py
@@ -6,7 +6,8 @@ submitting jobs into SLURM queue
 import os, sys, shutil, glob, warnings
 import datetime as dt
 
-from dartwrf.utils import script_to_str, symlink, copy, create_job
+from utils import create_job
+from dartwrf.utils import script_to_str, symlink, copy
 from config.cfg import exp, cluster
 
 log_dir = cluster.archivedir+'/logs/'
diff --git a/dartwrf/utils.py b/dartwrf/utils.py
index d4a5560068550891dcb418bad7aedab6a6672e4e..4a2807db7738f57a803c49b6ec1cabf07f06bd42 100755
--- a/dartwrf/utils.py
+++ b/dartwrf/utils.py
@@ -2,77 +2,6 @@ import os, sys, shutil, glob, warnings
 import builtins as __builtin__
 import subprocess
 import datetime as dt
-from slurmpy import Slurm
-from config.cfg import cluster
-
-class ExperimentConfiguration(object):
-    """Collection of variables to use in code later on"""
-    def __init__(self):
-        pass
-
-class ClusterConfig(object):
-    """Collection of variables to use in code later on"""
-    def __init__(self):
-        pass
-
-    @property
-    def archivedir(self):
-        return self.archive_base+'/'+self.expname
-
-    def wrf_rundir(self, iens):
-        return self.wrf_rundir_base+'/'+self.expname+'/'+str(iens)
-
-    @property
-    def scripts_rundir(self):
-        return self.archivedir+'/DART-WRF/'
-
-    @property
-    def dartrundir(self):
-        return self.dart_rundir_base+'/'+self.expname+'/'
-
-class Shellslurm():
-    """Like Slurmpy class, but runs locally"""
-    def __init__(self, *args, **kwargs):
-        pass
-    def run(self, *args, **kwargs):
-        print(args[0])
-        os.system(args[0])
-
-def create_job(*args, cfg_update=dict(), **kwargs):
-    """Shortcut to slurmpy's class; keep certain default kwargs
-    and only update some with kwarg `cfg_update`
-    see https://github.com/brentp/slurmpy
-
-    with_slurm (bool) : if True, use SLURM, else run locally
-
-    """
-    if cluster.use_slurm:
-        return Slurm(*args, slurm_kwargs=dict(cluster.slurm_cfg, **cfg_update), 
-                 log_dir=log_dir, scripts_dir=slurm_scripts_dir, **kwargs)
-    else:
-        return Shellslurm(*args)
-
-def backup_scripts():
-    """Copies scripts and configuration to archive dir output folder"""
-    os.makedirs(cluster.archivedir, exist_ok=True)
-
-    try:
-        shutil.copytree(cluster.scriptsdir, cluster.scripts_rundir)
-    except FileExistsError:
-        pass
-    except:
-        raise
-    try:
-        copy(os.path.basename(__file__), cluster.scripts_rundir+'/')
-    except Exception as e:
-        warnings.warn(str(e))
-
-def prepare_WRFrundir(init_time):
-    """Create WRF/run directories and wrfinput files
-    """
-    cmd = cluster.python+' '+cluster.scripts_rundir+'/prepare_wrfrundir.py '+init_time.strftime('%Y-%m-%d_%H:%M')
-    print(cmd)
-    os.system(cmd)
 
 def shell(args):
     print(args)
@@ -155,4 +84,4 @@ def sed_inplace(filename, pattern, repl):
     shutil.move(tmp_file.name, filename)
 
 def append_file(f_main, f_gets_appended):
-    os.system('cat '+f_gets_appended+' >> '+f_main)
+    os.system('cat '+f_gets_appended+' >> '+f_main)
\ No newline at end of file
diff --git a/dartwrf/utils_workflow.py b/dartwrf/utils_workflow.py
new file mode 100755
index 0000000000000000000000000000000000000000..27bf8c9c96eecf441d1ad8043e66acfb08ee8c19
--- /dev/null
+++ b/dartwrf/utils_workflow.py
@@ -0,0 +1,74 @@
+import os, sys, shutil, glob, warnings
+import subprocess
+copy = shutil.copy
+
+class ExperimentConfiguration(object):
+    """Collection of variables to use in code later on"""
+    def __init__(self):
+        pass
+
+class ClusterConfig(object):
+    """Collection of variables to use in code later on"""
+    def __init__(self):
+        pass
+
+    @property
+    def archivedir(self):
+        return self.archive_base+'/'+self.expname
+
+    def wrf_rundir(self, iens):
+        return self.wrf_rundir_base+'/'+self.expname+'/'+str(iens)
+
+    @property
+    def scripts_rundir(self):
+        return self.archivedir+'/DART-WRF/'
+
+    @property
+    def dartrundir(self):
+        return self.dart_rundir_base+'/'+self.expname+'/'
+
+class Shellslurm():
+    """Like Slurmpy class, but runs locally"""
+    def __init__(self, *args, **kwargs):
+        pass
+    def run(self, *args, **kwargs):
+        print(args[0])
+        os.system(args[0])
+
+
+def create_job(*args, cfg_update=dict(), **kwargs):
+    """Shortcut to slurmpy's class; keep certain default kwargs
+    and only update some with kwarg `cfg_update`
+    see https://github.com/brentp/slurmpy
+
+    with_slurm (bool) : if True, use SLURM, else run locally
+
+    """
+    from config.cfg import cluster
+    if cluster.use_slurm:
+        from slurmpy import Slurm
+        return Slurm(*args, slurm_kwargs=dict(cluster.slurm_cfg, **cfg_update), 
+                 log_dir=log_dir, scripts_dir=slurm_scripts_dir, **kwargs)
+    else:
+        return Shellslurm(*args)
+
+def backup_scripts():
+    """Copies scripts and configuration to archive dir output folder"""
+    from config.cfg import cluster
+    os.makedirs(cluster.archivedir, exist_ok=True)
+
+    try:
+        shutil.copytree(cluster.scriptsdir, cluster.scripts_rundir)
+        shutil.copytree(cluster.scriptsdir+'/../', cluster.scripts_rundir)
+    except FileExistsError:
+        pass
+    except:
+        raise
+
+def prepare_WRFrundir(init_time):
+    """Create WRF/run directories and wrfinput files
+    """
+    from config.cfg import cluster
+    cmd = cluster.python+' '+cluster.scripts_rundir+'/prepare_wrfrundir.py '+init_time.strftime('%Y-%m-%d_%H:%M')
+    print(cmd)
+    os.system(cmd)
\ No newline at end of file
diff --git a/env-minimal.yml b/env-minimal.yml
index 9373100c16b482adc3024f010aaad273f6013cb8..e02578e729020fd7eb937eb801a24e74758006a6 100644
--- a/env-minimal.yml
+++ b/env-minimal.yml
@@ -23,4 +23,4 @@ dependencies:
   - wrf-python
   - xarray
   - yaml
-  - pysolar
+  - pysolar>=0.10.0
diff --git a/generate_free.py b/generate_free.py
index acb1fc0fbc95aa87ac818a239bd4c566ad37f775..0fdb9ed33a0274a9b8e4868a276ffd737188197f 100755
--- a/generate_free.py
+++ b/generate_free.py
@@ -8,7 +8,8 @@ import pandas as pd
 from slurmpy import Slurm
 
 from config.cfg import exp, cluster
-from dartwrf.utils import script_to_str, symlink, backup_scripts
+from utils import backup_scripts
+from dartwrf.utils import script_to_str, symlink
 from cycled_exp import *
 
 log_dir = cluster.archivedir+'/logs/'
diff --git a/setup.py b/setup.py
index 39af8fdd97d8a595917ff699b864074ec7189c48..8d27e0d1e4333860ac5c800b9c2794fe259ba38b 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,7 @@ def read_requirements(fname):
 
 setuptools.setup(
     name="dartwrf",
-    version="2022.11.02",
+    version="2023.1.31",
     author="Lukas Kugler",
     author_email="lukas.kugler@univie.ac.at",
     description="Observing system simulation experiments with WRF and DART",